kotlin 디폴트 파라미터

Caesars·2022년 4월 7일
1

Kotlin

목록 보기
2/2

디폴트 파라미터

위 리스트는 Thread의 8가지 생성자 입니다. 자바에서는 때때로 오버로딩한 메소드가 너무 많아지는 문제가 있습니다. API 사용자에게 편의를 더하는 등의 여러 가지 이유로 오버로딩 메소드는 만들어지지만 결론은 중복이라는 겁니다. Builder Pattern을 쓰면 어느 정도 해소되지만 추가로 작성해야하는 번거로움이 있습니다. 코틀린에서는 함수 선언에서 파라미터의 디폴트 값을 지정함으로서 이런 오버로딩을 피할 수 있습니다. 아래 소스는 디폴트 값을 사용한 예제입니다.
fun <T> joinToStringWithDefault(
    collection: Collection<T>,
    separator: String = ", ",		// ", "으로 디폴트 값 추가
    prefix: String = "",
    postfix: String = ""
){
    val result = StringBuilder(prefix)

    for ((index, element) in collection.withIndex()){
        if(index > 0) result.append(separator)
        result.append(element)
    }

    result.append(postfix)
}

joinToString(list, ", ", "(", ")")
1> (1, 2, 3)

joinToString(list)
2> 1, 2, 3

joinToString(list, "; ")
3> 1; 2; 3

joinToString(list, postfix = "]", prefix = "[")
4> [1, 2, 3]

위와 같이 함수를 호출할 때 모든 인자를 쓸 수도 있고, 일부를 생략할 수도 있습니다. 일반적으로는 함수를 선언할 때와 같은 순서로 인자를 지정하지만 이름을 붙여서 순서와 상관없이 사용할 수도 있습니다.

자바에서 호출

코틀린 함수를 자바에서 호출할때는 그 코틀린 함수가 디폴트 파라미터 값을 제공하더라도 모든 인자를 명시해야 합니다. 그럴때는 모든 인자를 사용하는 함수를 일일이 만들 필요 없이 @ JvmOverloads 애노테이션을 추가하면 됩니다..
@ JvmOverloads을 함수에 추가하면 코틀린 컴파일러가 자동으로 맨 마지막 파라미터로부터 파라미터를 하나씩 생략한 오버로딩한 자바 메소드가 생성됩니다.

@JvmOverloads
fun <T> joinToStringWithDefault(
    collection: Collection<T>,
    separator: String = ", ",		
    prefix: String = "",
    postfix: String = ""
){}
/*java*/
String joinToStringWithDefault(Collection<T> collection, String separator, String prefix, String postfix)
String joinToStringWithDefault(Collection<T> collection, String separator, String prefix)
String joinToStringWithDefault(Collection<T> collection, String separator)
String joinToStringWithDefault(Collection<T> collection

디폴트 파라미터는 js나 c++ 등 몇몇 언어에서 제공하는 걸로 알고 있는데 자바 환경에서도 쓸 수 있었군요. 코틀린은 볼수록 생산성을 증가시키는 요소들이 가득한듯 합니다. 다만 언어에 숙련되기까지가 쉽지 않아 보이네요.

참조

Kotlin In Action 3.2.2 디폴트 파라미터

profile
잊기전에 저장

1개의 댓글

comment-user-thumbnail
2022년 4월 27일

오버로딩을 최소한 할 수 있어 코드 품질 및 생상성 향상에 매우 큰 도움이 되겠네요!

답글 달기