코린이의 소소한 공부노트

instanceof 연산자 본문

Java

instanceof 연산자

무지맘 2022. 5. 3. 15:41

참조변수의 형변환은 조상-자손 관계일 때 가능하다. 참조변수의 형변환을 하는 이유는 사용 가능한 멤버의 개수를 조절하기 위해서다. 형변환을 이용한 어떤 기능을 만든다고 할 때, 프로그램 내의 모든 클래스들의 관계를 내가 다 알고 있지 않은 이상 형변환이 가능한지 꼭 확인해 볼 필요가 있다. 그럴 때 이용하는 연산자가 instanceof이다.

 

연산자 치고 이름이 길다. instanceof 연산자

  - 참조변수의 형변환 가능 여부를 확인할 때 사용한다.

  - 피연산자가 2개인 이항 연산자다. -> 객체 instanceof 클래스

  - 형변환이 가능하다면 true를, 불가능하다면 false를 반환한다.

  - 형변환 전에 꼭 사용해보는 것이 좋다.

 

객체와 클래스의 관계에 따라 어떤 반환 결과를 주는지 확인해보자.

Parent 클래스를 상속받은 두 자손 클래스 Child1, Chil2가 있다.

class Parent { }
class Child1 extends Parent { }
class Child2 extends Parent { }

각 클래스의 객체를 하나씩 생성해서 instanceof 연산자의 결과가 어떻게 나오는지 확인해보겠다.

Parent p = new Parent();
Child1 c1 = new Child1();
Child2 c2 = new Child2();
// 1)
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Child1); // false
System.out.println(p instanceof Child2); // false
// 2)
System.out.println(c1 instanceof Parent); // true
System.out.println(c1 instanceof Child1); // true
System.out.println(c1 instanceof Child2); // error
// 3)
System.out.println(c2 instanceof Parent); // true
System.out.println(c2 instanceof Child1); // error
System.out.println(c2 instanceof Child2); // true

1) 객체 p는 Parent 클래스의 객체이므로 첫 번째 연산에서만 true를 반환한다.

  - Child1, Child2는 조상이 아닌 자손 클래스이므로 false를 반환한다.

2) 객체 c1은 Child1 클래스의 객체이므로 첫 번째, 두 번째 연산에서 true를 반환한다.

  - Child2는 Child1과 아무 관계가 없기 때문에 error가 발생한다.

3) 객체 c2은 Child2 클래스의 객체이므로 첫 번째, 세 번째 연산에서 true를 반환한다.

  - Child1는 Child2와 아무 관계가 없기 때문에 error가 발생한다.

 

instanceof 연산자의 연산 결과에 따라 형변환 결과를 알 수 있다.

1. 참조변수가 가리키고 있는 객체의 타입이 클래스의 타입과 같거나 하위 타입(자손 클래스)이면 true를 반환한다.

System.out.println(c2 instanceof Parent);
// 위 코드의 결과가 true이기 때문에
// 아래 형변환이 가능하다.
Parent p2 = (Parent)c2;

2. 조상-자손 관계는 맞으나, 객체의 타입이 클래스의 타입의 상위 타입(조상 클래스)이면 false를 반환한다.

System.out.println(p instanceof Child1);
// 위 코드의 결과가 false이므로
// 아래 형변환이 컴파일 단계에는 에러가 발생하지 않지만
Child1 c = (Child1)p; // java.lang.ClassCastException: class Parent cannot be cast to class Child1
// 사용 가능한 멤버의 개수가 Child1 >= Parent 이므로
// 런타임 에러가 발생함

3. 객체 instanceof Object 의 결과는 무조건 true이다.

  - Object 클래스는 모든 클래스의 조상이기 때문이다.

System.out.println(c2 instanceof Object);
// 위 코드의 결과도 true이기 때문에
// 아래와 같이 형변환이 가능하다.
Object o2 = (Object)c2;

 

 

'Java' 카테고리의 다른 글

추상 클래스, 추상 메서드  (0) 2022.05.05
다형성의 장점  (0) 2022.05.04
참조변수의 형변환  (0) 2022.04.20
다형성  (0) 2022.04.19
접근 제어자를 이용한 캡슐화  (0) 2022.04.18