중첩 클래스란?
클래스 내부에 선언된 클래스로서 바깥 클래스와 긴밀한 관계를 가지며 바깥 클래스가 없으면 필요없는 클래스이다.
중첩 클래스의 종류는 크게 멤버 클래스와 로컬 클래스로 나눌 수 있다.
멤버 클래스의 경우 클래스의 멤버로서 선언되고 멤버 클래스는 다시 인스턴스와 정적으로 나뉠 수 있다.
class Main{
class Sub{} // 인스턴스
static class Sub2{} //정적
}
인스턴스 멤버 클래스의 경우 정적 필드와 메소드는 선언할 수 없고 인스턴스 필드와 메소드만 선언이 가능하다.
public class Main{
class Sub{
Sub(){}
int cnt; //static 사용 불가
void test(){} //마찬가지로 static 사용 불가
}
}
public class Main{
class Sub{}
void test(){ // Main 클래스의 void도 static이 아닐때만 이렇게 내부에서 중첩 클래스를 사용할 수 있음
Sub sub = new Sub();
sub.cnt = 1;
sub.test();
}
}
//Sub 클래스 사용법
Main m = new Main();
Main.Sub s = m.new Sub();
정적 멤버 클래스는 인스턴스 멤버 클래스와 달리 Main 클래스가 선언이 안되도 Sub 클래스를 사용할 수 있다.
public class Main{
static class Sub{
Sub(){}
int cnt;
static int cnt2;
void test(){}
static void test1(){}
}
}
//Sub 클래스 사용법
Main.Sub s = new Main.Sub();
s.cnt1=1;
s.test();
Main.Sub.cnt2 = 1; //Sub 클래스 선언없이 cnt2에 접근
Main.Sub.test1();
위처럼 Sub클래스의 static 필드와 메소드도 Sub 클래스의 선언없이 접근이 가능하다.
로컬 클래스의 경우 생성자 또는 메소드 내부에서 선언되고 생성자나 메소드가 실행될 때만 사용이 된다.
앞선 멤버클래스처럼 접근 제한자인 private이나 static을 붙일 수 없고 따라서 정적 필드와 메소드도 선언이 불가능하다.
public class Main{
void mtd(){
class Sub{
Sub(){}
int cnt;
//static int cnt2;
void test(){}
//static void test1(){}
}
// 로컬 클래스의 경우엔 함수 내에서 바로 사용해야함
Sub s = new Sub()
s.cnt = 1;
s.test();
}
}
위처럼 로컬 클래스의 경우엔 메소드 내에서 만들고 바로 사용해야한다.
또한, 로컬 클래스에서 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 그 매개변수와 로컬 변수는 final 특성을 갖는다(즉, 수정이 불가능한 값임)
public class Main{
int cnt=1;
void test(){}
void mtd(int i){
int j =1;
class Sub{
int cnt=1;
public void test(){ int res = i+j;}
void p(){
System.out.println(Main.this.cnt) //바깥 클래스 cnt
Main.this.test(); // 바깥클래스 test
}
}
}
}
추가적으로 중첩 클래스 내에서 바깥 클래스를 쓰기 위해서는 this 수식어를 쓰면된다.
ex ) 바깥클래스.this.field(or method)
중첩 인터페이스란?
클래스 내부에 선언된 인터페이스로서 중첩 클래스와 마찬가지로 바깥 클래스와 긴밀한 관계를 갖는다.
public class Main {
[static] interface Sub {
void test();
}
}
중첩 인터페이스는 주로 UI프로그래밍에서 이벤트 처리 목적으로 자주 활용하기도 한다.(버튼 기능을 구현할 때)
'Language > Java' 카테고리의 다른 글
Java 예외 클래스 (0) | 2022.06.12 |
---|---|
Java 익명 객체 (0) | 2022.06.12 |
Java 타입 변환과 다형성 (0) | 2022.06.06 |
Java 인터페이스 (0) | 2022.05.30 |
Java 추상클래스 (0) | 2022.05.30 |