중첩 클래스
중첩클래스란(nested)?
- 클래스 내부에 선언한 클래스를 의미한다.
- 중첩 클래스를 사용하여 외부에 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
- 내부에 선언되는 위치에 따라 멤버 클래스와 로컬 클래스 두가지로 분류된다.
① 인스턴스 멤버 클래스
- static 키워드 없이 중첩 선언된 클래스
- 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
- 바깥클래스 외부에서 인스턴스 멤버 클래스의 객체를 생성하려면 먼저 바깥 클래스의 객체를 생성하고 다음에 인스턴스 멤버 클래스의 객체를 생성할 수 있다.
② 정적 멤버 클래스
- static 키워드로 선언된 클래스
- 바깥클래스 외부에서 정적 멤버 클래스 객체를 생성할 때 바깥클래스 객체를 먼저 생성할 필요 없이 생성이 가능하다.
③ 로컬 클래스
- 메소드 내에 선언된 클래스이다.
- 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문에 접근 제한자 및 static을 붙이지 않는다.
- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고, 정적 필드와 메소드는 선언할 수 없다.
- 로컬 클래스 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
중첩 클래스의 접근 제한
① 바깥 필드와 메소드에서 사용 제한
- 바깥 클래스에서 인스턴스 멤버를 사용할 때 제한이 있다.
- 인스턴스 멤버 클래스는 바깥 클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체를 생성할 수 있으나
- 정적 필드의 초기값이나 정적 메소드에서는 객체를 생성할 수 없다.
- 반면 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있다.
② 멤버 클래스에서 사용 제한
- 인스턴스 멤버 클래스 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근할 수 있지만
- 정적 멤버 클래스 안에서는 바깥 클래스의 정적 필드와 메소드에만 접근할 수 있고 인스턴스 필드와 메소드에는 접근할 수 없다.
③ 로컬 클래스에서 사용 제한
- 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 있다.
- 로컬 클래스의 객체는 메소드의 실행이 종료되면 없어지는 것이 일반적 이지만, 로컬 스레드 객체를 사용할 때는 메소드가 종료되어도 계속 실행 상태로 존재할 수 있다.
- 자바는 이 문제를 해결하기 위해 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 final로 자동 선언한다.
④ 중첩 클래스에서 바깥 클래스 참조 얻기
- 중첩 클래스에서 this키워드를 사용하면 바깥 클래스의 객체 참조가 아니라 중첩 클래스의 객체 참조가 된다.
- 따라서 중첩 클래스 내부에서 바깥 클래스의 필드와 메소드를 접근하기 위해 다음과 같은 형식을 사용한다.
- 바깥클래스.this.필드
- 바깥클래스.this.메소드();
중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스를 의미한다.
- 클래스 내부에 선언되어 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만드는 역할이다.
- 인스턴스 멤버 인터페이스와 정적(static) 멤버 인터페이스 모두 가능하다.
- 주로 정적 멤버 인터페이스를 많이 사용하는데, UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용 된다.
'Coding > Java' 카테고리의 다른 글
[27] JAVA 기초 복습 (0) | 2022.12.14 |
---|---|
[26] JAVA 익명 객체 (Anonymous) (0) | 2022.12.10 |
[24] JAVA 타입 변환과 다형성 (0) | 2022.12.06 |
[23] JAVA 인터페이스 (0) | 2022.12.04 |
[22] JAVA 추상클래스 (0) | 2022.12.03 |