정적 내부 클래스(Static Inner Class)는 외부 클래스의 인스턴스 없이도 독립적으로 인스턴스화할 수 있다는 점이 가장 큰 특징입니다. 반면 일반적인 내부 클래스는 중첩 클래스(Nested Class)의 한 종류로, Java에서는 비정적 중첩 클래스(Non-static Nested Class)라고 부릅니다.
내부 클래스는 크게 세 가지 유형으로 나뉩니다.
- 멤버 내부 클래스(Member Inner Class)
- 익명 내부 클래스(Anonymous Inner Class)
- 지역 내부 클래스(Local Inner Class)
리플렉션을 활용한 정적 내부 클래스 인스턴스화
리플렉션(Reflection)을 사용해 정적 내부 클래스를 인스턴스화하려면 InnerClass.class.newInstance() 메서드를 호출하면 됩니다. 정적 내부 클래스는 외부 클래스 객체 없이도 생성할 수 있기 때문에 별도의 전달 인자가 필요하지 않습니다.
반면, 비정적(non-static) 내부 클래스를 인스턴스화하려면 외부 클래스의 인스턴스가 반드시 필요합니다. 이 경우 new 연산자 앞에 외부 클래스의 인스턴스 참조를 지정해 주어야 합니다.
예제 코드
import java.lang.reflect.*;
public class InnerclassWithReflectionTest {
public static void main(String args[]) {
try {
InnerClass inner = (InnerClass) InnerClass.class.newInstance();
inner.test();
} catch(Exception e) {
e.printStackTrace();
}
}
// 정적 내부 클래스
static class InnerClass {
public void test() {
System.out.println("Welcome to TutorialsPoint !!!");
}
}
}
실행 결과
Welcome to TutorialsPoint !!!
참고: newInstance()의 사용 중단(Deprecated)
Class.newInstance() 메서드는 Java 9부터 공식적으로 사용이 중단(deprecated)되었습니다. 이 메서드는 생성자에서 발생한 예외를 원래 형태 그대로 던지지 않고 감싸지 않아 디버깅이 어렵다는 단점이 있기 때문입니다.
따라서 최신 Java 버전에서는 아래와 같이 getDeclaredConstructor().newInstance() 방식을 사용하는 것이 권장됩니다.
InnerClass inner = InnerClass.class.getDeclaredConstructor().newInstance();
이 방식은 생성자에 인자를 전달하거나, private 생성자에 접근할 때 setAccessible(true)를 함께 활용할 수 있어 더욱 유연하고 안전한 리플렉션 처리가 가능합니다.