클래스 안에 클래스를 중첩해서 정의할 수 있는데, 이것을 중첩 클래스(Nested Class)라 한다.
class Outer {
...
//중첩 클래스
class Nested {
...
}
}
중첩 클래스의 분류

중첩 클래스를 분류하자면
- 정적 중첩 클래스 → 정적 변수와 같은 위치
- static이 붙으며, 바깥 클래스의 인스턴스에 소속되지 않는다.
- 내부 클래스 종류
- static이 붙지 않으며, 바깥 클래스의 인스턴스에 소속된다.
- 내부 클래스 → 인스턴스 변수와 같은 위치
- 지역 클래스 → 지역 변수와 같은 위치
- 익명 클래스 → 지역 클래스의 특별한 버전
class Outer {
...
//정적 중첩 클래스
static class StaticNested {
...
}
//내부 클래스
class Inner {
...
}
public void process() {
//지역 변수
int lcoalVar = 0;
//지역 클래스
class Local {
...
}
Local local = new Local();}
}
- 중첩(Nested): 어떤 다른 것이 내부에 위치하거나 포함되는 구조적인 관계
- 내부(Inner): 나의 내부에 있는 나를 구성하는 요소
중첩 클래스는 언제 사용하는가?
- 내부 클래스를 포함한 모든 중첩 클래스는 특정 클래스가 다른 하나의 클래스 안에서만 사용되거나, 둘이 아주 긴밀하게 연결되어 있는 특별한 경우에만 사용해야 한다. 외부의 여러 클래스가 특정 중첩 클래스를 사용한다면 중첩 클래스로 만들면 안된다.
중첩 클래스를 사용하는 이유
- 논리적 그룹화: 특정 클래스가 다른 하나의 클래스 안에서만 사용되는 경우 해당 클래스 안에 포함하는 것이 논리적으로 더 그룹화 된다. 패키지를 열었을 때 다른 곳에서 사용될 필요가 없는 중첩 클래스가 외부에 노출되지 않는 장점도 있다.
- 캡슐화: 중첩 클래스는 바깥 클래스의
private
멤버에 접근할 수 있다. 이렇게 해서 둘을 긴밀하게 연결하고 불필요한 public
메서드를 제거할 수 있다.