다형성 (polymorphism)이란?
- 같은 이름을 사용하지만 구현 내용이 다르거나, 매개변수가 달라서 하나의
이름으로 다양한 기능을 수행할 수 있는 개념이다.
- Static Polymorphism
- 컴파일 타임에서 결정되는 다형성
- 단순하게 보면 메서드 오버로딩을 사용할 때
- Dynamic Polymorphism
- 런타임 다형성
- 동적으로 구성되는 오버라이딩된 메서드를 사용할 때
오버라이딩 (overriding)
- 기능을 완전히 다르게 바꾸어 재설계
- 누르다 -> 행위 -> push()
- push()는 '확인' 혹은 '취소' 용도로 서로 다른 기능을 수행할 수 있다.
오버로딩(overloading)
- 기능은 같지만 인자를 다르게 하여 여러 경우를 처리
- 출력한다 -> 행위 -> print()
- print(123), print("hello") 인자는 다르지만 출력의 기능은 동일함.
메서드 오버라이딩의 예
open class Bird { // open키워드로 상속이 가능하다.
...
fun fly( {...} // 최종 메서드로 오버라이딩 불가 (open이 안붙었기 때문이다.)
open fun sing() {...} // open을 사용했기에 하위 클래스에서 오버라이딩 가능
}
class Lark () : Bird() { // 하위클래스
fun fly() { /* 재정의 */ } // 에러. 상위 메서드에 open키워드가 없기때문
override fun sing() { /* 재정의 */ } // 오버라이딩 가능
파생 클래스에서 오버라이딩을 금지할 때
open class Lark() : Bird () {
final override fun sing() { /* 재정의 */} // 하위클래스에서 재정의 금지
}
- final 키워드를 사용해 추가로 파생되는 클래스에서는 fun sing의 함수를 오버라이딩 할 수 없다.