디폴트 값이 있으면 인자 개수가 가변적이어서 오버로딩 해소가 복잡해질 수 있다. 다음과 같은 정의가 있을 때,
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
이 경우 Number가 Int의 상위 타입이기 때문에 1번 함수가 3번 함수(혹은 3번 함수에서 디폴트를 생략한 경우)보다 덜 구체적인 함수로 간주돼 mul(10, 20)이 세 번째 함수로 해소된다.2