본문 바로가기
Programming/Java

자바 instanceof 연산자

by hyunipad 2021. 1. 8.
반응형

instanceof 연산자


  • 어떤 객체에 대한 is a (상속) 관계를 판별하는 연산자
  • 주로 if문을 사용하여 형 변환이 가능한 지 여부를 판별한다.
  • instanceof의 결과가 true이면 형 변환이 가능하다.

 

instanceof 기본 문법


if ( 레퍼런스 변수명 instanceof 클래스명 ) {}
=> 레퍼런스 변수명 => 클래명으로 다운캐스팅 또는 업캐스팅이 일어난다.

 

if문의 조건식인 '레퍼런스 변수명 instanceof 클래스명' 이 true일 경우에는 레퍼런스 변수명이 클래스명(형 변환할 클래스)으로 업 캐스팅 혹은 다운 캐스팅이 가능합니다.

하지만 다운캐스팅인 경우에는 업 캐스팅이 먼저 발생한 후 다운 캐스팅이 가능한데 instanceof 연산자를 통해 다운 캐스팅이 가능한 지 판별을 하면 상속 관계가 맞는다면 true가 반환된다. 따라서 다운 캐스팅이 가능한 지 판별할 시에는 개발자가 해당 클래스가 먼저 업 캐스팅이 되어있는지 확인을 해야 합니다.

 

주의할 점

  • 다운 캐스팅 시 먼저 업 캐스팅이 일어난 경우에만 가능하다.
  • 다운 캐스팅 시 강제형 변환 명시 필수!!
  • Object 타입은 모든 클래스의 슈퍼클래스임!

 

instanceof 코드 예시

public class Ex {
 
    public static void main(String[] args) {
 
        Bus b = new Bus(50, 200);
        Truck t = new Truck(50, 200);
        Car c = null;
 
        if (b instanceof Car) { // if 안의 조건이 트루이면 형변환이 가능하고 폴스이면 불가능하다 !
            System.out.println("형변환이 가능합니다 !");
            c = b; // 바꾸어질 클래스 타입 = 레퍼런스 변수(바꿀 클래스 타입) => Bus -> Car 타입으로 형변환 된다.(업캐스팅)
 
            c.speedUp(); // 업캐스팅이 일어났기 때문에 참조 범위가 줄어듬 ! 메서드 갯수 4개 => 2개
            c.speedDown();
 
        } else {
            System.out.println("형변환이 불가능합니다 !");
        }
 
        System.out.println("=====================================");
 
        if (c instanceof Bus) {
            System.out.println("형변환이 가능합니다 !");
            b = (Bus) c; // 이미 Bus => Car 로 업캐스팅 후이기 때문에 다운캐스팅 가능 !
                            // 강제 형변환이기 때문에 (Bus) 라고 명시 해줘야 한다.!!!
            b.speedUp(); // Car => Bus 로 다운캐스팅 후이기 때문에 참조 범위가 다시 넓어짐 (2개 => 4개)
            b.speedDown();
            b.ride();
            b.drop();
 
        } else {
            System.out.println("형변환이 불가능합니다 !");
        }
 
        System.out.println("======================================");
 
        if (t instanceof Car) {
 
            System.out.println("형변환이 가능합니다 !");
 
            c = t;
            c.speedUp();
            c.speedDown();
        } else {
            System.out.println("형변환이 불가능합니다 !");
        }
 
        System.out.println("=====================================");
 
        if (c instanceof Truck) {
            System.out.println("형변환이 가능합니다 !");
            t = (Truck) c;
 
            t.speedUp();
            t.speedDown();
            t.dump();
 
        } else {
            System.out.println("형변환이 불가능합니다 !");
        }
    }
}
 
class Car { // 슈퍼클래스
 
    int speed;
    int maxSpeed;
 
    public Car() { // 디폴트 생성자
        super();
    }
 
    public Car(int speed, int maxSpeed) { // 파라미터를 가지고 있는 생성자
        super();
        this.speed = speed;
        this.maxSpeed = maxSpeed;
    }
 
    public void speedUp() { // 슈퍼클래스의 메서드 스피드업
        System.out.println("속력 업 !");
    }
 
    public void speedDown() { // 슈퍼클래스의 메서드 스피드다운
        System.out.println("속력 다운 !");
    }
}
 
class Bus extends Car { // 슈퍼클래스 Car 를 상속 받은 서브클래스 Bus
 
    public Bus(int speed, int maxSpeed) { // 생성자
        super(speed, maxSpeed);
    }
 
    @Override
    public void speedUp() { // 슈퍼클래스의 메서드를 오버라이딩
        super.speedUp();
    }
 
    @Override
    public void speedDown() { // 슈퍼클래스의 메서드를 오버라이딩
        super.speedDown();
    }
 
    public void ride() { // 서브클래스 Bus 자신의 메서드
        System.out.println("손님 승차 !");
    }
 
    public void drop() { // 서브클래스 Bus 자신의 메서드
        System.out.println("손님 하차 !");
    }
}
 
class Truck extends Car {
    
    public Truck(int speed, int maxSpeed) {
        super(speed, maxSpeed);​    
    }
 
    @Override
    public void speedUp() {
        super.speedUp();
    }​
 
    @Override
    public void speedDown() {
        super.speedDown();
    }
 
    public void dump() {
        System.out.println("짐 싣고 내리기 !");
    }
}
반응형

'Programming > Java' 카테고리의 다른 글

[Java] 자바 환경변수 설정하기  (0) 2022.03.16
자바 다형성(Polymorphism)  (1) 2021.01.09
자바 업캐스팅, 다운캐스팅  (0) 2021.01.07
자바 super()  (0) 2021.01.06
자바 상속과 오버라이딩  (0) 2021.01.06

댓글