동일한 이름의 함수를 파라미터의 개수, 타입 등에 따라 여러 버전으로 정의하는 프로그래밍.
오버로딩의 예는 다음과 같다.
fun sum(a:Int, b:Int):Int = a + b
fun sum(a:Double, b:Double): Double = a + b
fun main(){
println(sum(1,2)) // 3
println(sum(1.0,2.0)) // 3.0
}
같은 이름(sum)을 가진 두 함수가 있다. 그 둘의 차이는 오직 파라미터의 데이터 타입이다.
첫번째 함수는 정수를 파라미터로 받아 그 둘의 합을 리턴하고, 두번째 함수는 Double을 파라미터로 받아 그 둘의 합을 리턴한다.
위의 예시는 파라미터의 데이터 타입이 다른 경우에 적용 가능한 오버로딩이며, 파라미터의 개수가 다른 예시는 다음과 같다.
fun sum(a:Int, b:Int):Int = a + b
fun sum(a:Int, b:Int, c:Int): Int = a + b + c
fun main(){
println(sum(1,2)) // 3
println(sum(1,2,3)) // 6
함수 호출 시 컴파일러의 동작은 다음과 같이 진행된다.
- 파라미터의 개수와 타입을 기준으로 호출할 수 있는 모든 함수를 찾는다.
- 덜 구체적인 함수를 제외한다. (좀 더 specific한 함수를 찾음)
- 하나가 남으면 그 함수를 호출하고, 2개 이상 남으면 에러를 호출한다.