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 디폴트 파라미터
오버로딩을 최소한 할 수 있어 코드 품질 및 생상성 향상에 매우 큰 도움이 되겠네요!