CHAPTER 7. (6) 다형성이란? (참조변수 형변환, 매개변수 다형성, instanceof연산자 포함) ★★
★
- 여러 가지 형태를 가질 수 있는 능력
1. 부모 (클래스) 타입의 참조변수로 자식 (클래스) 타입 인스턴스를 참조 가능
2. 실행하는 메서드는 동일하지만, 부모 타입의 참조 변수에 따라 실제로 조립된 객체의 재정의(오버라이딩)된 내용 실행
: ★ 실행하는 메서드 동일, 실제 조립된 객체에 따라 다른 실행결과 발현됨
- 필수적으로 재정의 필요
- 재정의 관계일 때 가장 바깥의 것이 실행됨
즉, 지금까지는 인스턴스 타입과 일치하는 타입의 참조변수만 사용
ex.
Tv t = new Tv();
CaptionTv c = new CaptionTv();
but 서로 상속 관계일 경우, 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스 참조 가능
ex.
Tv t = new CaptionTv();
실제 인스턴스가 CaptionTv 타입이라도 참조변수 t로는 CaptionTv의 모든 멤버 사용 불가 (t.text, t.caption() 사용 불가)
=> 같은 타입의 인스턴스라도 참조변수 타입에 따라 사용할 수 있는 멤버 개수가 다름
ex.
/*
Iphone 객체 생성 후 해당 객체의 모든 멤버 사용
Iphone p1 = new Iphone();
Galaxy p2 = new Galaxy();
인터넷 기능이 지원되는 SmartPhone류 객체 생성, SmartPhone 타입 변수에 저장
SmartPhone 류들이 지원하는 멤버 사용
SmartPhone p1 = new SmartPhone(); p1.internet();
p1 = new Iphone(); p1.internet();
p1 = new Galaxy(); p1.internet();
사진 촬영이 지원되는 폰류를 객체 생성해서 사진촬영 해보고, 성능 테스트
FeaturePhone p1 = new FeaturePhone(); p1.photo();
p1 = new SmartPhone(); p1.photo();
p1 = new Iphone(); p1.photo();
p1 = new Galaxy(); p1.photo();
// 애플뮤직기능 사용, Iphone류 객체 생성 Iphone, Iphone8, IphoneX, Iphone11
// 지문인식기능 사용, Iphone8류 객체 생성 Iphone8
// 얼굴인식기능 사용, IphoneX류 객체 생성 IphoneX, Iphone11
*/
★
참조변수의 형변환
- 기본형 변수처럼 형변환 가능 (단, 서로 상속관계인 클래스 사이에서만 가능)
= 자식(부모) 타입의 참조변수를 부모(자식) 타입 참조변수로 형변환이 가능하다
ex.
FireEngine f = new FireEngine();
Car c = (FireEngine) f; // 괄호 생략 가능
FireEngine f2 = (FireEngine) c; // 괄호 생략 불가
참조변수 형변환은 그저 리모컨(참조변수)를 다른 종류로 바꾸는 것
이유? 사용 할 수 있는 멤버 개수를 조절하기 위해서
instanceof 연산자
- 주로 조건문에서 사용
- 왼쪽에는 참조변수, 오른쪽에는 타입
- 반환값은 true / false
=> 참조변수가 타입으로 형변환이 가능한가?
/*
instanceof 연산자
참조변수가 참조하는 객체의 실제 타입을 확인하는 연산자
사용법 : 참조변수 instanceof 연산자
연산결과
true : 검사에 사용했던 타입으로 형변환이 가능함
false : 검사에 사용했던 타입으로 형변환 불가능
Iphone p = new Iphone();
// p가 참조하는 객체가 Iphone 타입 객체인가?
p instanceof Iphone --------> true
p instanceof Galaxy --------> false
p instanceof SmartPhone ----> true
p instanceof Phone ---------> true
Iphone p = new Iphone8();
p instanceof Iphone8 -------> true
p instanceof IphoneX -------> false
p instanceof Iphone11 ------> false
p instanceof Galaxy --------> false
p instanceof Iphone --------> true
p instanceof SmartPhone ----> true
*/
★
매개변수의 다형성
void buy (Tv t) 로는 Tv밖에 살 수 없음
Computer 살대는 또 void buy (Computer c) 만들고 ....
제품 수 늘어날 때마다 새로운 buy메서드 추가 필요 (매우 번거로움)
void buy(Product p) 로 다형성 적용
매개변수가 Product 타입 참조변수
=> Product 클래스의 자식 타입 참조변수면 어느 것이나 매개변수로 받을 수 있다
조상타입 참조변수 배열 사용 시, 공통의 조상을 가진 서로 다른 종류 객체를 배열로 묶어서 다룰 수 있음