Joonas' Note
Joonas' Note
Java의 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
'개발 > Java' 카테고리의 다른 글
[JUnit5] Lifecycle 호출 순서 (0) | 2022.07.27 |
---|---|
[Java/JavaDoc] @see, @inheritDoc (0) | 2022.04.15 |
[JAVA] 싱글톤 패턴 (Singleton Pattern) (0) | 2022.04.11 |
Google ARCore Sceneform archived 소식 (2) | 2020.05.30 |
자바에서 내부 클래스의 직렬화(Serialize) (0) | 2018.10.17 |
Comments