함수를 호출하기 쉽게 만들기

자바 컬렉션엔는 디폴트 toString 구현이 들어있다.

val list = listOf(1,2,3)
println(list)
=>[1, 2, 3]

하지만 출력 형식은 고정돼 있고 내가 필요한 형식이 아닐 수도 있다. 출력 형식을 바꿔보자.

// 함수의 초기구현
fun <T> joinToString(
   collection: Collection<T>,
   separator: String,
   prefix: String,
   postfix: String
): String {
    val result = StringBuilder(prefix)

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

    result.append(postfix)
    return result.toString()
}
val list = listOf(1,2,3)
println(joinToString(list, ";", "(", ")"))
=>(1; 2; 3)

잘 동작한다. 하지만 함수를 호출 할 때마다 네 인자를 모두 전달하고 있다.

코드의 가독성이 굉장히 떨어져 보이고 어떤 인자가 뭘 뜻하는지 잘 모른다.

코틀린에서는 함수를 호출할 때 전달하는 인자 중 일부의 이름을 명시할 수 있다.

println(joinToString(
        collection = list,
        separator = ";",
        prefix = "(",
        postfix = ")"
      )
)

호출 시 인자 중 어느 하나라도 이름을 명시하고 나면 혼동을 막기 위해 그 뒤에 오는 모든 인자는 이름을 꼭 명시해야 한다!

fun <T> joinToString(
            collection: Collection<T>,
            separator: String = ", ",
            prefix: String = "",
            postfix: String = ""
)

일반 호출 문법을 사용하려면 함수를 선언할 때와 같은 순서로 인자를 지정해야 한다. 그런 경우 일부를 생략하면 뒷부분의 인자들이 생략된다.

이름 붙은 인자를 사용하는 경우에는 인자 목록의 중간에 있는 인자를 생략하고, 지정하고 싶은 인자를 이름을 붙여서 순서와 관계 없이 지정할 수 있다.

println(joinToString(collection = list)) // 디폴트 파라미터 사용
println(joinToString(collection = list, postfix = "kk")) // postfix만 지정