다형성의 핵심
- 다형적 참조
- 메서드 오버라이딩
다형적 참조
: 다형적 참조는 부모는 자식을 참조할 수 있다.
다형성과 캐스팅
- 캐스팅: 특정 타입으로 변경하는 것
- 업 캐스팅(upcasting): 부모 타입으로 변경
- 다운 캐스팅(downcasting): 자식 타입으로 변경
캐스팅의 종류
일시적 다운 캐스팅
((Child) poly).childMethod();
참고 - 캐스팅을 한다고 해서 타입이 변하는 것은 아니다. 해당 참조값을 꺼내고 꺼낸 참조값이 캐스팅 타입이 되는 것이다.
업캐스팅
객체를 생성하면 해당 타입의 상위 부모 타입이 모두 생성되기 때문에 업캐스팅하려는 타입이 모두 메모리에 존재하여 안전하다. 따라서 캐스팅을 생략 가능
- A a = new C(): A로 업케스팅
- B b = new B(): B로 업스케팅
- C c = new C(): 자신과 같은 타입
다운 캐스팅
다운 캐스팅의 경우 인스턴스에 존재하지 않는 하위 타입으로 캐스팅하는 문제가 발생할 수 있다.
- A a = new B(): A로 업캐스팅
- B b = new B(): 자신과 같은 타입
- C c = new B(): 하위 타입은 대입할 수 없음, 컴파일 오류
- C c = (C) new B(): 하위 타입으로 강제 다운 캐스팅, 하지만 B 인스턴스에 C와 관련된 부분이 없으므로 잘못된 캐스팅, ClassCastEception 런타임 오류 발생
instanceof() 메서드를 통해
다형성과 메서드 오버라이딩
오버라이딩 된 메서드는 항상 우선권을 가진다. 오버라이딩은 부모 타입에서 정의한 기능을 자식 타입에서 재정의 하는 것이다. 만약 자식에서도 오버라이딩 하고 손자에서도 같은 메서드를 오버라이딩하면 손자의 오버라이딩 메서드가 우선권을 가진다. 더 하위 자식의 오버라이딩 된 메서드가 우선권을 가진다.
- 다형적 참조: 하나의 변수 타입으로 다양한 자식 인스턴스를 참조할 수 있는 기능
- 메서드 오버라이딩: 기존 기능을 하위 타입에서 새로운 기능으로 재정의
출처 - 김영한의 실전 자바 기본편