3.1 코틀린에서 컬렉션 만들기

to

to는 특별한 키워드가 아닌 일반 함수다.

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

joinToString 직접 구현하기

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

    val result = StringBuilder(prefix)

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

fun main() {
    val list = listOf(1,2,3)
    println(joinToString(list, "; ", "(", ")"))
}

// Prints: (1; 2; 3)

함수 호출 시 인자 이름 명시하기

위 joinToString을 호출할 때, 선언부를 보지 않으면 각 파라미터가 무엇을 의미하는지 알기 어렵다. 그래서 아래와 같이 파라미터 이름을 명시할 수 있다.

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

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

default 파라미터 값

함수 선언에서 파라미터의 default 값을 지정해서 오버로드 중 상당수를 피할 수 있다.

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

함수의 디폴트 파라미터 값은 함수를 호출하는 쪽이 아니라 함수 선언 쪽에서 지정된다. 따라서 어떤 클래스 안에 정의된 함수의 디폴트 값을 바꾸고 그 클래스가 포함된 파일을 재컴파일하면 그 함수를 호출하는 코드 중에 값을 지정하지 않은 모든 인자는 자동으로 바뀐 디폴트 값을 적용받는다.

default 값과 자바

자바에는 default 파라미터 값이라는 개념이 없어서 코틀린 함수를 자바에서 호출하는 경우에는 그 코틀린 함수가 디폴트 파라미터 값을 제공하더라도 모든 인자를 명시해야 한다.

@JvmOverloads 를 함수에 추가하면 코틀린 컴파일러가 자동으로 맨 마지막 파라미터로부터 파라미터를 하나씩 생략한 오버로딩한 자바 메소드를 추가해준다.

최상위 함수

함수를 직접 소스 파일의 최상위 수준, 모든 클래스의 밖에 선언할 수 있다.

다른 패키지에서 그 함수를 사용하고 싶을 때는 그 함수가 정의된 패키지를 임포트해야 한다.