12.1 중첩 클래스 (Class inside Class)


1. 캥거루와 아기 캥거루

클래스 안에 또 다른 클래스가 들어있다는 것이 어떤 의미일까요? “캥거루(Outer Class) 뱃속에 있는 아기 캥거루(Inner Class)”를 상상해보세요!

Nested Class Kangaroo

  • 바깥 클래스 (엄마 캥거루): 큰 틀을 제공합니다.
  • 중첩 클래스 (아기 캥거루): 바깥 클래스의 보호를 받으며, 바깥 클래스의 일부로서 살아갑니다.

왜 클래스 안에 클래스를 만들까요?

  1. 긴밀한 관계: 두 클래스가 서로 뗄래야 뗄 수 없는 관계일 때 (예: 자동차와 엔진).
  2. 캡슐화 (숨기기): 바깥 클래스에서만 쓸 거라면, 굳이 외부에 노출시킬 필요 없이 안에 쏙 숨겨두는 게 안전합니다.
  3. 코드 간결성: 불필요한 관계를 줄여 코드가 깔끔해집니다.



2. 중첩 클래스의 종류 (분류도)

중첩 클래스는 “어디에 선언하느냐”“static 키워드가 있느냐”에 따라 크게 4가지로 나뉩니다.

Nested Class Tree

분류 종류 선언 위치 설명 (비유)
멤버 클래스 인스턴스 멤버 클래스 클래스 내부 장기(Organs): 내가 살아있어야 내 심장도 뜁니다. (객체 생성 필수)
  정적(static) 멤버 클래스 클래스 내부 (static) 스마트폰의 유심 슬롯: 폰(객체)이 없어도 설계도(클래스) 상에 존재하는 규격입니다.
로컬 클래스 로컬 클래스 메소드 내부 임시 도구: 특정 작업을 할 때만 잠깐 만들어서 쓰고 버리는 도구입니다.
(특수) 익명 객체 실행문 중간 일회용품: 이름도 안 짓고 딱 한 번만 쓰고 버리는 객체입니다.



3. 바이트코드 파일 ($의 비밀)

중첩 클래스도 엄연한 클래스이므로, 컴파일(javac)을 하면 별도의 .class 파일이 생성됩니다. 하지만 이름 짓는 규칙이 조금 특이합니다.

  • 멤버 클래스: 바깥클래스$멤버클래스.class (예: A$B.class)
  • 로컬 클래스: 바깥클래스$1로컬클래스.class (예: A$1B.class) -> 숫자가 붙는 이유는 같은 이름의 로컬 클래스가 다른 메소드에 또 있을 수 있기 때문입니다.

Note: 개발자가 직접 파일명을 지을 일은 없지만, 나중에 폴더에 생긴 $ 기호가 붙은 파일들을 보고 “아, 이게 중첩 클래스구나!” 하고 알아보면 됩니다.

서브목차