728x90
1. 중첩클래스
- 클래스 내부에 선언되는 위치에 따라 분류
- 멤버 클래스
클래스의 멤버로서 선언되는 중첩 클래스
인스턴스 멤버 클래스와 정적 멤버 클래스로 나뉨
클래스나 객체 사용 중이라면 언제든 재사용 가능 - 로컬 클래스
메소드 내부에서 선언되는 중첩 클래스
메소드를 실행할 때만 사용됨
- 멤버 클래스
- 인스턴스 멤버 클래스
- static 키워드 없이 중첩 선언된 클래스. 인스턴스 필드와 메소드만 선언 가능
- 외부에서 객체 생성하려면 외부클래스 객체 먼저 생성하고 내부클래스 객체 생성해야 함
class A{
class B{ //인스턴스 멤버 클래스
B(){}
int x;
void do(){}
}
}
- 정적 멤버 클래스
- "static" 키워드로 선언된 클래스. 모든 종류의 필드와 메소드 선언 가능
- 외부에서 객체 생성하기 위해 외부 객체 생성할 필요 없이 바로 내부 객체 생성하면 됨
class A{
staic class B{ //정적 멤버 클래스
B(){}
int x;
void do(){}
staic int y;
staic int play(){}
}
}
- 로컬 클래스
- 메소드 내에 선언된 클래스
- 접근 제한자 및 static을 붙일 수 없음
- 클래스내부에 인스턴스 필드, 메소드 필드만 선언할 수 있음
- 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 함
void do(){
class B{ //로컬 클래스
B(){}
int x;
void play(){}
{
B b = new B();
b.x = 0;
b.play();
}
2. 중첩 클래스의 접근 제한
- 바깥 필드와 메소드에서 사용 제한 - 바깥 클래스에서 인스턴스 멤버 클래스를 사용할 때 제한이 있음
- 인스턴스 멤버 클래스
바깥 클래스의 인스턴스 필드 초기값, 인스턴스 메소드에서 객체 생성할 수 있음
정적 필드의 초기값이나 정적 베소드에서는 객체를 생성할 수 없음 - 정적 멤버 클래스
모든 필드의 초기값이나 모든 메소드에서 객체 생성 가능
- 인스턴스 멤버 클래스
- 멤버 클래스에서 사용 제한
- 인스턴스 멤버 클래스 안에서 바깥 클래스의 모든 필드와 모든 메소드 접근 가능
- 정적 멤버 클래스 안에서 바깥 클래스의 정적 필드와 메소드에만 접근할 수 있고, 인스턴스 필드와 메소드에 접근할 수 없음
- 로컬 클래스에서 사용 제한
- 로컬 클래스의 객체는 일반적으로 메소드 실행이 종료되면 없어짐
- 메소드가 종료되어도 속 실행 상태로 존재할 수 있음
- ex) 로컬 스레드 객체를 사용할 때
- 문제 해결
- 컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변슈 값을 로컬 클래스 내부에 복사해두고 사용
- 매개 변수나 로컬 변수가 수정되어 값이 변경되면 로컬 클래스에 복사해둔 값과 달라짐
- => 변수 final 선언
- 중첩 클래스에서 바깥 클래스 참조 얻기
- this : 객체자신의 참조
- 중첩 클래스에서 this 키워드를 사용하면 중첩 클래스의 객체 참조가 됨
- 바깥클래스 참조를 얻기 위해 [바깥 클래스.this.] 의 형태 사용
3. 중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스
- 클래스 내부에 선언해 해당 클래스와 긴밀한 관계를 맺는 클래스 만듦
- 인스턴스 멤버 인터페이스, 정적 멤버 인터페이스 모두 사용 가능
- 주로 정적 멤버 인터페이스를 많이 사용하는데, UI프로그래밍에서 이벤트 처리할 목적으로 많이 활용됨
class A{
interface B{ //중첩 인터페이스
void do();
}
}
728x90
'Java' 카테고리의 다른 글
[혼자 공부하는 자바] 9-2 익명 객체 (0) | 2023.05.22 |
---|---|
[혼자 공부하는 자바] 5-1 참조 타입과 참조 변수 (0) | 2023.05.15 |