JAVA
JAVA instanceof 연산자
짱코딩러
2022. 7. 18. 21:19
참조변수의 형변환
class Car{}
class FireEngine extends Car{}
Car car = null;
FireEngine fe = new FireEngine();
car = (Car)fe; //참조변수 fe의 주소를 참조변수 car에 복사!
FireEngine fe2 = null;
fe2 = (FireEngine)car; //참조변수 car의 주소를 참조변수 fe2에 복사!
참조변수의 형변환 전에 반드시 instanceof로 확인해야 함.
조상의 리모콘으로 자손을 조종할 수 있음.
자손의 리모콘으로는 조상을 조종할 수 없음.(조상에게 없는 기능을 호출하려 할 수 있기 때문에.)
Q1.참조변수는 왜 형변환 하나요?
A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서.
Q2.intstanceof연산자는 언제 사용하나요?
A.참조변수를 형변환 하기 전에 형변환 가능여부를 확인할 때
A instanceof B = A가 가리키는 객체가 B가 맞아? or B의 자손이야?
=>true/false
void doWork(Car c) { //참조변수에는 다형성에 의해 Car또는 Car의 모든 자손이 들어올 수 있음.
if(c instanceof FireEngine) {
FireEngine fe = (FireEngine)c; //형제관계면 형변환 할 수 없기때문에 만약 Ambulance가 들어와 있으면 형변환 불가능.
fe.water();
...
//(Car c)에 (new Car()) 또는 (new FireEngine()) 또는 (new Ambulance()) 모두 들어올 수 있다.
FireEngine fe = new FireEngine();
System.out.println(fe instanceod Object); //true
System.out.println(fe instanceod Car); //true
System.out.println(fe instanceod FireEngine); //true
//=>자기자신과, 조상들에 대해서는 true가 나옴.(형변환 가능)
예제
public class Ex7_18 {
public static void action(Robot r){
if(r instanceof DanceRobot) { //Robot의 리모콘이 DanceRobot을 조작해도 되나요?
DanceRobot dr = (DanceRobot)r; //true라면, r을 DanceRobot의 리모콘으로 만들어줘
dr.dance(); //그리고! dance() 불러와.
}else if(r instanceof SingRobot) { //Robot의 참조변수가 SingRobot을 참조해도 되나요?
SingRobot sr = (SingRobot)r; //true라면, sr을 r로 형변환해줘.
sr.sing();
}else if(r instanceof DrawRobot) {
DrawRobot dr = (DrawRobot)r;
dr.draw();
}
}
// action메서드의 매개변수가 Robot타입이므로 Robot클래스의 자손 클래스 인스턴스는 모두 매개변수로 가능하다.
public static void main(String[] args) {
Robot[] arr = {new DanceRobot(), new SingRobot(), new DrawRobot()};
for(int i=0; i<arr.length; i++)
action(arr[i]);
}
}
class Robot{}
class DanceRobot extends Robot{
void dance() {
System.out.println("춤을 춥니다.");
}
}
class SingRobot extends Robot{
void sing() {
System.out.println("노래를 합니다.");
}
}
class DrawRobot extends Robot{
void draw() {
System.out.println("그림을 그립니다.");
}
}