다형성
하나의 객체가 많은 형(타입)을 가질 수 있는 성질
다형성의 정의
- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.
조상을 파라미터로 처리한다면 객체의 타입에 따라 메서드를 만들 필요가 없어진다.
참조형 객체의 형 변환
- 작은 집(child)에서 큰 집(super)으로 -> 묵시적 캐스팅
byte b = 10;
int i = b;
Phone phone = new Phone();
Object obj = phone;
- 자손 타입의 객체를 조상 타입으로 참조 : 형변환 생략 가능
- 왜냐면 조상의 모든 내용이 자식에 있기 때문에 걱정할 필요가 없다.
- 큰 집(super)에서 작은 집(child)으로 -> 명시적 캐스팅
int i = 10;
byte b = (byte)i;
Phone phone = new SmartPhone();
SmartPhone sPhone = (SmartPhone)phone;
- 조상 타입을 자손 타입으로 참조 : 형변환 생략 불가
이러한 형 변환을 통해서 원하는 기능을 회복시킬 수 있다.
BUT 조상을 무작정 자손으로 바꿀 수는 없다. 즉, 검사를 해야한다.
* 메모리에 없는 객체를 캐스팅할 경우 java.lang.ClasscastException이 발생한다.
- instanceof 연산자
- 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴
Person person = new Person();
if(person instanceof SpiderMan) {
SpiderMan sman = (SpiderMan) person;
}
참조 변수의 레벨에 따른 객체의 멤버 연결
- 상속 관계에서 객체의 멤버 변수가 중복될 때
- 참조 변수의 타입에 따라 연결이 달라짐
- 상속 관계에서 객체의 메서드가 중복될 때 (메서드가 override 되었을 때)
- 무조건 자식 클래스의 메서드가 호출 됨 -> vertual method invocation
- 최대한 메모리에 생성된 실제 객체에 최적화 된 메서드가 동작한다.
'Java' 카테고리의 다른 글
[Java] Collection Framework (0) | 2022.07.26 |
---|---|
[Java] 접근제한자 (0) | 2022.07.22 |
[Java] Singleton 디자인 패턴 (0) | 2022.07.21 |
[Java] 메서드 재정의 (0) | 2022.07.21 |
[Java] 상속 (0) | 2022.07.21 |