티스토리 뷰

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]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
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 31
글 보관함