실행시형정보(RTTI)는 프로그램이 실행(Runtime)되는 도중에 객체의 정확한 타입(Class)을 식별할 수 있게 해주는 메커니즘입니다.
Java는 컴파일 시점에 타입을 결정하는 '정적 타입 언어'이지만, 다형성(Polymorphism)을 구현하기 위해 실행 시점에 실제 객체가 무엇인지 확인해야 할 필요가 있습니다. JVM은 클래스 파일(.class)을 로드할 때 해당 클래스의 정보를 담은 java.lang.Class 객체를 생성하며, RTTI는 이 객체를 통해 런타임에 형 정보를 추적하고 검증합니다.
RTTI를 구현하고 활용할 때 사용하는 대표적인 도구들입니다.


RTTI가 작동하는 내부 과정은 다음과 같습니다.
1.클래스 로딩: JVM의 클래스 로더(Class Loader)가 특정 클래스를 처음 사용할 때 바이트코드를 읽어 메소드 영역(Method Area)에 저장합니다.
2.Class 객체 생성: 동시에 이 클래스의 메타데이터를 관리하는 java.lang.Class 타입의 객체가 힙(Heap) 메모리에 단 하나 생성됩니다.
3.인스턴스 연결: 현욱님이 new로 생성한 모든 인스턴스는 힙 메모리 안에서 자신이 어떤 클래스로부터 만들어졌는지 알려주는 '타입 정보 포인트'를 가집니다.
4.타입 확인: instanceof나 getClass()를 호출하면, JVM은 인스턴스가 가리키고 있는 힙 메모리 상의 Class 객체를 찾아가 정보를 대조합니다.
다형성 상황에서 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() 등을 이용해 동적으로 정보를 취득하는 과정은 상대적으로 비용이 듭니다. 반복문 안에서 과도하게 사용하는 것은 피하는 것이 좋습니다.