Java
[JAVA] instanceof 연산자
Hwan'ss
2019. 7. 23. 17:59
instanceof 연산자
- 참조변수가 참조하고 있는 인스턴의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
- 타입을 확인하는 이유는 참조변수가 instanceof로 형 변환이 가능한 타입인지 연산하기 위함이다.
- 주로 조건문에 사용되며, instanceof의 왼쪽에서 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
- 그리고 연산의 결과로 boolean 값인 true, false 중 하나를 반환한다.
- instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것이다. 즉, 형 변환이 가능하다면 true, 불가능 하다면 false를 반환한다.
- 반드시 상속 관계일 경우에 사용한다.
- 자녀객체 instanceof 부모타입 ==> true
- 부모객체 instanceof 자녀타입 ==> false
- 객체 instanceof 객체타입 ==> true
- 이 방식을 사용해서 인수로 받은 인스턴스의 타입을 체크해서 다운캐스팅 등의 작업을 수행 할 수 있게 된다.
- (주의!!) 조건문의 순서는 가장 최하위 클래스 부터 작성해야 한다. 최상위 클래스를 맨 위에 작성한다면 첫 번째 조건문에서 true를 만족하기 때문에 첫 번째 조건만을 수행한다.
import java.util.LinkedList;
interface A {
void func01();
}
class B implements A{
@Override
public void func01() {
System.out.println("B func01 call");
}
void func02() {
System.out.println("B func02 call");
}
}
class C implements A {
@Override
public void func01() {
System.out.println("C func01 call");
}
void func03() {
System.out.println("C func03 call");
}
}
class D {
void func01(LinkedList<A> list) {
System.out.println("D func01 call");
System.out.println("---------------------------1");
for (A item : list) {
item.func01();
}System.out.println("---------------------------2");
// 억지로 B 타입인 것을 알기 때문에 강제로 캐스팅이 가능한 것이다.
((B)list.get(0)).func02(); // 이렇게 해서 func02를 캐스팅해서 사용 할 수 있다.
// 업캐스팅을 사용 할 때 자기 타입을 자기가 찾아가기 위해 사용한다.
// 이렇게 사용한다는 형태 정도는 알아줘야 한다.
// 연기에 온갖 문법이 들어가 있다. 복합적으로 이해하고 넘어가야 된다능....
for (A item : list) {
if (item instanceof B) { // list.get(0)이 B타입입니까?
B b = (B) item;
b.func02();
System.out.println("B 클래스 형 변환 가능");
}System.out.println("---------------------------3");
if (item instanceof C) { // list.get(0)이 C타입입니까?
C c = (C) item;
c.func03();
System.out.println("C 클래스 형 변환 가능");
}System.out.println("---------------------------4");
}System.out.println("---------------------------5");
}
}
// 보통 이렇게 직접 짜기는 않고 남이 짜놓은걸 사용한다. 이런 구조가 있다는 것을 알아두면 좋다.
public class Ex02 {
public static void main(String[] args) {
LinkedList<A> list = new LinkedList<A>();
list.add(new B());
list.add(new C());
list.add(new B());
list.add(new C());
D d = new D(); // D 객체 생성
d.func01(list);
System.out.println("---------------------------6");
A a1 = new B();
// a1.func02(); // 실제로 문법으로는 사용할 수 없지만 메모리에는 존재한다.
((B)a1).func02(); // 메모리에 존재하기 때문에 억지로 캐스팅해서 사용 할 수 있다.
System.out.println("---------------------------7");
}
}
2019.07.22(월) [Test05 project]