Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

instanceof 연산자 본문

Java/객체지향

instanceof 연산자

빌드이너프 2023. 6. 12. 14:27

instanceof 연산자

참조변수의 형변환 가능여부 확인에 사용, 가능하면 true반환

형변환 전에 반드시 instanceof로 확인해야 된다

 

코드

class Car {
    String color;
    int door;
    
    void drive() {
        System.out.println("drive");
    }
    
    void stop() {
        System.out.println("stop");
    }
}

class FireEngine extends Car {
    void water() {
        System.out.println("water");
    }
}

 

Car 또는 Car의 모든 자손은 doWork()에 들어갈 수 있다

 

어떤 것이 들어올지 모르는 상태에서 FireEngine이 형변환으로 들어갈 수 없다

만약 Ambulance가 들어왔을때 FireEngine으로 형변환은 형제관계이기 때문에 불가능하다

이때 형변환이 가능한지 확인하기 위해 사용하는 것이 instanceof 연산자이다

 

형변환을 하는 이유는 인스턴스의 원래 기능을 모두 사용하기 위함

Car 타입의 참조변수 c는 water()를 호출할 수 없다, 따라서 FireEngine 타입으로 바꿔서 water()를 호출한다

void doWork(Car c) {
    if(c instanceof FireEngine) { // 1. 형변환이 가능한지 확인, c가 가리키는 객체가 FireEngine인지 확인
        FireEngine fe = (FireEngine)c; // 2. 형변환
        fe.water();
        ...
    else if(c instanceof Ambulance) {
        Ambulance a = (Ambulance)c;
    }
}

 

주의사항

Object(최고조상) <- Car <- FireEngine

instanceof가 true가 나왔다고해서 FireEngine이 가리키는 객체가 Object는 아니다

조상이니까 true가 나온다

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

 

Object obj = (Object)fe; // OK
Car c = (Car)fe; // OK

1. 참조변수의 형변환을 하는 이유?

참조변수(리모컨)을 변경함으로써 사용할 수 있는 멤버의 개수를 조절하기 위함

객체와 참조변수는 변하지 않는다, 참조변수의 타입만 달라진다

 

2. instanceof 연산자 사용시기

참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때 사용한다

'Java > 객체지향' 카테고리의 다른 글

하나의 배열로 여러 종류 객체 다루기(다형성 장점 2)  (0) 2023.06.13
매개변수의 다형성(다형성 장점 1)  (0) 2023.06.13
참조변수의 형변환  (0) 2023.06.12
다형성(polymorphism)  (0) 2023.06.12
캡슐화  (0) 2023.06.09