2013년 8월 21일 수요일

[4주차 3일] instance of 와 getClass()

클래스나 인스턴스를 비교 할때 instance ofgetClass()를 이용해서 비교하는 경우가 종종 있는데 이때 둘의 차이를 알아 보자.

instance of

: Type비교 연산자로 인스턴스의 형태가 포함되어 있으면 true를 리턴한다.



getClass()

: 로딩된 클래스 주소값을 리턴한다.
(클래스 로딩은 한번만 이루어진다.)



instan of 와 getClass()의 차이

예제를 통해서 자세히 알아보자.
아래와 같은 상황이라고 가정해보자.

인터페이스 X 와 Y가 있고,
클래스 A가 있고,
클래스 B는 클래스 A 를 상속 받고 인터페이스 A를 구현했고,
클래스 C는 클래스 B 를 상속 받고 인터페이스 B를 구현했다.



interface X {}
interface Y {}
class A {}
class B extends A implements X {}
class C extends B implements Y {}


이때

ex>
B p = new B();
if (p instanceof A)
System.out.println("p instanceof A");
if (p instanceof B) 
System.out.println("p instanceof B");
if (p instanceof C)
System.out.println("p instanceof C");
if (p instanceof X)
System.out.println("p instanceof X");
if (p instanceof Y)
System.out.println("p instanceof Y");


위의 결과로
p instanceof A
p instanceof B
p instanceof X
출력되는 것을 확인 할수 있다.
이 말은 instance of상속을 받거나 구현을 해서 해당 객체의 형태가 있으면 true를 리턴한다는 것인다.


ex>
B p = new C();
if (p instanceof A)
System.out.println("p instanceof A");
if (p instanceof B) 
System.out.println("p instanceof B");
if (p instanceof C)
System.out.println("p instanceof C");
if (p instanceof X)
System.out.println("p instanceof X");
if (p instanceof Y)
System.out.println("p instanceof Y");

위의 결과로
p instanceof A
p instanceof B
p instanceof C
p instanceof X
p instanceof Y
모두 출력되는 것을 확인 할수 있다.
이 말은 B클래스로 타입으로 선언이 되어 있지만 실제로는 C클래스 객체가 들어가 있기 때문에 C클래스가 포함하는 Y인터페이스, C클래스도 instance of 의 결과가 true인 것이다.


ex>
B p1 = new B();
B p2 = new B();
if (p1.getClass() == p2.getClass()) {
System.out.println("p1.getClass() == p2.getClass()");
}

위의 결과는
p1.getClass() == p2.getClass() 이 출력되는 것을 확인할수 있다.
이것은 인스턴스는 다른 인스턴스이지만, getClass()는 로딩된 클래스의 주소를 가져오는 메서드 이고, 실제 로딩된 클래스는 같은 클래스이기 때문에 p1.getClass() == p2.getClass() 의 결과는 true를 리턴하는 것이다.


ex>
B p1 = new B();
B p2 = new C();
if (p1.getClass() == p2.getClass()) {
System.out.println("p1.getClass() == p2.getClass()");
}

위의 결과는 아무것도 출력되지 않는다.
이것은 B로 선언된 변수에 실제로 담겨있는 클래스가 B와 C로 다르기 때문에 클래스로딩 또한 다른 클래스가 로딩되었기때문에 p1.getClass() == p2.getClass() 는 false를 리턴하는 것이다.

댓글 없음:

댓글 쓰기