프로그래밍Java 개발자

자바에서 익명 클래스와 중첩 클래스 작업의 주요 특성과 사용 시 문제점에 대해 설명해 주세요.

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

답변.

중첩 클래스는 다른 클래스 내부에 정의된 클래스입니다. 이들은 다음과 같습니다:

  • 정적 중첩 클래스 — 정적 중첩 클래스; 인스턴스 없이 비정적 외부 클래스 멤버에 접근할 수 없습니다.
  • 내부 클래스 — 비정적 중첩 클래스; 외부 클래스의 모든 멤버에 접근할 수 있습니다.
  • 익명 클래스 — 이름이 없는 내부 클래스, 일반적으로 사용되는 위치에서 선언 및 생성되며, 종종 인터페이스/추상 클래스 작업 시 사용됩니다.

익명 클래스 예시:

Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 클릭 시 동작 } });

특징:

  • 익명 클래스는 외부 범위의 final (effectively final) 변수에만 접근할 수 있습니다.
  • 내부 클래스의 각 인스턴스는 암시적으로 외부 클래스의 인스턴스에 대한 참조를 저장합니다.
  • 타입에 따라 (정적/내부) 메모리 누수 또는 예상치 못한 종속성이 발생할 수 있습니다.

헷갈리게 하는 질문.

내부 (비정적) 클래스가 정적 메서드나 변수를 포함할 수 있습니까?

답변: 아닙니다. 상수(static final)를 제외하고는 포함할 수 없습니다. 정적 중첩 클래스만 static 멤버를 가질 수 있습니다.

예시 (오류):

class Outer { class Inner { static int x = 10; // 컴파일 오류! } }

올바른 방법:

class Outer { static class StaticNested { static int x = 10; // OK } }

주제에 대한 세부사항 미숙지로 인한 실제 오류 사례.


이야기

안드로이드 애플리케이션에서 내부 클래스를 이벤트 핸들러로 사용했습니다. 핸들러는 static 필드에 저장되어 Activity에 대한 암시적 참조를 유지하여 Activity가 파괴될 때 메모리 누수가 발생하여 애플리케이션이 "흘러" 나기 시작하고 OutOfMemoryError에 이르렀습니다.


이야기

한 마이크로서비스에서 외부 변수 반복자에 참조되는 익명 클래스를 사용했습니다. 리팩토링 후 변수들이 effectively final이 아니게 되어 코드가 컴파일되지 않게 되었고, 개발자들은 이 제한을 기억해낼 때까지 원인을 오랫동안 찾았습니다.


이야기

라이브러리에서 내부 클래스 내에 정적 변수를 사용하여 일반적인 관행이라고 생각했습니다. 새로운 JDK 버전에서 기준이 더 엄격하게 결정되어 프로젝트가 더 이상 컴파일되지 않았고, 아키텍처를 긴급하게 재작업해야 했습니다.