본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

확장함수(Extension Funtions)

by print_soo 2024. 10. 11.

확장함수

기존 클래스에 새로운 기능을 추가하는 방법이다.

클래스를 수정하지 않고 새로운 메소드를 정의할 수 있게 해준다.

 


 

확장 함수의 기본 문법

fun 클래스명.함수명(파라미터들): 반환타입 {
    // 함수의 본문
}

 

 

 

 

사용 예시

fun main(){
    println("010-1234-5678".extract { it.isDigit() })
}

fun String.extract(cond: (Char) -> Boolean): String {
   val sb = StringBuilder()
   this.forEach { 
       if (cond(it)) sb.append(it)
   }
   return sb.toString()
}

 

cond: (Char) -> Boolean은 문자 하나를 받아서 Boolean 값을 반환하는 함수 타입이다. 따라서 이 매개변수에  it.isDigit()이라는 함수를 전달했고 forEach 구문에서 받은 함수인 isDigit()을 이용해서 문자가 맞으면 sb에 추가하고 아니면 그냥 넘어가도록 설계했다.

 


 

함수 타입의 형식 인자에 기본 값 설정

 

fun main(){
    println("010-1234-5678".extract())
}

fun String.extract(cond: (Char) -> Boolean = {it.isDigit()}): String {
    val sb = StringBuilder()
    this.forEach {
        if (cond(it)) sb.append(it)
    }
    return sb.toString()
}

 

이렇게 인자에 기본 값을 설정해주면 따로 람다식을 설정하지 않는 경우 해당 로직을 통해서 bool 값을 출력해준다.

it.isDigit()에서 it은 인자로 들어오는 char를 말한다.

 

 


 

 

함수 타입의 형식 인자에 null 설정

 

fun main(){
    println("010-1234-5678".extract(null))
}

fun String.extract(cond: ((Char) -> Boolean)? ): String {
    val sb = StringBuilder()
    this.forEach {
        if(cond != null) {
            if (cond(it)) sb.append(it)
        }
        
    }
    return sb.toString()
}

 

이렇게 함수가 넘어오지 않는 경우에 대한 처리도 할 수 있다.

 

 


 

함수가 함수 타입을 반환

 

fun addOrSubtract(flag: Boolean): (Int, Int) -> Int{
    if (flag) {
        return { a, b -> a+b }
    } else {
        return { a, b -> a-b }
    }
}

fun main(){
    println(addOrSubtract(true)(2, 3))
    println(addOrSubtract(false)(2, 3))
}

 

이렇게 bool 값에 따라서 다른 함수를 람다식을 반환해서 하나의 함수안에서 2개의 연산을 할 수 있다.