지금까지 일반 클래스나 추상 클래스, 인터페이스를 단독으로 써왔다면 클래스 안의 클래스를 배울 차례.
중첩클래스는 클래스 안에 또다른 클래스가 하나 이상 존재하는 것을 뜻하며, 바깥에 존재하는 클래스를 Outer 클래스,
안 쪽에 존재한 클래스를 Inner 클래스라고 한다.
중첩클래스의 특징
- 중첩 클래스는 하나 이상 존재할 수 있다
- Outer 클래스 멤버를 Inner 클래스에서 사용할 수 있다.( private 멤버도 가능 )
- Outer 클래스에서 Inner 클래스 멤버를 사용할 수 없다.
필드나 메소드 특징에 지역 변수 특징을 섞은 느낌
다만 중첩 클래스 역시 하나의 클래스이기 때문에 컴파일하면 바이트 코드 파일(.class)이 별도로 생성된다. Outer 클래스와 Inner 클래스 사이에 '$' 기호가 붙고, 로컬 클래스의 경우 '$숫자' 가 붙는다.
Outer $ Inner .class //멤버 클래스의 경우
Outer $1 Inner .class //로컬 클래스의 경우
중첩 클래스에는 4대 중첩클래스가 존재한다.
구분 | 설명 |
instance member | Outer 클래스의 멤버변수나 메소드처럼 정의된 경우 |
static memeber | static 키워드를 사용해 정의된 경우 |
local | Outer 클래스의 메소드 내부에서 정의된 경우 |
annonymous | 익명 클래스를 사용해서 정의된 경우 |
1. instance member (인스턴스 멤버 클래스)
가장 일반적인 형태의 중첩 클래스의 형태이다. 클래스의 멤버이자 인스터스화 해야 사용가능하기 때문에 인스턴스 멤버 클래스라고도 한다.
인스턴스 멤버 클래스 특징
- 정적 필드와 정적 메소드를 가질 수 없다.
- Outer 클래스의 객체를 생성해야 사용할 수 있다.
예시
A a = new A(); //Outer 클래스 객체 생성
A.B b = a.new B(); //Inner 클래스 객체 생성
b.field1 //필드 사용
b.method1(); //메소드 사용
2. static memeber (정적 멤버 클래스)
일반적으로 최상위 클래스에는 static을 붙일 수 없다. 하지만 중첩 클래스는 클래스이지만 일종의 클래스 멤버로써 존재하기 때문에 static을 붙일 수 있다.
정적 멤버 클래스 특징
- 일반적인 필드, 메소드뿐만 아니라 static필드와 메소드도 선언가능
- Outer 클래스 객체를 생성할 필요없이 Inner 클래스 객체만 생성하면 된다.
- Outer 클래스 멤버 중 static 멤버만 사용 가능
예시
A.C c = new A.C(); // 정적 멤버 클래스 객체 생성
c.field1 = 3; //인스턴스 필드 사용
c.method1(); //인스턴스 메소드 사용
A.C.field2 = 3; //static 필드 사용
A.C.method2(); //static 메소드 사용
3. Local (로컬 클래스)
메소드 안에서 선언된 클래스이다. 메소드 내부에서 선언된 변수는 메소드 내부에서만 사용할 수 있듯이 로컬 클래스 역시 메소드 내부에서만 사용할 수 있다.
로컬 클래스 특징
- 외부에서 객체를 생성할 수 없다.
- static 멤버를 선언할 수 없다.
- 접근 제한자와 지정 예약어를 사용할 수 없다.
예시
//클래스 멤버 메소드
void method() {
//로컬 클래스 선언
class D {
D() {}
int field1;
void method() {}
}
D d = new D(); //메소드 안에서 객체 생성
d.field1 = 3; //필드 불러오기
d.method1(); //메소드 불러오기
//메소드가 끝나면 객체는 사라진다
}
4. Annonymous (익명 중첩 클래스)
지역 클래스의 변형된 형태이다. 기존 클래스의 메소드를 오버라이딩하여 원하는 형태로 재정의하여 사용한다. 클래스 내부에 기존에 존재하는 클래스의 객체를 생성하여 그 내부에 구현부를 작성하는 형태이다.
로컬 클래스 특징
- 클래스를 상속하거나 인터페이스를 구현해야 생성 가능
- 기존의 중첩 클래스와 달리 이미 존재하는 클래스가 있어야 생성 가능
- 내부 클래스에 생성자를 작성할 수 없다.
- 외부 멤버 중 final만 사용가능
참조자료
이것이 자바다 - 신용권 (한빛미디어)
https://jobjava00.github.io/language/java/basic/nested-class/
[Java] 4대 중첩 클래스(nested class)
Web programmer
jobjava00.github.io
https://gyrfalcon.tistory.com/entry/JAVAJ-Nested-Class
중첩 클래스(Nested Class) [자바 4대 중첩 클래스]
자바 4대 중첩 클래스 1. 중첩 클래스 (Inner Class) □ 정의 - 하나의 클래스 내부에 또 다른 클래스가 내포되어 있는 상태. (클래스 관리의 효율을 높임.) □ 특징 - 중첩되는 클래스는 하나
gyrfalcon.tistory.com
'코딩 > JAVA' 카테고리의 다른 글
<JAVA> Exception (예외처리) - 에러(error)와 예외(Exception) (0) | 2022.07.25 |
---|---|
[펌][Java] 배열(Array) 선언 및 초기화 하기 (0) | 2022.06.15 |
[펌][Java] JVM 구조와 메모리 영역 - Method, Heap, Stack Area (0) | 2022.06.15 |