프로그래밍백엔드 개발자

자바에서 중첩 클래스의 유형(정적 및 비정적)은 어떻게 작동하며 각 경우에 언제 사용하는지, 구현과 관련된 수작업은 무엇인지요?

Hintsage AI 어시스턴트로 면접 통과

답변.

자바에는 네 가지 유형의 중첩 클래스가 있습니다:

  • 정적 중첩 클래스 (static nested class);
  • 내부 클래스 (inner class, non-static);
  • 로컬 클래스 (local class, 메서드 내에 선언됨);
  • 익명 내부 클래스.

Static nested class는 외부 클래스의 비정적 멤버에 직접 접근할 수 없습니다. 별도의 클래스로 컴파일되며, 그 인스턴스는 감춰진 외부 객체에 대한 참조를 저장하지 않습니다.

Inner class (non-static)는 외부 객체에 대한 암묵적인 참조를 가지고 있으며 외부 객체의 필드에 접근할 수 있습니다. 이러한 클래스는 보통 외부 객체의 데이터에 대한 접근을 위한 리스너 또는 반복자를 구현하는 데 사용됩니다.

class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // 외부 필드에 접근 } } int value = 42; }

상태에 접근할 필요가 없는 외부 클래스와 의미적으로 연관된 유틸리티 또는 보조 구조체로서 static nested class를 사용하십시오. 비정적 멤버에 직접 접근해야 할 경우 긴밀한 통합을 위해 inner class를 사용하십시오.

딜레마 질문.

질문: "정적 중첩 클래스가 외부 클래스의 인스턴스의 비정적 필드에 직접 접근할 수 있습니까?"

답변: 아니요, 정적 중첩 클래스는 외부 클래스의 인스턴스의 비정적 필드나 메서드에 직접 접근할 수 없으며, 외부 클래스 객체에 대한 참조를 포함하지도(저장하지도) 않기 때문입니다.

이 주제의 미세한 부분을 알지 못했을 때의 실제 오류 사례.


이야기

데이터 캐싱 라이브러리에서 외부 클래스의 구성 설정에 접근할 수 있을 것이라고 가정하여 static nested class를 사용했습니다. 접근 시도 후 컴파일 오류가 발생했으며, 내부 클래스는 비정적 필드를 볼 수 없었고 아키텍처를 변경해야 했습니다.


이야기

그래픽 애플리케이션의 인터페이스에서 상수에 대해 static nested class 대신 inner class를 사용하여 외부 객체에 대한 불필요한 암묵적 참조가 발생했습니다. 결과적으로 가비지 컬렉터가 메모리를 제대로 정리할 수 없어 메모리 누수가 발생했습니다.


이야기

내부 클래스를 포함하는 컬렉션을 직렬화하는 동안 문제가 발생했습니다. inner class가 부모 객체에 대한 참조를 저장하였고, 직렬화 시 모든 의존성 트리가 직렬화되어 프로세스가 느려지고 결과 크기가 커졌습니다. 이후 static nested class로 변경하자 문제가 해결되었습니다.