✅ 1. 중첩 클래스(Nested Class) 개요
종류 특징 외부 클래스 인스턴스 필요 여부 주요 사용 목적
정적 중첩 클래스 (Static Nested Class) | static 키워드를 사용하여 정의됨, 외부 클래스의 인스턴스 없이 독립적으로 사용 가능 | ❌ 필요 없음 | 외부 클래스와 관련은 있지만, 독립적인 기능을 수행해야 할 때 |
내부 클래스 (Inner Class) | static이 없는 중첩 클래스, 외부 클래스의 인스턴스 필요 | ✅ 필요함 | 외부 클래스의 인스턴스와 긴밀하게 연관된 작업 수행 |
지역 클래스 (Local Class) | 메서드 내부에서 정의되는 내부 클래스 | ✅ 필요함 | 특정 메서드 내에서만 사용해야 할 때 |
익명 클래스 (Anonymous Class) | 클래스 이름 없이 한 번만 사용될 클래스 정의 및 생성 | ✅ 필요함 | 일회성 사용, 인터페이스 또는 추상 클래스의 간단한 구현 |
✅ 2. 중첩 클래스, 내부 클래스, 익명 클래스의 차이점
특징 정적 중첩 클래스 내부 클래스 지역 클래스 익명 클래스
외부 클래스 인스턴스 필요 여부 | ❌ 필요 없음 | ✅ 필요함 | ✅ 필요함 | ✅ 필요함 |
정의 위치 | 외부 클래스 내부 | 외부 클래스 내부 | 메서드 내부 | 메서드 내부 (선언과 생성 동시에) |
이름 존재 여부 | ✅ 있음 | ✅ 있음 | ✅ 있음 | ❌ 없음 |
사용 목적 | 독립적 기능 수행 | 외부 클래스와 긴밀한 관계 | 특정 메서드 내부에서만 사용 | 인터페이스/추상 클래스 즉시 구현 |
재사용 가능 여부 | ✅ 가능 | ✅ 가능 | ❌ 불가능 (메서드 내에서만 사용) | ❌ 불가능 (일회성) |
✅ 3. 각 클래스의 장점과 단점
📌 1️⃣ 정적 중첩 클래스 (Static Nested Class)
✔ 장점
- 외부 클래스의 인스턴스 없이 독립적으로 사용 가능 → 메모리 절약
- 외부 클래스와 관련이 있지만, 특정 데이터를 공유할 필요 없는 경우 유용
- 외부 클래스의 static 멤버에만 접근 가능 → 명확한 의존성
❌ 단점
- 외부 클래스의 인스턴스 멤버에 접근할 수 없음
- 내부 클래스보다 상대적으로 덜 유연함
📌 예제
class Outer {
static class StaticNested {
void display() {
System.out.println("Static Nested Class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticNested nested = new Outer.StaticNested();
nested.display();
}
}
✅ 외부 클래스의 인스턴스 없이 바로 사용 가능 🚀
📌 2️⃣ 내부 클래스 (Inner Class)
✔ 장점
- 외부 클래스의 인스턴스 멤버에 접근 가능 → 바깥 클래스의 데이터와 강하게 연관된 경우 유용
- 캡슐화 효과 → 내부 구현을 감출 수 있음
❌ 단점
- 외부 클래스의 인스턴스가 필요하므로 메모리 소비 증가
- 코드 가독성이 떨어질 수 있음
📌 예제
class Outer {
private int outerValue = 10;
class Inner {
void display() {
System.out.println("Outer Value: " + outerValue);
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
✅ 외부 클래스의 멤버에 접근 가능! 🚀
📌 3️⃣ 지역 클래스 (Local Class)
✔ 장점
- 특정 메서드 내에서만 사용 → 코드의 응집력 증가
- 외부 클래스의 인스턴스 멤버 및 메서드 지역 변수 접근 가능
❌ 단점
- 지역 변수 캡처: 접근하는 지역 변수는 final 또는 effectively final이어야 함
- 재사용 불가능: 특정 메서드 내에서만 존재
📌 예제
class Outer {
void process() {
class Local {
void display() {
System.out.println("Local Class");
}
}
Local local = new Local();
local.display();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.process();
}
}
✅ 메서드 내에서만 사용 가능하며, 필요할 때만 정의하여 사용 가능! 🚀
📌 4️⃣ 익명 클래스 (Anonymous Class)
✔ 장점
- 코드 간결화 → 한 번만 사용할 클래스를 별도로 정의할 필요 없음
- 인터페이스 및 추상 클래스 즉시 구현 가능
❌ 단점
- 이름이 없으므로 재사용 불가능
- 생성자가 없음 (기본 생성자만 가능)
- 코드가 너무 길어질 경우 가독성이 떨어질 수 있음
📌 예제
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting greeting = new Greeting() { // 익명 클래스
@Override
public void sayHello() {
System.out.println("Hello from Anonymous Class!");
}
};
greeting.sayHello();
}
}
✅ 한 번만 사용할 경우 매우 유용! 🚀
✅ 4. 언제 어떤 중첩 클래스를 사용해야 할까?
사용 상황 추천 중첩 클래스
외부 클래스와 관련 있지만 독립적으로 동작해야 할 때 | 정적 중첩 클래스 (Static Nested Class) |
외부 클래스의 인스턴스 변수와 강하게 연관되어 있을 때 | 내부 클래스 (Inner Class) |
특정 메서드 내에서만 사용될 필요가 있을 때 | 지역 클래스 (Local Class) |
한 번만 사용할 간단한 클래스가 필요할 때 | 익명 클래스 (Anonymous Class) |
🚀 결론
✔ 정적 중첩 클래스: 외부 클래스의 인스턴스 없이 사용 가능 → 독립적 기능
✔ 내부 클래스: 외부 클래스의 인스턴스가 필요 → 강한 연관 관계
✔ 지역 클래스: 특정 메서드 내에서만 사용 → 재사용 불필요한 경우
✔ 익명 클래스: 일회성 구현이 필요할 때 → 코드 간결화
'JAVA' 카테고리의 다른 글
daemon thread (0) | 2025.03.07 |
---|---|
What happens if you call run() instead of thread.start()? (0) | 2025.03.07 |
instance methods & static methods in generic methods (0) | 2025.03.07 |
Generic (0) | 2025.03.07 |
try-with-resources vs try-catch-finally (0) | 2025.03.05 |