12.1 중첩 클래스 (Class inside Class)
1. 캥거루와 아기 캥거루
클래스 안에 또 다른 클래스가 들어있다는 것이 어떤 의미일까요? “캥거루(Outer Class) 뱃속에 있는 아기 캥거루(Inner Class)”를 상상해보세요!
- 바깥 클래스 (엄마 캥거루): 큰 틀을 제공합니다.
- 중첩 클래스 (아기 캥거루): 바깥 클래스의 보호를 받으며, 바깥 클래스의 일부로서 살아갑니다.
왜 클래스 안에 클래스를 만들까요?
- 긴밀한 관계: 두 클래스가 서로 뗄래야 뗄 수 없는 관계일 때 (예: 자동차와 엔진).
- 캡슐화 (숨기기): 바깥 클래스에서만 쓸 거라면, 굳이 외부에 노출시킬 필요 없이 안에 쏙 숨겨두는 게 안전합니다.
- 코드 간결성: 불필요한 관계를 줄여 코드가 깔끔해집니다.
2. 중첩 클래스의 종류 (분류도)
중첩 클래스는 “어디에 선언하느냐”와 “static 키워드가 있느냐”에 따라 크게 4가지로 나뉩니다.
| 분류 | 종류 | 선언 위치 | 설명 (비유) |
|---|---|---|---|
| 멤버 클래스 | 인스턴스 멤버 클래스 | 클래스 내부 | 장기(Organs): 내가 살아있어야 내 심장도 뜁니다. (객체 생성 필수) |
| 정적(static) 멤버 클래스 | 클래스 내부 (static) |
스마트폰의 유심 슬롯: 폰(객체)이 없어도 설계도(클래스) 상에 존재하는 규격입니다. | |
| 로컬 클래스 | 로컬 클래스 | 메소드 내부 | 임시 도구: 특정 작업을 할 때만 잠깐 만들어서 쓰고 버리는 도구입니다. |
| (특수) | 익명 객체 | 실행문 중간 | 일회용품: 이름도 안 짓고 딱 한 번만 쓰고 버리는 객체입니다. |
3. 바이트코드 파일 ($의 비밀)
중첩 클래스도 엄연한 클래스이므로, 컴파일(javac)을 하면 별도의 .class 파일이 생성됩니다.
하지만 이름 짓는 규칙이 조금 특이합니다.
- 멤버 클래스:
바깥클래스$멤버클래스.class(예:A$B.class) - 로컬 클래스:
바깥클래스$1로컬클래스.class(예:A$1B.class) -> 숫자가 붙는 이유는 같은 이름의 로컬 클래스가 다른 메소드에 또 있을 수 있기 때문입니다.
Note: 개발자가 직접 파일명을 지을 일은 없지만, 나중에 폴더에 생긴
$기호가 붙은 파일들을 보고 “아, 이게 중첩 클래스구나!” 하고 알아보면 됩니다.
서브목차