더북(TheBook)

디폴트 값이 있으면 인자 개수가 가변적이어서 오버로딩 해소가 복잡해질 수 있다. 다음과 같은 정의가 있을 때,

fun mul(a: Int, b: Int = 1) = a*b              // 1
fun mul(a: Int, b: Long = 1L) = a*b            // 2
fun mul(a: Int, b: Int, c: Int = 1) = a*b*c    // 3

다음 호출을 보자.

mul(10)          // 오류: 1과 2 중에 어느 쪽을 호출할지 결정할 수 없음
mul(10, 20)      // 인자가 더 적기 때문에 1과 3 중에 1을 선택
mul(10, 20, 30)  // 적용 가능한 함수가 3번뿐이므로 3을 선택

인자가 두 개인 mul(10, 20) 호출에 대해서는 3번 함수가 덜 구체적인 함수다. 3번 함수는 세 번째 파라미터로 디폴트 값이 있는 c를 추가해서 인자가 두 개인 함수를 확장한 것이기 때문이다. 하지만 1번 함수 정의를 다음과 같이 바꾸면,

fun mul(a: Number, b: Int = 1) = a*b

이 경우 NumberInt의 상위 타입이기 때문에 1번 함수가 3번 함수(혹은 3번 함수에서 디폴트를 생략한 경우)보다 덜 구체적인 함수로 간주돼 mul(10, 20)이 세 번째 함수로 해소된다.2

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