[Java] 파생 클래스가 아니라.. 딱 내 클래스인가?

뭐.. 제목이 저래.. 라고 생각하시는 분도 분명 계실테고.. 저 역시 뭐 제목이 이래.. 라고 생각하고 있습니다.. 먼저 아래와 같은 클래스 계층이 있다고 칩시다..

사용자 삽입 이미지
Geometry를 부모로 하는 세개의 자식 클래스입니다.. 예를 들어 아래처럼 코딩을 했습니다..

Geometry g = new Rectangle();

이제 이제 g 객체가 Circle이냐.. Rectangle이냐.. 아니면 Triangle이냐.. 아니면.. Geometry이냐를 어떻게 알 수 있을까요? 뭐 이런거야.. 자바에는 편리한 instanceof가 있으니 아래처럼 하면되지라며.. 코딩합니다..

Geometry g = new Rectangle();

if(g instanceof Rectangle) {
    System.out.println("Type is Rectangle");
}

if(g instanceof Circle) {
    System.out.println("Type is Circle");
}

if(g instanceof Triangle) {
    System.out.println("Type is Triangle");
}

if(g instanceof Geometry) {
    System.out.println("Type is Geometry");
}

자바를 잘아신다면.. 어.. 이거 아닌데.. 라고 바로 하실테지만.. 저는 단지.. 그냥 냄새가 좀 나는데.. 는 정도였답니다.. 여튼, 실행해보면 2개의 조건문에서 true를 만나게 됩니다.. 3번 코드의 if 문과 15번 코드의 if 문.. 즉 g는 Rectangle이면서 동시에 Geometry 타입입니다.. 당연한 결과이지요.. 하지만 원하는 것은 딱… “나는 나다!”라는 것이죠.. 즉, 위의 경우에는 g는 Geometry가 아니라 Rectangle다! 라는 것을 판별해야 한다는 것입니다..

자바는 C/C++ 언어가 가지지 못한 강력한 기능이 있습니다.. 실행시간에서의 타입 정보(RTTI)인데요.. 이 RTTI를 위해 자바는 모든 객체에 대해서 자신의 타입에 대한 정보를 담고 있습니다.. 이를 이용해 우리가 원하는 바를 얻을 수 있는 코드는 아래와 같습니다..

Geometry g = new Rectangle();

if(g.getClass() == Rectangle.class) {
    System.out.println("Type is Rectangle");
}

if(g.getClass() == Circle.class) {
    System.out.println("Type is Circle");
}

if(g.getClass() == Triangle.class) {
    System.out.println("Type is Triangle");
}

if(g.getClass() == Geometry.class) {
    System.out.println("Type is Geometry");
}

이제 정확히.. 오직 3번 코드에 대한 if문에서만 true인, “나는 나다!”라는 결과를 얻을 수 있게 됩니다..

“[Java] 파생 클래스가 아니라.. 딱 내 클래스인가?”에 대한 2개의 댓글

    1. else if 문을 쓰면… if 문의 순서를 고민해야 할 문제가 생기겠죠? 뭐 여튼… 이 글은 자바의 getClass라는 매서드가… 개인적으로도 재밌어 한번 정리해본 글이랍니다.. 아시는 분에게는 매우 식상할.. ^^;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다