Java의 instanceof 결과 정리

Joonas' Note

Java의 instanceof 결과 정리 본문

개발/Java

Java의 instanceof 결과 정리

2024. 7. 31. 19:14 joonas 읽는데 2분
  • 클래스와 인터페이스 정의
  • 클래스 간의 instanceof
  • 인터페이스 간의 instanceof
  • 다중 상속 + instanceof

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