더북(TheBook)

3.1.3 오버로딩과 디폴트 값

자바 메서드와 마찬가지로 코틀린 함수도 오버로딩할 수 있다. 이 말은 이름이 같은 함수를 여럿 작성할 수 있다는 뜻이다. 다만 컴파일러가 어떤 함수를 호출해야 할지 구분할 수 있도록 오버로딩한 함수의 파라미터 타입이 모두 달라야 한다. 예를 들어 다음 두 정의는 올바른 오버로딩을 구성한다.

fun readInt() = readLine()!!.toInt()
fun readInt(radix: Int) = readLine()!!.toInt(radix)

하지만 다음 두 함수는 반환값만 다르기 때문에 컴파일 오류가 발생한다.

fun plus(a: String, b: String) = a + b
fun plus(a: String, b: String) = a.toInt() + b.toInt() // error: conflicting overloads: public final fun plus(a: String, b: String): String defined(이하 생략) 

주어진 호출 식에 대해 실제 호출할 함수를 결정할 때 컴파일러는 자바 오버로딩 해소(overloading resolution) 규칙과 비슷한 다음 규칙을 따른다.

1. 파라미터의 개수와 타입을 기준으로 호출할 수 있는 모든 함수를 찾는다.

2. 덜 구체적인 함수를 제외시킨다. 규칙 1에서 선택한 후보 목록에서 어떤 함수의 파라미터 타입이 다른 함수의 파라미터 타입의 상위 타입(supertype)인 경우 이 함수는 다른 함수보다 덜 구체적인 함수다. 덜 구체적인 함수가 모두 제외될 때까지 이 단계를 반복한다.

3. 후보가 하나로 압축되면 이 함수가 호출할 함수다. 후보가 둘 이상이면 컴파일 오류가 발생한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.