중첩 클래스
클래스 내부에 선언한 클래스
- 두 클래스의 멤버들을 서로 쉽게 접근 가능
- 코드의 복잡성을 줄일 수 있음
멤버 클래스
클래스의 멤버로서 선언되는 중첩 클래스
로컬 클래스
생성자 또는 메소드 내부에서 선언되는 중첩 클래스
- 멤버 클래스는 클래스나 객체가 사용 중이라면 언제든지 재사용이 가능하지만, 로컬 클래스는 메소드를 실행할 때만 사 용되고 메소드가 종료되면 없어진다.
중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트 코드 파일(.class)이 별도로 생성된다.
- 멤버 클래스일 경우
- 로컬 클래스일 경우
인스턴스 멤버 클래스
- static 키워드 없이 중첩 선언된 클래스
- 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언 불가능
정적 멤버 클래스
- static 키워드로 선언된 클래스
- 모든 종류의 필드와 메소드를 선언 가능
- A 클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 다음과 같이 C객체를 생성하면 된다.
로컬 클래스
- 메소드 내에서 선언할 수 있는 중첩 클래스
- 로컬 클래스는 접근 제한자(public, private) 및 static을 붙일 수 없음
- 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문
- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언할 수 없다.
중첩 클래스의 접근 제한
- 바깥 필드와 메소드에서 사용 제한
- 인스턴스 멤버 클래스(B)는 바깥 클래스의 인스턴스 필드(field1)의 초기값이나 인스턴스 메소드(method1())에서 객체를 생성할 수 있으나, 정적 필드 (field3)의 초기값이나 정적 메소드(method2())에서는 객체를 생성할 수 없음
- 정적 멤버 클래스(C)는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있습니다.
- 멤버 클래스에서 사용 제한
- 인스턴스 멤버 클래스(B)안에서는 바깥 클래스의 모든 필드 와 모든 메소드에 접근할 수 있지만, 정적 멤버 클래스(C)안에서는 바깥 클래스의 정적 필드(field2) 와 메소드(method2())에만 접근할 수 있고 인스턴스 필드(field1)와 메소드(method1())에는 접근할 수 없음
- 로클 클래스에서 사용 제한
- 로컬 클래스의 객체는 메소드 실행이 종료되면 없어지는 것이 일반적이지만, 메소드가 종료되어도 계속 실행 상태로 존재 가능
- 중첩 클래스에서 바깥 클래스 참조 얻기
- 중첩 클래스 내부에서 ‘this. 필드, this.메소드()’로 호출하면 중첩 클래스의 필드와 메소드가 사용
- 중첩 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근하기 위해 ‘바깥 클래스.this’를 사용한 예
바깥클래스. this. 필드
바깥클래스. this. 메소드();
중첩 인터페이스
클래스 내부에 선언한 인터페이스
- 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능
- 인스턴스 멤버 인터페이스는 바깥 클래스의 객체가 있어야 사용 가능하며, 정적 멤버 인터페이스는 바깥 클래스의 객체 없이 바깥 클래스만으로 바로 접근가능
[확인 문제]
4. (X) → 정적 멤버 클래스안에서는 바깥 클래스의 정적 필드와 정적 메소드에만 접근이 가능하고
인스턴스 필드와 인스턴스 메소드에는 접근할 수 없다.
3. (X) → 로컬 클래스는 메소드 내부에서만 사용되므로 접근 제한자(public, private) 및 static을 붙일 수 없다.
또한 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
package yeong.exam04;
public class NestedClassExample {
public static void main(String[] args) {
Car myCar = new Car();
Car.Tire tire = myCar.new Tire();
Car.Engine engine = new Car.Engine();
}
}
→ nickName은 final 특성을 갖기 때문에 4라인에서 값을 변경할 수 없다.
수정: 3,4 라인을 없애고 대신 String nickName = chatld;를 넣는다
package yeong.exam05;
public class BackgroundChangeListener implements CheckBox.OnSelectListener {
@Override
public void onSelect() {
System.out.println("배경을 변경합니다.");
}
}
'JAVA' 카테고리의 다른 글
java.lang 패키지 (0) | 2022.11.30 |
---|---|
익명 객체 (0) | 2022.11.15 |
타입 변환과 다형성 (0) | 2022.11.09 |
인터페이스 (0) | 2022.11.09 |
추상 클래스 (0) | 2022.10.31 |