내부 클래스의 종류는 무엇이 있나요?
내부 클래스(Inner Class)는 자바(Java)와 같은 객체지향 프로그래밍 언어에서 하나의 클래스 내부에 정의된 클래스를 의미합니다.
내부 클래스를 사용하면 외부 클래스의 멤버에 쉽게 접근할 수 있고, 논리적으로 관련된 클래스를 그룹화할 수 있으며, 캡슐화와 응집도를 높일 수 있습니다.
내부 클래스의 종류는 크게 다음과 같이 네 가지로 나뉩니다.
1. 멤버 내부 클래스 (Member Inner Class) - 외부 클래스의 멤버 변수처럼 선언된 클래스입니다.
- 외부 클래스의 인스턴스 멤버에 접근 가능하며, 외부 클래스의 인스턴스 없이는 생성할 수 없습니다.
- 생성 방법: 외부클래스명.내부클래스명 인스턴스 = 외부인스턴스.new 내부클래스명(); - 예: ```java public class Outer { class Inner { void method() { System.out.println("멤버 내부 클래스"); } } } ``` 2. 정적 내부 클래스 (Static Nested Class) - `static` 키워드가 붙은 내부 클래스입니다.
- 외부 클래스의 인스턴스 멤버에 바로 접근할 수 없으며, 외부 클래스 이름만으로 생성 가능합니다.
- 외부 클래스의 정적(static) 멤버만 직접 참조 가능합니다.
- 예: ```java public class Outer { static class Nested { void method() { System.out.println("정적 내부 클래스"); } } } ``` 3. 지역 내부 클래스 (Local Inner Class) - 메서드나 생성자 내부에 선언된 클래스입니다.
- 메서드 내에서만 사용 가능하며, 해당 메서드의 로컬 변수(final 또는 effectively final인 변수)에도 접근할 수 있습니다.
- 주로 복잡한 메서드 내에서 일시적인 작업을 위해 사용됩니다.
- 예: ```java public void someMethod() { class LocalInner { void method() { System.out.println("지역 내부 클래스"); } } LocalInner local = new LocalInner(); local.method(); } ``` 4. 익명 내부 클래스 (Anonymous Inner Class) - 이름이 없는 내부 클래스로서, 주로 인터페이스나 추상 클래스의 즉시 구현 객체를 만들 때 사용합니다.
- 정의와 동시에 인스턴스가 생성되며, 재사용이 필요 없을 때 간결하게 사용됩니다.
- 예: ```java Runnable r = new Runnable() { @Override public void run() { System.out.println("익명 내부 클래스"); } }; ``` --- 요약 | 내부 클래스 종류 | 선언 위치 | 외부 클래스 인스턴스 필요 여부 | 특징 | |--------------------|---------------------|--------------------------|-------------------------------------| | 멤버 내부 클래스 | 외부 클래스 멤버 자리 | 필요 | 외부 클래스의 인스턴스 멤버 접근 가능 | | 정적 내부 클래스 | 외부 클래스 멤버 자리 (`static`) | 불필요 | 외부 클래스 이름으로 직접 생성 가능, 정적 멤버 접근 가능 | | 지역 내부 클래스 | 메서드/생성자 내부 | 메서드 실행 중 생성됨 | 메서드 내 로컬 변수 접근 가능, 메서드 내에서만 유효 | | 익명 내부 클래스 | 표현식 내 (주로 메서드 인자) | 불필요 | 이름 없이 즉시 구현하여 객체 생성, 한 번만 사용 가능 | 내부 클래스는 객체지향 설계 시 더 깔끔한 코드 구조를 위해 상황에 맞게 선택하여 사용할 수 있습니다.