Java/JAVA의 정석_객체지향
다형성 - 참조변수의 형변환
Jenny_yoon
2022. 11. 1. 17:32
728x90
반응형
1) 특징
- 사용할 수 있는 멤버의 갯수를 조절 하는 것 (어떻게? 참조변수!리모콘을 바꿔서)
- 조상 자손관계일 때만 형변환 가능
- ex. 예시1
package ch7;
class Car {
String colorString;
int door;
void drive() { //운전하는 기능
System.out.println("drive, Brrrr~"); }
void stop() { //멈추는 기능
System.out.println("stop!!!"); }
}
class FireEngine extends Car{ //소방차
void water() { //물 뿌리는 기능
System.out.println("water!!!"); }
}
public class Ex7_7 {
public static void main(String[] args) {
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water(); //fe의 water호
car = fe; //fe의 값을 car에 넣음. 형변환(car)생략됨.
// car.water(); 오류!! Car타입의 참조변수로 water()를 호출할 수 없음.
fe2 = (FireEngine)car; //car를 fe2에 저장. 형변환 생략불가.
fe2.water();
}
}
더보기
실행결과 :
water!!!
water!!!
- ex. 예시1-2
위 예시에 이어서 메인클래스를 아래와 같이 작성시 에러가 나지 않지만, 실행시 에러발생! 형변환 자체는 문제가 되지않아 컴파일러는 속아서 ok한다. 하지만 fe에는 water가 없어서 water호출 불가능!
즉, 형변환 타입 이외에도 참조변수가 가리키는 실제 인스턴스가 무엇인지 항상 확인!
2) instanceof 연산자
- 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환
- 형변환 전에 반드시 instanceof로 확인해야 함!
- ex. 예시1
void dowork (Car c){ //Car c에는 Car의 자손 모두 가능(Car, FireEngine, Ambulance). 그중에 무엇을 넣어야 하는지 알 수 없어서 instanceof로 확인
if(c instanceof FireEngine){ //1. 형변환이 가능한지 확인
FireEngine fe=(FireEngine)c; //2. 형변환 실행
fe.water();
else if(c instanceof Ambulance)//1. 형변환이 가능한지 확인
Ambulance a = (Ambulance)c; //2. 형변환 실행
...
- ex. 예시2
상속관계가 Object > Car > FireEngine 일때
FireEngine fe = new FireEngine();
System.out.println(fe instanceof Object); //true. 조상
System.out.println(fe instanceof Car); //true. 조상
System.out.println(fe instanceof FireEngine); //true. 본인
본인(FireEngine)타입은 물론, 조상타입(Object, Car)까지 형변환이 가능하다.
728x90
반응형