[기술 면접 질문] 오버로딩 & 오버라이딩
함수 오버로딩(overloading)이란?
- 함수 중복 정의
= 함수 이름은 동일하지만 매개변수 개수/타입이 다른 함수를 만드는 것
- 장점:
사용자 편의성 & 코드 가독성 향상
- 단점:
너무 많은 함수 오버로딩 -> 어떤 오버로드 함수가 호출되었는지 알기 힘들어짐 -> 코드 해석 어려움
- 함수 오버로딩 규칙
- 함수 이름 동일해야
- 매개변수 타입 또는 개수 달라야
- 매개변수 이름은 오버로딩에 영향 X
- 함수의 반환 타입은 오버로딩에 영향 X
(다만, 매개변수 타입과 개수가 동일하고 반환 타입만 다른 함수를 정의해선 X
-> 컴파일러가 어떤 함수를 호출해야 하는지 알 수 없음)
fun calcInt(a:Int, b:Int):Int
fun calcDouble(a:Double, b:Double):Double
fun calcFloat(a:Float, b:Float): Float
fun calcThreeInt(a:Int, b:Int, c:Int)
fun calc(a:Int, b:Int):Int
fun calc(a:Double, b:Double):Double
fun calc(a:Float, b:Float): Float
fun calc(a:Int, b:Int, c:Int):Int
함수 오버라이딩(overriding)이란?
- 함수 재정의
- 상속에서 쓰이는 개념으로, 부모 클래스의 함수를 자식 클래스에서 재정의하여 사용하는 것
- 자식 클래스의 함수에서 부모 클래스의 함수와 다른 동작을 수행하고 싶은 경우 사용
- 부모 클래스 타입의 참조 변수에서 함수를 호출했을 때, 자식 클래스에서 오버라이딩한 함수가 호출됨
open class Guitar(){
open fun play() = println("나는 기타다.")
}
class ElectricGuitar():Guitar(){
override fun play() = println("나는 일렉 기타다~")
}
fun main() {
val guitar: Guitar = ElectricGuitar()
guitar.play()
}