C++에도 있는 개념이지만 난 한번도 써보지 않았다..흠냐뤼;
1. 정의
- 클래스 내부에 선언되는 클래스&인터페이스.
- 특정 클래스와 관계를 맺을 경우에는 관계 클래스 안에 선언하는것이 은닉할수도있고, 필드에 쉽게 접근할 수 있기 때문에 도입된 개념.
1. 중첩 클래스
선언 위치에 따른 분류 | 선언 위치 | 설명 | |
멤버 클래스 |
인스턴스 멤버 클래스 |
Class A{ Class B {...} } |
A 객체를 생성해야만 사용할 수 있는 B 중첩 클래스 |
정적 멤버 클래스 |
Class A{ static class B {..} } |
A 클래스로 바로 접근할 수 있는 B 중첩 클래스 |
|
로컬 클래스 |
class A { void method(){ class B {...} } } |
method()가 실행될 때만 사용할 수 있는 B 중첩 클래스 |
- 멤버 클래스도 하나의 클래스로 취급되기 때문에 컴파일 하면 바이트 코드(.class)가 별도로 생성된다.
1-1) 인스턴스 멤버 클래스의 예
public static void main(String[] args)
{
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method();
}
인스턴스 멤버 클래스는 정적 필드, 메소드를 가질 수 없다.
A클래스 외부에서 인스턴스 멤버 클래스 B 객체를 생성하려면
먼저 A 객체를 생성하고 B 객체를 생성해야 한다.
1-2) 정적 멤버 클래스
public static void main(String[] args)
{
A.C c = new A.C();
c.method();
A.C.field2 = 3;
A.C.method2();
}
A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서 A객체를 생성할 필요 없이
바로 생성할 수 있다.
2. 중첩 클래스의 접근 제한
접근 제한 | 인스턴스 멤버 클래스 | 정적 멤버 클래스 |
바깥 클래스의 필드와 메소드에서 사용 제한 |
바깥 클래스의 인스턴스 필드,메소드에서 객체 생성 가능
정적 필드, 메소드에서 객체 생성 QNFRK |
바깥 클래스의 모든 필드, 메소드에서 객체 생성 가능 |
멤버 클래스 내부에서 바깥 클래스의 필드와 메소드의 사용 제한 |
바깥 클래스의 모든 필드, 메소드에 접근 가능 |
바깥 클래스의 정적 필드, 메소드에만 접근 가능 |
3. 로컬 클래스에서 사용 제한
- 로컬 클래스 내부에서는 바깥 클래스의 필드나 메소드를 제한 없이 사용할 수 있다.
- 문제는 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 경우이다.
로컬 클래스의 객체는 메소드 실행이 끝나도 "힙 메모리"에 존재해서 계속 사용할 수 있는데,
매개 변수나 로컬 변수는 메소드가 끝나면 스택 영역에서 사라지기 때문에 크래시가 날 수 있다.
- JAVA는 이를 위해 "컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변수의 값을 로컬 클래스 내부에 복사" 해둔다.
- 그리고 저장한 값이 변화되면 안되니까 매개 변수나 로컬 변수를 "final"로 선언해서 수정을 막는다.
- JAVA7까지는 명시적으로 붙여야 했지만, 8 부터는 안붙여도 final의 특성을 갖는다.
결론은 로컬 클래스에서 사용 가능한 것은 final로 선언된 매개 변수나 로컬 변수 뿐이다.
4. 중첩 클래스에서 바깥 클래스 참조 얻기
- this.method() -> 중첩 객체 참조
- 바깥클래스.this.method(); -> 바깥 객체 참조
1. 중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스
- 주로 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다.
'Deperecated > JAVA' 카테고리의 다른 글
JAVA - 멀티 쓰레드 (0) | 2020.01.17 |
---|---|
JAVA - 주요 API 정리 (0) | 2020.01.16 |
JAVA - 예외 처리 (0) | 2020.01.10 |
JAVA - 익명 구현 객체, 람다식 (0) | 2020.01.09 |
JAVA - 인터페이스 (0) | 2020.01.09 |