728x90
반응형
다형성 - polymorphism
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
- 다만 반대의 경우는 불가능 (자손타입이 조상타입 객체를 가리키는 것)
- 참조된 인스턴스 멤버의 개수(조상)가 실제 사용 가능한 개수(자손)보다 적기때문에 오류 발생
아래와 같이 객체와 인스턴스 타입이 불일치함을 다형성을 표현하였다고 함
TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
SmartTV st = new SmartTV();
객체와 인스턴스가 불일치함의 의미는 사용할 수 있는 인스턴스 멤버의 개수가 달라진다고 볼 수 있다.
만약 다형성이 아니라면 (객체와 인스턴스가 일치하면)
- 아래의 코드처럼 TV의 클래스에 들어있는 총 4개의 변수 + SmartTv 클래스의 2개의 변수 = 총 6개를 사용가능
만약 다형성이라면 (객체와 인스턴스가 불일치하면)
- TV의 클래스에 들어있는 총 4개의 변수만 사용가능하고 SmartTv에 들어있는 calltv 메서드는 사용 불가능
TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
SmartTV st = new SmartTV();
st.calltv("hello");
t.calltv //에러
}
}
class SmartTV extends TV{ // 인스턴스 멤버 총 2개
String text;
void calltv(String text){
System.out.println(text);
}
}
class TV{ //인스턴스 멤버 총 4개
int channel;
int volume;
void channelup() {
++channel;
}
void channeldown() {
--channel;
}
}
타입이 불일치할때 가능한 장점 2가지
참조변수의 형변환
사용할 수 있는 멤버의 개수를 조절하는 것
- 기본형변환(float to int, 3.6 -> 3)과 같이 값(주소값 & 객체값)이 변경되는 것이 아닌 멤버의 개수만 달라짐
조상 자손관계의 참조변수는 서로 형변환 가능
- 아래와 같이 st라는 SmartTV를 대변하는 인스턴스를 새로운 TV 클래스에 대입하면 자동 형변환이 됨
- 자동 형변환이 되면서 사용가능한 멤버변수가 6개에서 4개로 조절된다
TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
SmartTV st = new SmartTV();
TV t2 = st; //뜻은 즉 TV t2 = new SmartTV() 자동 형변환이 됨
// 즉 사용가능한 멤버변수의 개수를 6개에서 4개로 줄인말과 같음
조상타입에서 자손타입으로 형변환 시킬 경우
- (SmartTV)를 붙여 형변환을 시켜줘야 오류가 나지 않음 - 사용 가능한 멤버변수가 4개에서 6개로 증가하였기 때문
- 사용 가능한 멤버변수가 증가하면 어떤 멤버를 지칭할지 모르므로 꼭 형변환을 써줘야 작동이 됨
- 멤버변수가 증가하는 형변환은 무조건 형변환 생략불가, 나머지는 형변환 생략가능
TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
SmartTV st = new SmartTV();
TV t2 = st; //뜻은 즉 TV t2 = new SmartTV() 자동 형변환이 됨
// 즉 사용가능한 멤버변수의 개수를 6개에서 4개로 줄인말과 같음
SmartTV st2 = (SmartTV)t;// SmartTV st2 = new TV
// 즉 사용가능한 멤버변수를 4개에서 6개로 늘림, 이 경우는 증가했으므로 (SmartTV)를 붙여줘서 형변환 시켜야 함
결국 참조변수 형변환은 조상과 자손타입의 관계에서만 가능하고 형변환을 하는 행동은 TV의 리모콘을 교체하는 것이라고 이해하면 편함
SmartTV를 TV리모콘으로 이용 or SmartTV리모콘으로 이용
728x90
반응형
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 7장 (16일차) - 추상클래스 abstract class (0) | 2022.02.02 |
---|---|
자바의 정석 7장 (16일차) -instanceof, 다형성 (0) | 2022.02.02 |
자바의 정석 7장 (15일차) - 패키지 & 클래스 패스 (0) | 2022.01.31 |
자바의 정석 7장 (15일차) - 참조변수(super & this) (0) | 2022.01.31 |
자바의 정석 7장 (15일차) - 단일 상속 (single inheritance) & object & 오버라이딩 & 오버로딩 (0) | 2022.01.31 |