Joonas' Note

Joonas' Note

Java의 instanceof 결과 정리 본문

개발/Java

Java의 instanceof 결과 정리

2024. 7. 31. 19:14 joonas

    Java에서 클래스 간의 상속 관계를 확인할 때 instanceof 키워드를 사용하고 있는데, 간혹 사용하게 된다.

    사용 빈도가 낮다보니 오랜만에 사용하면 코드 결과에 확신이 없다.
    분명 맞을텐데 싶으면서도 아닐까 하는 걱정이 생긴다.

    참고로 이 키워드는 인터페이스에도 사용할 수 있다. 그래서 클래스 상속과 인터페이스 구현 케이스를 정리해보았다.

    클래스와 인터페이스 정의

    인터페이스 IA, IB, IC 와 클래스 A, B, C를 아래와 같이 작성했다.

    interface IA {
        void fa();
    }
    
    interface IB {
        void fb();
    }
    
    interface IC {
        void fc();
    }
      
    abstract class A implements IA {
        public A() {}
        
        @Override
        public void fa() {}
    }
      
    class B extends A implements IB {
        public B() {}
        
        @Override
        public void fb() {}
    }
      
    class C extends A implements IC {
        public C() {}
        
        @Override
        public void fc() {}
    }

    클래스 간의 instanceof

    그리고 instanceof 키워드를 아래와 같이 출력해보았다.

    public class Main {
        public void main(String[] args) {
            A b = new B();
            A c = new C();
            System.out.println("// class instance comparison");
            System.out.println("b instanceof A == " + (b instanceof A));
            System.out.println("b instanceof B == " + (b instanceof B));
            System.out.println("b instanceof C == " + (b instanceof C));
            System.out.println("c instanceof A == " + (c instanceof A));
            System.out.println("c instanceof B == " + (c instanceof B));
            System.out.println("c instanceof C == " + (c instanceof C));
        }
    }

    그 결과는 다음과 같다.

    // class instance comparison
    b instanceof A == true
    b instanceof B == true
    b instanceof C == false
    c instanceof A == true
    c instanceof B == false
    c instanceof C == true

    인터페이스 간의 instanceof

    A b = new B();
    A c = new C();
    System.out.println("// interface instance comparison");
    System.out.println("b instanceof IA == " + (b instanceof IA));
    System.out.println("b instanceof IB == " + (b instanceof IB));
    System.out.println("b instanceof IC == " + (b instanceof IC));
    System.out.println("c instanceof IA == " + (c instanceof IA));
    System.out.println("c instanceof IB == " + (c instanceof IB));
    System.out.println("c instanceof IC == " + (c instanceof IC));
    // interface instance comparison
    b instanceof IA == true
    b instanceof IB == true
    b instanceof IC == false
    c instanceof IA == true
    c instanceof IB == false
    c instanceof IC == true

    다중 상속 + instanceof

    부모 클래스 A의 인터페이스 IA를 함께 상속받고, 자신이 추가로 인터페이스 IB, IC 를 구현하는 경우이다.

    즉, 인터페이스 3개 IA, IB, IC 모두의 instance 라고 나와야한다.

    사실 이 구조는 죽음의 다이아몬드(the Deadly Diamond of Death)이다.

    class BC extends A implements IB, IC {
        public BC() {}
    
        @Override
        public void fb() {}
    
        @Override
        public void fc() {}
    }
    A bc = new BC();
    System.out.println("// multiple implements of interface comparison");
    System.out.println("bc instanceof A == " + (bc instanceof A));
    System.out.println("bc instanceof B == " + (bc instanceof B));
    System.out.println("bc instanceof C == " + (bc instanceof C));
    System.out.println("bc instanceof IA == " + (bc instanceof IA));
    System.out.println("bc instanceof IB == " + (bc instanceof IB));
    System.out.println("bc instanceof IC == " + (bc instanceof IC));
    // multiple implements of interface comparison
    bc instanceof A == true
    bc instanceof B == false
    bc instanceof C == false
    bc instanceof IA == true
    bc instanceof IB == true
    bc instanceof IC == true
    Comments