내부클래스
내부 클래스는 클래스 안에 선언된 클래스이다. 내부 클래스 에서는 외부 클래스의 멤버들을 쉽게 접근할 수 있고 코드의 복잡성을 줄여준다.(캡슐화) 
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.