Java Nested - 중첩 및 내부 클래스 개요
중첩 클래스 비유로 표현하면 for문안에 for문 즉 이중 for문처럼 클래스 또한 클래스 안에 클래스가 들어가는 것을 말한다.
for (...) {
// Nested for
for (...) {
}
}
중첩(내부) 클래스는 다음과 같이 표현할 수 있다.
class Outer {
// Nested Class
class Nested {
...
}
}
중첩 클래스는 정의된 위치에 따라 다르다
중첩 클래스 분류
메모리 기준으로 클래스는 종류는 두가지 있으며
중첩 클래스는 4개 분류 할 수 있다.
중첩 클래스
- non-static 중첩 클래스
- inner class
- local class
- anonymous class
- static 중첩 클래스
- static nested class
변수의 선언 위치
- 정적 변수 ( 클래스 변수)
- 인스턴스 변수
- 지역 변수
중첩 클래스를 정의하는 것은 변수의 선언과 같다.
중첩 클래스의 선언 위치
- 정적 중첩 클래스
- 정적 변수 선언의 위치와 같다.
- 내부 클래스
- 인스턴스 변수 선언 위치와 같다
- 지역 클래스
- 지역 변수 선언 위치와 같다.
코드로 보는 클래스 선언
중첩 클래스 4가지 정적 중첩 클래스, 내부 클래스, 지역 클래스, 익명 클래스 각각 코드로 알아보자.
정적 중첩 클래스
class Outer {
// 정적 중첩 클래스
static class StaticNested {
...
}
}
- static 키워드가 붙은게 포인트이다.
내부 클래스
class Outer {
class Inner {
...
}
}
- static 키워드가 없다.
지역 클래스
class Outer {
public void process() {
...
// 지역 변수
int value = 0;
//지역 클래스
class Local {
...
}
Local local = new Local();
}
}
- 지역 클래스는 지역 변수와 같이 코드 블록 안에서 클래스를 정의한다.
- 익명 클래스는 지역 클래스와 위치가 같으나 이름 없는 특별한 버전이다.
코드를 보고 중첩 클래스 종류가 무엇인지 배웠다.
- 정적 중첩 클래스
- 내부 클래스 종류
- 내부 클래스
- 지역 클래스
- 익명 클래스
💡
* 중첩(Nested) 뜻은? 다른 어떤 것이 내부에 위치하거나 포함하는 구조
💡
* 내부(Inner) 뜻은? 나의 내부로 구성되는 요소
중첩 클래스는 나의 클래스에 있지만 본인 것이 아닌 것을 말한다. (static)
이너 클래스는 내부에서 구성 요소로써 존재한다. (non-static)
바깥 클래스 입장에서의 중첩 클래스
중첩 클래스의 핵심은 바깥 클래스가 안에 있는 클래스를 나의 인스턴스로 소속이 될 수 있는가 유무이다.
- 정적 중첩 클래스는 바깥 클래스와 전혀 무관한 클래스다.
- 바깥 클래스의 인스턴스 소속으로 불가능하다.
- 내부 클래스는 바깥 클래스를 구성하는 요소가 된다.
- 바칼 클래스의 인스턴스 소속이 될 수 있다.
중첩, 내부 클래스 요약
정적 중첩 클래스
- static 키워드가 붙은 클래스
- 바깥 클래스의 인스턴스로 할당할 수 없음
내부 클래스
- static 키워드가 붙지 않는 클래스
- 바깥 클래스의 인스턴스로 할당할 수 있음
내부 클래스의 종류
- Inner 클래스
- 바깥 클래스의 인스턴스의 멤버로 접근 가능
- Local 클래스
- 내부 클래스의 특징과 지역 변수로 접근 가능
- Anonymous 클래스
- 지역 클래스의 특징과 클래스 이름이 없는 클래스
용어 정리
- 중첩 클래스: 정적 중첩 클래스와 내부 클래스 종류를 포함한 클래스
- 정적 중첩 클래스: static 키워드가 붙은 클래스
- 내부 클래스: 내부, 지역, 익명 클래스를 포함한 것
💡
실무에서는 명확한 구분 없이 부르고 있음. 상황과 문맥으로 어떤 것이 중첩, 내부 클래스인지 구분함
중첩 클래스 용도
사용처
- 여러 중첩, 내부 클래스가 하나의 클래스에게 긴밀하게 연결되어 있는 경우에 사용
- 단, 여러 외부 클래스가 하나의 중첩, 내부 클래스로 만들지 말 것
사용 이유
- 논리적 그룹화
- 특정 클래스가 하나의 클래스로만 사용하는 경우, 해당 클래스의 포함하는 것으로 그룹화한다.
- 패키지를 열면 다른 곳에서 사용될 이유가 없으므로 외부에 노출되지 않음
- 캡슐화
- 중첩 클래스는 바깥 클래스의 private 멤버로 접근 가능.
- 불필요한 public 메소드 제거로 외부 노출되지 않음
결론
생성한 클래스가 재사용되지 않고 하나의 클래스로만 연결되어 사용되는 경우,
생성한 클래스는 중첩 클래스로 만들어 연결시킬 필요가 있다. (캡슐화 작업)