프로그래밍 공방

[Java의 정석] Chapter 10. 내부 클래스 / inner class 본문

개발/Java

[Java의 정석] Chapter 10. 내부 클래스 / inner class

hyosupsong 2021. 2. 15. 01:50

inner class : 내부 클래스

클래스 내에 선언된 클래스

내부 클래스의 장점

- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.

1
2
3
4
5
class A {    // 외부 클래스
    class B {    // 내부 클래스
        //...
    }
}
cs

내부 클래스의 종류와 특징

내부 클래스의 종류는 변수의 선언 위치에 따른 종류와 같다.

내부 클래스의 선언

내부 클래스가 선언된 위치에 따라 종류가 나뉜다.

1
2
3
4
5
6
7
8
class Outer {
    class InstanceInner{}
    static class StaticInner{}
    
    void myMethod() {
        class LocalInner{}
    }
}
cs

내부 클래스의 제어자와 접근성

1. 내부 클래스도 클래스이기 때문에 abstract나 final과 같은 제어자를 사용할 수 있다.

- 내부 클래스 중에서 스태틱 클래스만 static 멤버를 가질 수 있다.
- final과 static이 동시에 붙은 변수는 상수(constant)이므로 모든 내부 클래스에서 정의가 가능하다.
- 인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 바로 사용할 수 있지만,
- 스태틱 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 사용할 수 없다. (내부 클래스의 멤버도 마찬가지)

2. 내부 클래스도 멤버 변수들처럼 private, protected와 같이 접근 제어자도 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Outer {
    private int outerIv = 0;
    static int outerCv = 0;
    
    class InstanceInner {
        int iiv = outerIv;    // 외부 클래스의 private 멤버도 접근가능하다.
        int iiv2 = outerCv;
    }
    
    static class StaticInner {
        // 스태틱 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
        // int siv = outerIv;
        static int scv = outerCv;
    }
    
    void myMethod() {
        int lv = 0;
        final int LV = 0;
        
        class LocalInner {
            int liv = outerIv;
            int liv2 = outerCv;
            // 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
            // int liv3 = lv;  에러
            int liv4 = LV;
        }
    }
}
cs

익명 클래스

클래스의 선언과 객체의 생성을 동시에 하는 이름이 없는 클래스(하나의 객체만을 생성할 수 있는 일회용 클래스)

- 이름이 없기 때문에 생성자도 없다.
- 오직 하나의 클래스를 상속받거나 하나의 인터페이스만을 구현할 수 있다.

1
2
3
4
5
6
7
8
class Annonymous {
    PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>() {  // 익명 클래스
        @Override
        public int compare(Integer arg0, Integer arg1) {
            return Integer.compare(arg0, arg1);
        }
    });
}
cs