중첩(Nested): 어떤 다른 것이 내부에 위치하거나 포함되는 구조적인 관계 (나의 안에 있지만 내 것이 아닌 것)
내부(Inner): 나의 내부에 있는 나를 구성하는 요소
여기서 의미하는 중첩(Nested)과 내부(Inner)를 분류하는 핵심은 바로 바깥 클래스 입장에서 볼 때 안에 있는 클래스가 나의 인스턴스에 소속이 되는가 되지 않는가의 차이이다
**정리하면 내부 클래스들은 바깥 클래스의 인스턴스에 소속된다. 정적 중첩 클래스는 그렇지 않다.**
[용어 정리]
중첩 클래스: 정적 중첩 클래스 + 내부 클래스 종류 모두 포함
정적 중첩 클래스: 정적 중첩 클래스를 말함
내부 클래스: 내부 클래스, 지역 클래스, 익명 클래스 3가지 종류를 포함해서 말함
+ 지역 변수 캡처
지역 클래스를 통해 생성한 인스턴스가 지역 변수에 접근해야 하는데, 둘의 생명 주기가 다르기 때문에 인스턴스는 살아 있지만, 지역 변수는 이미 제거된 상태일 수 있다. Java는 이런 문제를 해결하기 위해 지역 클래스의 인스턴스를 생성하는 시점에 필요한 지역 변수를 복사해서 생성한 인스턴스에 함께 넣어둔다. 이 과정을 바로 지역 변수 캡처라고 한다.
그런데 캡처한 지역 변수의 값을 변경하면 스택 영역에 존재하는 지역 변수의 값과 인스턴스에 캡처한 캡처 변수의 값이 서로 달라지는 문제가 발생한다.(동기화 문제) 따라서 지역 클래스가 접근하는 지역 변수는 절대로 중간에 값이 변하면 안되기 때문에, final로 선언하거나 사실상 final(effectively final)이어야 한다. 이것은 Java의 문법이자 규칙이다.
※ 사실상 final(effectively final): final 키워드는 없지만 final과 똑같이 한 번 초기화된 후 값이 변경되지 않는 변수
(참고)
실무에서는 중첩, 내부라는 단어를 명확히 구분하지 않고, 중첩 클래스 또는 내부 클래스라고 이야기한다. 왜냐하면 클래스 안에 클래스가 있는 것을 중첩 클래스라고 하기 때문이다. 그리고 내부 클래스도 중첩 클래스의 한 종류이다. 따라서 둘을 명확히 구분하지는 않는다. 엄밀하게 이야기하면 static이 붙어있는 정적 중첩 클래스는 내부 클래스라고 하면 안된다. 하지만 대부분의 개발자들이 둘을 구분해서 말하지 않기 때문에 내부 또는 중첩 클래스라고 하면 상황과 문맥에 따라서 이해하면 된다.
참고 및 출처: 김영한의 실전 자바 - 중급 1편
'Language > Java' 카테고리의 다른 글
[Java] 제네릭은 처음부터 있었던 문법이 아니다(feat. raw type, type eraser) (1) | 2024.09.16 |
---|---|
[Java API] 예외계층구조 핵심 그림 (0) | 2024.09.16 |
[Java API] 날짜와 시간 라이브러리 (3) | 2024.08.27 |
[Java API] enum 주요 메서드 정리 (0) | 2024.08.24 |
[Java API] Math 클래스, Random 클래스 (0) | 2024.08.23 |