중첩 클래스, 중첩 인터페이스
중첩 클래스
- 클래스 내부에 선언한 클래스
- 특정 클래스와 관계를 맺을 경우 관계 클래스를 내부에 선언하는 것이 좋음
- 두 클래스의 멤버들을 서로 쉽게 접근할 수 있음
- 외부에는 불필요한 관계 클래스를 감춰 코드의 복잡성을 줄일 수 있음
- 선언되는 위치에 따라 분류
- 멤버 클래스 : 클래스의 멤버로서 선언. 클래스나 객체가 사용 중이라면 언제든 재사용 가능
- 로컬 클래스 : 메소드 내부에 선언되는 중첩 클래스. 로컬 클래스는 메소드 실행 시에만 사용되고, 메소드가 종료되면 없어짐
인스턴스 멤버 클래스
- static 키워드 없이 선언된 클래스
- 인스턴스 필드와 메소드만 선언 가능. 정적 필드와 메소드 선언 불가
정적 멤버 클래스
- static 키워드로 선언된 클래스
- 모든 종류의 필드와 메소드를 선언할 수 있음
로컬 클래스
- 메소드 내에서 선언한 중첩 클래스
- 접근 제한자(pubic, private), static 붙일 수 없음 ⇒ 메소드 내부에서만 사용되므로 접근을 제한할 필요 없음
- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언 가능, 정적 필드와 메소드 선언 불가
- 메소드가 실행될 때 메소드 내에서 객체 생성하고 사용
- 비동기 처리를 위한 스레드 객체 만들 때 사용
중첩 클래스의 접근 제한
- 멤버 클래스가 인스턴스 또는 정적으로 선언됨에 따라 바깥 클래스의 필드와 메소드에 사용 제한이 생김
바깥 필드와 메소드에서 사용 제한
- 인스턴스 멤버 클래스는 바깥 클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체 생성할 수 있음
- 정적 필드의 초기값이나 정적 메소드에서는 객체 생성 불가
- 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체 생성 가능
멤버 클래스에서 사용 제한
- 인스턴스 멤버 클래스 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근 가능
- 정적 멤버 클래스 안에서는 바깥 클래스의 정적 필드와 메소드에만 접근, 인스턴스 필드와 메소드는 접근할 수 없음
로컬 클래스에서 사용 제한
- 내부에서는 바깥 클래스의 필드나 메소드를 제한 없이 사용
- 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때
- 로컬 클래스의 객체는 메소드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있음
- 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 로컬 객체에서 사용할 경우 문제 발생
- 컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변수의 값을 로컬 클래스 내부에 복사해 두고 사용
- 매개 변수나 로컬 변수가 수정되어 값이 변경되면 로컬 클래스에 복사해 둔 값과 달라지는 문제점을 해결하기 위해 매개 변수나 로컬 변수를 final로 선언해서 수정 막음
중첩 클래스에서 바깥 클래스 참조 얻기
- 중첩 클래스 내에서 this 키워드 사용하면 중첩 클래스의 객체가 참조됨
- 바깥 클래스의 참조를 얻으려면 바깥 클래스의 이름음 this 앞에 붙여줌
중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스
- 해당 클래스와 긴밀한 관계를 맺는 구현 클래스 만들기 위해 사용
- UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용
익명 객체
- 이름이 없는 객체
- 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야 생성할 수 있음
- 필드의 초기값, 로컬 변수의 초기값, 매개 변수의 매개값으로 주로 대입됨
- UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 익명 객체 활용
익명 자식 객체 생성
- 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우
- 실행문이기 때문에 끝에 세미콜론(;) 붙여야 함
익명 구현 객체 생성
- 구현 클래스가 재사요오디지 않고, 해당 필드와 변수의 초기값으로만 사용하는 경우
익명 객체의 로컬 변수 사용