일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- java
- 자바
- database
- SQL
- Tree
- Class
- 코딩테스트
- Matrix
- Binary Search
- hash table
- Binary Tree
- greedy
- dynamic programming
- Number Theory
- 코테
- sorting
- 파이썬
- two pointers
- geometry
- Data Structure
- Counting
- array
- Stack
- bit manipulation
- Math
- 구현
- implement
- Method
- simulation
- string
- Today
- Total
코린이의 소소한 공부노트
instanceof 연산자 본문
참조변수의 형변환은 조상-자손 관계일 때 가능하다. 참조변수의 형변환을 하는 이유는 사용 가능한 멤버의 개수를 조절하기 위해서다. 형변환을 이용한 어떤 기능을 만든다고 할 때, 프로그램 내의 모든 클래스들의 관계를 내가 다 알고 있지 않은 이상 형변환이 가능한지 꼭 확인해 볼 필요가 있다. 그럴 때 이용하는 연산자가 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 |