IT/Java
[Java] 중첩 클래스(Nested Class)
Huitopia
2024. 3. 12. 22:28
728x90
중첩 클래스(Nested Class)
- 클래스 내부에 선언한 클래스로 클래스 안에 또 다른 클래스가 정의된 것이다.
- 관련 있는 것을 하나로 묶고 싶을 때 사용한다.
- 특정 클래스를 자신의 클래스 내부적인 용도로만 사용하고자 할 때 효율적이다.
- 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.
- 외부에 불 필요한 관계 클래스를 감추어 코드의 복잡성을 줄일 수 있다.
- 클래스의 멤버로 선언되는 중첩 클래스는 멤버 클래스이며, 메소드 내부에 선언되는 중첩 클래스를 로컬 클래스라 한다.
선언 위치에 따른 분류 | 선언 위치 | 객체 생성 조건 | |
멤버 클래스 | 인스턴스 멤버 클래스 | class A { class B {...} } |
A 객체를 생성해야 B 객체를 생성할 수 있다. |
정적 멤버 클래스 | class A { static class B {...} } |
A 객체를 생성하지 않아도 B 객체를 생성할 수 있다. |
|
로컬 클래스 | class A { void method(){ class B {...} } } |
method가 실행할 때만 B 객체를 생성할 수 있다. |
1. 인스턴스 멤버 클래스
[public] class A {
// 인스턴스 멤버 클래스
[public | private]class B { ... }
}
구분 | 접근 범위 |
public class B { } | 다른 패키지에서 B 클래스 사용 가능 |
clss B { } | 같은 패키지에서만 B 클래스 사용 가능 |
private class B { } | A 클래스 내부에서만 B 클래스 사용 가능 |
- 인스턴스 필드와 메소드 선언이 가능하고 정적 필드와 메소드는 Java17부터 선언할 수 있다.
- 인스턴스 멤버 클래스 B는 A 클래스 내부의 인스턴스 필드값, 생성자, 인스턴스 메소드에만 생성 가능하다.
- A 객체가 있어야 B 객체도 생성 가능하며, A 객체를 먼저 생성한 다음 B 객체를 생성한다.
- B 객체를 A 클래스 외부에 생성하려면 default or public 접근 제한을 가진다.
2. 정적 멤버 클래스
[public] class A {
// 정적 멤버 클래스
[public | private] static class B { ... }
}
// B 객체 생성
A.B b = new A.B();
구분 | 접근 범위 |
public static class B { } | 다른 패키지에서 B 클래스 사용 가능 |
static clss B { } | 같은 패키지에서만 B 클래스 사용 가능 |
private static class B { } | A 클래스 내부에서만 B 클래스 사용 가능 |
- static 키워드로 선언된 클래스이다.
- 모든 종류의 필드와 메소드 선언이 가능하다.
- 내부에서 사용되기도 하지만 외부에서 사용될 때는 default or public 접근 제한을 가진다.
- B 객체는 A 클래스 내부 어디든 객체를 생성할 수 있다.
- A 클래스 외부에서 B 객체 생성시, A 객체 생성 없이 A 클래스로 접근해서 B 객체를 생성할 수 있다.
3. 로컬 클래스
[public] class A {
// 생성자
public A(){
class B { } // 로컬 클래스
}
// 메소드
public void method() {
class B { } // 로컬 클래스
}
}
- 메소드 내에 선언된 클래스를 로컬(local) 클래스라 한다.
- 메소드 내부에서만 사용되기에 접근 제한자 및 static을 붙일 수 없다.
- 생성자와 메소드가 실행될 동안에만 객체를 생성한다.
- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언 가능하고, 정적 필드와 정적 메소드는 Java 17부터 선언 가능하다.
- 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.
3-1 로컬 변수
- 생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수
- 로컬 클래스에서 사용할 경우 final 특성을 가져 값 읽기만 가능하고 수정은 불가능하다.
728x90