다형성을 공부하면서 여러 가지 클래스를 상속하다보면, 슈퍼 클래스인 A 클래스를 참조하는 자식 클래스들의 인스턴스가 어떤 클래스를 참조하고 있는지 확인하고 싶다면, instanceof 키워드를 사용하면 된다.

먼소리임?

쉽게 얘기해서..

//Parent 를 부모클래스, Child를 자식 클래스라고 가정
Parent parent1 = new Parent();
Parent parent2 = new Child();

이때, Parent 는 자기 자신을 참조할 수 있을 뿐만 아니라, 자식 타입의 Child 인스턴스도 참조할 수 있다.

이럴 때, parent1 과 parent2가 참조하는 인스턴스의 타입을 확인하고 싶다면, instanceof 키워드를 사용하면 된다.

 

구체적으로 아래와 같은 코드를 실행한다고 가정하자.

public class ObjectPolyExample1 {

    public static void main(String[] args) {

        Dog dog = new Dog();
        Car car = new Car();

        action(dog);
        action(car);

    }

    private static void action(Object obj) {
        //obj.sound();
        //obj.move(); // 컴파일 오류

        //객체에 맞게 다운캐스팅 필요
        if (obj instanceof Dog dog) {
            dog.sound();
        } else if (obj instanceof Car car) {
            car.move();
        }
    }
}

 

메인 메서드는 객체를 생성하고, action 메서드를 호출하는 코드이므로 설명은 생략한다.

 

우리는 action 메서드를 잘 봐야하는데, action 메서드는 슈슈슈슈슈퍼클래스인 Object 클래스( Object 클래스는 모든 클래스의 최상위 부모 클래스이다 )의 obj 변수를 파라미터로 받는다.

일단 obj는 sound()와 move()를 알수가 없다. -> 왜? 이 두개의 메서드는 자식클래스인 Dog와 Car의 메서드이기 때문.

 if (obj instanceof Dog dog) {
            dog.sound();
        } else if (obj instanceof Car car) {
            car.move();
        }

조건문을 천천히 해석 해보자.

if (obj instanceof Dog dog) // 만약, obj가 Dog 타입의 인스턴스라면

좀더 설명을 해보자면, obj는 모든 타입을 넘겨 받을 수 있기 때문에, 현재 obj에 dog을 넘겨 받았다고 가정하자.

그러면 다음 처럼 해석이 될 것이다.

if (obj(dog) instanceof Dog) // obj는 dog를 넘겨 받았다. 코드 제일 마지막 dog는 잠시 생략

더 쉽게 해석하면, dog 이 Dog 타입의 인스턴스 인가? 라고 해석할 수 있다.

위의 조건문은 참이므로, 원래는 다음과 같은 로직이 발생한다

if (obj instanceof Dog ) {
            Dog dog = (Dog)obj;
            dog.sound();
        }

이 코드도 설명하자면, obj는 현재 Object 타입(최상위 부모 클래스)의 파라미터이기 때문에, 자식클래스인 Dog의 메서드를 사용하기 위해서는 Dog 타입으로 다운 캐스팅을 해줘야한다

 

하지만 위 코드를 보완하여 다운캐스팅 하는 과정을 축약할 수 있다 

if (obj instanceof Dog dog)

이렇게 되면 코드를 한줄 줄이고 바로 다운캐스팅을 실행하여 dog변수에 obj를 넣을 수 있다

 

dog.sound(); // dog.sound() 메서드를 호출한다

다운 캐스팅을 통해 우리는 자식 클래스의 sound() 메서드를 사용할 수 있게 되었다.

 

정리 : 

1. 내가 참조하는 인스턴스가 어떤 타입을 참조하는지 알고싶다 -> instanceof 키워드 사용

2. 상위 클래스에서 하위 클래스의 메서드를 호출하고 싶다 -> 다운캐스팅

 

그럼 오늘도 20000!