Jun's Development Journey
[Java/문법] 중첩 클래스와 중첩 인터페이스 본문
1. 중첩 클래스 및 중첩 인터페이스
- 클래스 내부에 선언한 클래스를 말하는데, 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
- 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우엔 관계 클래스를 내부에 선언하는 것이 좋다.
- 클래스 내부에 선언되는 인터페이스를 중첩 인터페이스라고 한다. 인터페이스를 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함이다.
- 중첩 인터페이스는 주로 UI 프로그래밍에서 이벤트 처리 목적으로 많이 활용된다.
1) 중첩 클래스
- 중첩 클래스는 클래스 내부에 선언되는 위치에 따라서 두 가지로 분류된다. 클래스 멤버로서 선언되는 멤버 클래스, 메소드 내부에서 선언되는 로컬 클래스가 있다.
1-1) 인스턴스 멤버 클래스
- 인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언이 가능하고, 정적 필드와 메소드는 선언할 수 없다.
1-2) 정적 멤버 클래스
- 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.
1-3) 로컬 클래스
- 로컬 클래스는 접근 제한자(public, private) 및 static을 붙일 수 없다. 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문이다.
- 인스턴스 필드와 메소드만 선언 가능하고, 정적 필드 및 메소드는 선언할 수 없다.
- 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용된다.
- ex
void method(){
class DownloadThread extends Thread{.....}
DownloadThread thread = new DownloadThread();
thread.start();
}
1-4) 1-1,2,3 예시 코드
1-5) 중첩 클래스의 접근 제한
1-5-1) 바깥 필드와 메소드에서 사용 제한
1-5-2) 멤버 클래스에서 사용 제한
1-5-3) 로컬 클래스에서 사용 제한
- 로컬 클래스 내부에서는 바깥 클래스의 필드나 메소드를 제한 없이 사용 가능하다. 문제는 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때이다.
- 로컬 클래스의 객체는 메소드 실행이 끝나도 힙 메모리 영역에 존재해서 계속 사용될 수 있다. 하지만 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 문제가 된다.
- 자바는 이 문제를 해결하기 위해서 컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변수의 기억 장소를 로컬 클래스 내부에 복사해두고 사용한다.
- 또한 매개 변수나 로컬 변수가 수정되어 기억 장소가 변경되면 로컬 클래스에 복사해둔 기억 장소와 달라지는 문제를 해결하기 위해 매개 변수나 로컬 변수를 final로 선언해서 수정을 막는다. 결론적으로 로컬 클래스에서 사용 가능한 것은 final로 선언된 매개 변수와 로컬 변수 뿐이다.
- final 선언을 하지 않아도 수정 불가한 final 특성을 갖는다. final 키워드 유무의 차이는 로컬 클래스의 복사 위치이다.
final 키워드가 있다면 로컬 클래스의 메소드 내부에 지역 변수로 복사되지만, 없다면 로컬 클래스의 필드로 복사된다.
1-6) 중첩 인터페이스
- 중첩 인터페이스 포함 클래스
- 중첩 인터페이스 구현 객체
- 실행 클래스
'JAVA > 문법' 카테고리의 다른 글
[Java/문법] 인터페이스 (0) | 2022.01.14 |
---|---|
[Java/문법] 스레드 -2 (0) | 2022.01.06 |
[Java/문법] 스레드-1 (0) | 2022.01.04 |
[Java/문법] 입출력(I/O) (0) | 2022.01.04 |
[Java/문법] 클래스 (0) | 2022.01.03 |