반응형
① 다형성
: 다형성이란 조상타입 참조변수로 자손 타입 객체를 다루는 것이다.
class Tv{
boolean power;
int channel;
void power() {power=!power;}
void channelUp() {++channel;}
void channelDown() {--channel;}
}
class SmartTv extends Tv{
String text;
void caption() {//내용생략}
}
Tv t= new Tv(); //Tv인스턴스를 다루기 위한 참조변수 t 사용.
SmartTv stv= new SmartTv(); //SmartTv인스턴스를 다루기 위한 참조변수 stv 사용.
Tv t= new SmartTv(); //타입 불일치! 조상 타입의 참조변수로 자손 인스턴스 참조. 가능!
SmartTv stv= new Tv(); //자손 타입의 참조변수로 조상 인스턴스 참조는 불가능! 에러
→ 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.
→ Tv t= new Tv(); 는 Tv클래스에 있는 인스턴스만 사용 가능하고 SmartTv클래스의 인스턴스는 사용할 수 없다.
Tv t=new SmartTv(); 는 Tv클래스뿐만 아니라 SmartTv클래스의 인스턴스(text, caption())도 사용 가능하다.
② 참조변수의 형변환
: 사용할 수 있는 멤버의 갯수를 조절하는 것이다. (상속 관계의 참조변수는 서로 형변환이 가능하다.)
class Car { }
class FireEngine extends Car { }
class Ambulance extends Car { }
→ FireEngine과 Ambulance는 상속관계가 아니므로 형변환이 불가능하다.
class Ex7_7 {
public static voidd main(String args[]){
Car car=null;
FireEngine fe=new FireEngine();
FireEngine fe2=null;
fe.water();
car=fe; //car={Car)fe;에서 형변환이 생략됨.
// car.water(); car타입의 참조변수로 water()를 호출할 수 없음.
fe2=(FireEngine)car; //조상타입 → 자손타입 형변환 생략 불가.
fe2.water();
}
}
class Car{
String color;
int door;
void drive(){
System.out.println("Brrr");
}
void stop(){
System.out.println("stop");
}
}
class FireEngine extends Car{
void water(){
System.out.println("water");
}
}
FireEngine f= new FireEngine(); //인스턴스 개수: 5개
Car c=(Car)f; //인스턴스 개수: 4개 (생략가능)
FireEngine f2=(FireEngine)c; //인스턴스 개수: 5개 (생략불가)
Ambulance a=(Ambulance)f; //에러, 상속관계가 아닌 클래스 간의 형변환 불가.
→ 인스턴스 개수가 형변환을 함으로써 감소하면 안전하기에 형변환이 생략이 가능하다.
반대로 인스턴스 개수가 형변환을 함으로써 증가하면 안전하지 않기 때문에 형변환을 해줘야 한다.
<내용정리>
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. 아니요.
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이는 무엇인가요?
A. 참조변수로 사용할 수 있는 멤버의 갯수가 달라집니다.
Q. 자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?
A. 아니요.
반응형
'프로그래밍 > Java' 카테고리의 다른 글
Java_객체지향언어(8)_추상 클래스, 추상 메서드 (0) | 2022.11.20 |
---|---|
Java_객체지향언어(7)_instanceof연산자, 매개변수의 다형성, 객체배열 (0) | 2022.11.17 |
Java_객체지향언어(5)_참조변수 super, 생성자 super(), 제어자와 접근제어자 (0) | 2022.11.09 |
Java_객체지향언어(4)_상속, 포함관계, 오버라이딩 (0) | 2022.11.07 |
Java_객체지향언어(3)_static메서드와 인스턴스메서드, 오버로딩, 생성자, 참조변수 this, 생성자 this() (0) | 2022.10.26 |