Post

내부 클래스

내부클래스

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

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(); // 가능
    }


  • 지역 내부 클래스는 메소드 안의 지역 상수만 접근 가능, 소멸된 지역변수를 참조할 수도 있기 때문

  • 참조변수 this

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(){
          // 멤버 구현  
        });
    }
}
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.