- instanceof 연산자: 참조변수의 형변환 가능여부 확인에 사용.
가능하면 true 반환
- 형변환 전에 반드시 instanceof로 확인해야 함
형변환 순서
1. 형변환 해도 되는지 확인. instanceof로
2. 형변환
doWork(new FireEngine());은 아래와 동일하다
Car c = new FireEngine();
doWork(c);
다형성을 이용하면
Car c에 new Car();, new FireEngine();, new Ambulance(); 가 들어올 수 있다.
Car 또는 Car의 모든 자손.
Car c에 셋 중에서 뭐가 들어올지 모르는데 FireEngine fe = (FireEngine)c
FireEngine으로 형변환 할 수 있을까? 못한다.
Car c = new Ambulance();
FireEngine fe = (FireEngine)c; < 불가능
왜냐하면 형변환은 서로 상속관계에 있는 클래스 사이에서만 가능하기 때문에.
new Ambulance()는 형제 관계라서 안된다.
(c instanceof FireEngine)
c가 가리키는 객체가 FireEngine이냐? FireEngine의 자손이냐?
물어보는 것이다.
형변환을 하는 이유는 인스턴스의 원래 기능을 모두 사용하려고.
Car타입의 리모컨인 c로는 water()를 호출할 수 없으니까.
리모컨을 FireEngine타입으로 바꿔서 water()를 호출
fe instanceof Car < fe가 가리키는 객체가 Car냐? 참이다.
fe instanceof FireEngine < fe가 가르키는 객체가 FireEngine이냐? 참이다.
우리 생각에는 FireEngine만 true라고 생각하지만,
FireEngine의 조상에 대해서도 다 true가 나온다.
fe instanceof Car가 참이라고 fe가 가르키는 객체가 Car객체는 아니다.
하지만 조상이니까 참이 나온다.
상속계층도에서 조상들은 다 참이 나온다. + 자신도 참
instanceof가 확인해서 참이면 Object 타입으로 형변환이 가능하다.
fe instanceof Object가 참이라면 FireEngine의 참조변수 fe를
(Object)fe; 로 바꾸는 게 가능하다.
중요한 것
- instanceof로 형변환이 가능한지 확인을 하고 형변환을 해야한다.
(결과가 true가 나오면 형변환 가능)
- instanceof는 자기 조상하고 자기 자신에 대해서 true를 반환한다.
실제 자기 자신은 FireEngine 인스턴스이지만
조상들로 형변환 하는 게 가능하다.
그래서 다 true가 나온다.
Car c = (Car)f; (Car) 참조변수의 형변환
사실 형변환이 하는 일이 없다.
Car c와 FireEngine f의 타입을 일치시키려고 형변환을 한 것이다.
객체 그대로, 참조변수의 값도 그대로다.
바뀌는 것은 참조변수의 타입만 달라진다.
Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모컨)을 변경함으로써 사용할 수 있는 멤버의 개수를
조절하기 위해서
Q. instanceof연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능 여부를 확인할 때
'프로그래밍 언어 > 자바의 정석 기초편' 카테고리의 다른 글
자바의 정석 기초편 ch7-29,30 여러 종류의 객체를 배열로 다루기 (0) | 2022.09.16 |
---|---|
자바의 정석 기초편 ch7-27,28 매개변수 다형성 (0) | 2022.09.05 |
자바의 정석 기초편 ch7-24,25 참조변수의 형변환(2) (0) | 2022.09.03 |
자바의 정석 기초편 ch7-24,25 참조변수의 형변환(1) (0) | 2022.09.03 |
자바의 정석 기초편 ch7-23 다형성 (0) | 2022.09.02 |