[리플렉션] RTTI(Run-Time Type Information)

icehugger·2026년 4월 24일

training

목록 보기
7/8

① 기술적 정의 (Technical Definition)

실행시형정보(RTTI)는 프로그램이 실행(Runtime)되는 도중에 객체의 정확한 타입(Class)을 식별할 수 있게 해주는 메커니즘입니다.

Java는 컴파일 시점에 타입을 결정하는 '정적 타입 언어'이지만, 다형성(Polymorphism)을 구현하기 위해 실행 시점에 실제 객체가 무엇인지 확인해야 할 필요가 있습니다. JVM은 클래스 파일(.class)을 로드할 때 해당 클래스의 정보를 담은 java.lang.Class 객체를 생성하며, RTTI는 이 객체를 통해 런타임에 형 정보를 추적하고 검증합니다.

② 주요 메소드 및 키워드 (API Reference)

RTTI를 구현하고 활용할 때 사용하는 대표적인 도구들입니다.

③ 메모리 및 실행 흐름 (Execution Flow)

RTTI가 작동하는 내부 과정은 다음과 같습니다.

1.클래스 로딩: JVM의 클래스 로더(Class Loader)가 특정 클래스를 처음 사용할 때 바이트코드를 읽어 메소드 영역(Method Area)에 저장합니다.

2.Class 객체 생성: 동시에 이 클래스의 메타데이터를 관리하는 java.lang.Class 타입의 객체가 힙(Heap) 메모리에 단 하나 생성됩니다.

3.인스턴스 연결: 현욱님이 new로 생성한 모든 인스턴스는 힙 메모리 안에서 자신이 어떤 클래스로부터 만들어졌는지 알려주는 '타입 정보 포인트'를 가집니다.

4.타입 확인: instanceof나 getClass()를 호출하면, JVM은 인스턴스가 가리키고 있는 힙 메모리 상의 Class 객체를 찾아가 정보를 대조합니다.

④ 실제 구현 예제 (Implementation Example)

다형성 상황에서 RTTI를 사용하여 안전하게 타입을 확인하고 변환(Casting)하는 예제입니다.

class Employee { }
class Developer extends Employee {
    void writeCode() { System.out.println("코드를 작성합니다."); }
}

public class RTTIExample {
    public static void main(String[] args) {
        Employee emp = new Developer(); // 업캐스팅

        // 1. instanceof를 사용한 타입 검사 (RTTI의 핵심)
        if (emp instanceof Developer) {
            // 2. 안전하게 다운캐스팅
            Developer dev = (Developer) emp;
            dev.writeCode();
        }

        // 3. getClass()를 이용한 정밀 비교
        System.out.println("실제 클래스 명: " + emp.getClass().getName());
        
        if (emp.getClass() == Developer.class) {
            System.out.println("이 객체는 정확히 Developer 타입입니다.");
        }
    }
}

④ 주의사항 및 디버깅 팁

1.ClassCastException: RTTI 검사(instanceof) 없이 무리하게 다운캐스팅을 시도할 경우 런타임에 이 에러가 발생하며 프로그램이 강제 종료됩니다. 반드시 검사 후 캐스팅하는 습관이 중요합니다.

2.상속 관계 주의: instanceof는 해당 클래스뿐만 아니라 부모 클래스나 구현한 인터페이스에 대해서도 true를 반환합니다. 정확히 일치하는 타입만 확인하고 싶다면 getClass() == Target.class 형식을 사용해야 합니다.

3.성능 고려: 단순한 instanceof 연산은 매우 빠르지만, Class.forName() 등을 이용해 동적으로 정보를 취득하는 과정은 상대적으로 비용이 듭니다. 반복문 안에서 과도하게 사용하는 것은 피하는 것이 좋습니다.

0개의 댓글