반응형
1️⃣ 중첩 클래스(Nested Class)란?
자바에서는 클래스 안에 클래스를 정의할 수 있음
이걸 중첩 클래스(nested class)라고 함
종류는 크게 네 가지이다 👇
| 종류 | static 여부 | 외부 클래스 참조 | 주 사용처 |
| 정적 멤버 클래스 | O | X | 독립적인 유틸리티 내부 로직 캡슐화 |
| 비정적 멤버 클래스 | X | O | 외부 인스턴스와 강하게 연결 |
| 로컬 클래스 | X | O | 메서드 내부의 임시 클래스 |
| 익명 클래스 | X | O | 짧은 1회성 구현 |
2️⃣ 비정적 멤버 클래스의 문제점
비정적 멤버 클래스는 무조건 외부 클래스의 인스턴스에 묶여서 존재함
class Outer {
class Inner {
void hello() {
System.out.println("Hello from " + Outer.this);
}
}
}
이때 Inner를 생성하려면 반드시 Outer 인스턴스가 필요함
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
단순히 불편함의 문제는 아님
의도치 않은 참조 유지로 메모리 누수를 유발할 수 있음
3️⃣ 메모리 누수 예시
class EventListener {
void onClick() { /* ... */ }
}
class Button {
class Listener {
void handle() {
System.out.println("Button clicked!");
}
}
private Listener listener = new Listener();
}
이렇게 비정적 내부 클래스를 사용하면,
Listener 인스턴스가 Button 인스턴스를 암묵적으로 참조함
즉, Listener 객체가 살아 있는 동안 Button도 GC되지 못함
4️⃣ static 멤버 클래스로 바꾸면?
class Button {
static class Listener {
void handle() {
System.out.println("Button clicked!");
}
}
private Listener listener = new Listener();
}
이제 Listener는 Button의 인스턴스를 참조하지 않음
단지 Button 내부 네임스페이스에 속한 클래스임
- 불필요한 참조가 사라짐
- 더 명확하고 독립적인 구조가 됨
5️⃣ 실제로 static을 붙이는 기준
내부 클래스가 바깥 클래스의 인스턴스에 접근할 필요가 없다면,
무조건 static으로 선언하라
예를 들어, 아래 둘 중 어떤 것이 static이어야 할까?
class Person {
private String name;
class Address {
String city;
void printOwner() {
System.out.println(name); // 외부 인스턴스 접근
}
}
}
이건 외부 Person의 필드에 접근하므로 비정적 클래스가 맞음
class Person {
static class Address {
String city;
}
}
하지만 Adrress가 Person의 인스턴스에 전혀 의존하지 않는다면
static을 붙이는 것이 맞음
6️⃣ 정적 멤버 클래스의 장점
✅ 명확성 — 외부 인스턴스 의존이 없다는 의도를 분명히 표현
✅ 메모리 누수 방지 — 불필요한 참조 제거
✅ 코드 가독성 향상 — 외부 클래스의 로직과 내부 구조 구분 명확
✅ 캡슐화 강화 — 외부에서 쓸 필요 없는 헬퍼 클래스를 숨기기 좋음
반응형
'Java & Spring Boot' 카테고리의 다른 글
| 🧩 이펙티브 자바 item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2025.10.21 |
|---|---|
| 🧩 이펙티브 자바 item 31. 한정적 와일드카드로 API 유연성을 높이라 (0) | 2025.10.17 |
| ⚙️ 이펙티브 자바 item 13. clone의 재정의는 주의해서 진행하라 (0) | 2025.10.15 |
| Java의 ExecutorService 스레드 풀 정복하기 (0) | 2025.03.30 |
| Java Redis 직렬화 삼총사: Json, String, JDK (1) | 2024.11.10 |