내부클래스
내부 클래스는 클래스 안에 선언된 클래스이다. 내부 클래스 에서는 외부 클래스의 멤버들을 쉽게 접근할 수 있고 코드의 복잡성을 줄여준다.(캡슐화
)
1
2
3
4
5
6
7
8
| // 외부 클래스
class A{
// 내부 클래스
class b{
}
}
|
4가지 종류가 있는데 변수와 마찬가지로 인스턴스 내부 클래스, static 내부 클래스, 지역 내부 클래스
와 익명 클래스
가 있다.
내부 클래스의 제어자와 접근성
내부 클래스는 외부 클래스의 멤버로 다뤄진다. 내부 클래스가 사용할 수 있는 제어자는 변수에 사용할 수 있는 접근제어자와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class Outer{
int oiv=10; // 외부 클래스 Outer의 인스턴스 변수
static int ocv=20; // 외부 클래스 Outer의 static 변수
class InstanceInner{
int iiv=30; // 인스턴스 내부 클래스 InstanceInner의 인스턴스 변수
}
static class StaticInner{
int siv=40; // static 내부 클래스 StaticInner의 인스턴스 변수
static int scv=50; // static 내부 클래스 StaticInner의 static 변수
}
void Method1(){
int lv1=50; // 지역변수
static final lv2=60; // 지역 상수
class Local{
int ilv=70; // 지역 내부 클래스 Local의 인스턴스 변수
}
}
}
|
- static멤버 정의는 static 클래스만 가능
1
2
3
4
| static class StaticInner{
int siv=40; // static 내부 클래스 StaticInner의 인스턴스 변수
static int scv=50; // static 내부 클래스 StaticInner의 static 변수
}
|
인스턴스 내부 클래스에 접근
하기 위해서는 외부 클래스의 객체 생성 후, 인스턴스 내부 클래스 객체 생성 후
가능
1
2
3
4
| Outer o = new Outer();
Outer.InstanceInner oi = o. new InstanceInner();
//이후 instance 내부 클래스의 멤버에 접근 가능
|
static 내부 클래스의 멤버는 외부 클래스의 객체를 생성하지 않아도 접근 가능
1
2
3
4
5
6
| System.out.println(Outer.StaticInner.scv); // static내부 클래스의 static변수: 50
// static 내부 클래스 객체 생성 후 static 내부 클래스의 인스턴스 변수 접근 가능
Outer.StaticInner si = Outer.new StaticInner();
System.out.println(Outer.StaticInner.siv) // static내부 클래스의 인스턴스 변수: 40
|
지역 내부 클래스는 메소드 안에서만 접근
이 가능
1
2
3
4
5
6
7
8
9
10
11
|
void Method2(){
Local m2l = new Local(); // 불가능
}
void Method1() {
class Local{ // 지역 내부 클래스 Local의 인스턴스 변수
}
Local m1l = new Local(); // 가능
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Outer{
int iv=10; // Outer.this.iv
class InstanceInner{
int iv=20; // this.iv
void method(){
int iv=30;
system.out.println("외부 클래스의 iv: " + Outer.this.iv) // 10
system.out.println("내부 클래스의 iv: " + this.iv) // 20
system.out.println("지역 클래스의 iv: " + iv) // 30
}
}
}
|
익명 클래스
익명 클래스는 이름이 없는 일회용 클래스
로 선언과 생성을 동시에 해 하나의 객체만 생성
이 가능하다. 조상 클래스의 이름
이나 조상 인터페이스의 이름
으로 객체를 생성한다.
조상클래스 이름을 사용한 익명 클래스
1
2
3
4
| Object o = new Object(){
void method() {
} };
|
인터페이스 이름을 사용한 익명 클래스
1
2
3
4
5
6
7
8
| class A implements ActionListener{}
class B{
public static void main(String[] args){
Button b = new Button();
b.addActionListener(new A());
}
}
|
위의 코드를 익명 클래스를 사용하면 아래처럼 구현할 수 있다.
1
2
3
4
5
6
7
8
| class B{
public static void main(String[] args){
Button b = new Button();
b.addActionListener(new ActionListener(){
// 멤버 구현
});
}
}
|
Comments powered by Disqus.