Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

instanceof Operator의 이해. 본문

안드로이드/Java

instanceof Operator의 이해.

설.현.아빠 2011. 3. 23. 13:24

 

 

 

아래 두개의 소스를 보면서 이해를 하자.

 

결과를 보면 왼쪽소스는 Compile Error가 발생할 것이고, 오른쪽은 false가 되어 프린트 되지 않을 것이다.

 

 

class Point { int x, y; }


class Element { int atomicNumber; }


class Test {
        public static void main(String[] args) {
                Point p = new Point();
                Element e = new Element();
                if (e instanceof Point) {       // compile-time error
                        System.out.println("I get your point!");
                }
        }
}

 

 

class Point extends Element{ int x, y; }


class Element { int atomicNumber; }


class Test {
        public static void main(String[] args) {
                Point p = new Point();
                Element e = new Element();
                if (e instanceof Point) {      

                        System.out.println("I get your point!");
                }
        }
}

 

instanceof 연산자를 설명하면..

 

A instanceof B 일 경우 일반적으로 instanceof 연산자는 객체 A가  B 클래스나 인터페이스에 의해서 생성된 객체인지 아닌지를

 

판단해서 참이면 True , 거짓이면 false를 리턴합니다.

 

A(Object) instanceof B(Class, Interface) 형태로 사용합니다.

 

즉 A위치에는 Object가 오구요, B 위치에는 클래스 나 인터페이스가 옵니다.

 

이때 instanceof 연산자는 A Object를 B 클래스나 인터페이스로 캐스팅이 가능한것인지를 확인하는 연산자입니다.

 

따라서 B가 클래스일 경우에는 A 가 반드시 B 클래스와 상속관계에 있어야만 유효하게 됩니다.

 

A와 B가 전혀 상호 상속관계가 없을 경우 캐스팅이 불가능하기에 컴파일 타임에 에러를 발생시킵니다.

 

왜 에러가 나냐면 instanceof 가 upcast 여부를 판단하는 연산자이기에 내부적으로 캐스팅 처리를 해야하기 때문입니다.

 

따라서 아래처럼 Point와 Element 둘이 상속관계가 아닐 경우 아래처럼 코딩하면 당연히 에러가 나죠.

Point p = new Point();
Element e = (Element) p; <--  여기서 캐스팅 불가능하다고 에러납니다.

 

false가 되지 않고 에러가 나는 내부적인 이유는 이와 같이 캐스팅에 대한 컴파일 에러때문이라 할수 있습니다.

 

그런데... 여기서 참고로... 만약 B 가 인터페이스라면 에러가 안납니다.

 

참고로 List 라는 인터페이스가 있을때...

Point p = new Point();
List e = (List) p; <-- 이건 컴파일 타임에 에러가 나지 않습니다. 런타임에 에러가 나죠.

 

즉 Interface에 대한 캐스팅 에러는 컴파일타임에 체크하지 않는다는 것이지요.

 

 

아래 소스를 보면서 이해를 하면 된다.


 

 

'안드로이드 > Java' 카테고리의 다른 글

Java기본 연습문제 & 풀이 (약200문제)  (0) 2011.02.11
JAVA Documentation API 활용편.  (0) 2011.02.11
JAVA 환경 변수 설정  (0) 2011.02.11
Comments