티스토리 뷰

반응형

[ 요약 ]

  - 내부 클래스는 정의되는 위치에 따라 멤버 클래스와 지역 클래스로 나뉜다.

  - 멤버 클래스는 멤버 변수와 동일한 위치에 선언된 내부 클래스를 의미한다.

  - 멤버 클래스는 static 예약어가 붙은 static 멤버와 instance 멤버로 나뉜다.

  - 지역 클래스는 메서드 내에 클래스가 정의되어 있는 경우를 말하며, 이름이 있는 지역 클래스와 이름을 갖지 않는 무명 클래스로 다시 나뉜다.



#. 내부 클래스


> 내부 클래스

  - 클래스가 다른 클래스를 포함하는 경우, 내부에 포함된 클래스의 명칭

  - 파일 크기의 최소화, 보안, 성능 향상, 이벤트 처리 등을 쉽게 하기 위해 사용

  - 자바 클래스 구조를 더 조직화하고, 소스코드를 구현시 효율을 높일 수 있음

  - 내부 클래스가 생성되기 위해 외부 클래스의 객체가 반드시 필요

  - JDK 초기 버전부터 지원


  - 내부 클래스는 정의되는 위치에 띠라 멤버 클래스와 지역 클래스로 나뉨

  - 멤버 클래스

    ㄴ 멤버 변수와 동일한 위치에 선언된 내부 클래스

    ㄴ static 예약어가 붙은 static 멤버와 instance 멤버로 나뉨

    ㄴ 동일한 클래스 뿐 아니라 다른 클래스에서도 활용 가능

    ㄴ 클래스의 벰버 변수와 성격이 비슷


  - 지역 클래스

    ㄴ 메서드 내에 클래스가 정의되어 있는 경우

    ㄴ 지역 클래스(이름을 갖는)와 무명 클래스(이름을 갖지 않는)로 나뉨

    ㄴ 활용 범위가 메서드 블록 내부로 제한되는 특징을 갖는 등 지역 변수와 성격이 비슷


> instance 멤버 내부 클래스

  - instance 멤버 내부 클래스는 클래스의 멤버와 동일한 위치에서 선언되는 내부 클래스

  - 멤버 변수나 메서드와 동일한 위치에서 선언되었기 때문에 다른 외부 클래스에서도 사용 가능

  - 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성이 필요

  - Outside.class

  - Outside$Inside.class

1
2
3
4
5
6
7
8
9
10
11
12
class Outside {        // 외부 클래스 (=Top Level Class)
    public class Inside {        // 내부 클래스 (일반 멤버 변수와 동일한 위치)
        // ...
    }
}
 
public class InnerClass {
    public static void main(String args[]) {
        Outside outer = new Outside();    // 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성
        Outside.Inside inner = outer.new Inside();
    }
}
cs


> static 멤버 내부 클래스

  - 내부 클래스를 정의할 때도 static 예약어 사용 가능

  - 외부 클래스의 객체를 생성하지 않고도 내부 클래스 객체 생성 가능

1
2
3
4
5
6
7
8
9
10
11
class Outside {        // 외부 클래스 (=Top Level Class)
    public static class StaticInside {        // static 내부 클래스
        // ...
    }
}
 
public class InnerClass {
    public static void main(String args[]) {
        Outside.StaticInside sinner = new Outside.StaticInside();
    }
}
cs


> 이름을 갖는 지역 내부 클래스

  - 메서드 내부에 정의된 클래스로서 지역 변수와 동일한 범위를 가짐 -> 클래스가 선언된 메서드 블록 내에서만 사용 가능

  - 클래스의 이름이 명시 

  - Animal.class

  - Animal$1$Brain.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal {        // 외부 클래스 (=Top Level Class)
    void performBehavior() {        
        class Brain {    // 이름을 갖는 지역 내부 클래스
            // ...  지역 내부 클래스 정의
        }
    }
}
 
public class InnerClass {
    public static void main(String args[]) {
        Animal am = new Animal();
        Animal.Brain br = am.new Brain();
    }
}
cs


> 이름이 없는 지역 내부 클래스 (=무명의 내부 클래스)

  - new 예약어 뒤에 명시된 클래스가 기존의 클래스인 경우, 자동적으로 이 클래스의 자식 클래스가 됨

  -  이름이 없는 지역 내부 클래스는 추상 클래스의 객체를 내부 클래스 형태로 생성할 때 자주 사용

  - 다른 내부 클래스에 비해 활용도가 높은 클래스

  - 추상 클래스는 추상 메서드를 포함하고 있기 때문에, 

    추상 클래스를 상속한 클래스가 만들어져 객체를 생성해야만 객체 생성이 가능 -> 무명의 내부 클래스를 사용하는 것이 편리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class TV {
    public abstract void powerOn();
    public abstract void powerOff();
}
 
public class Test {
    public static void watchTV(TV tv) {
        tv.powerOn();
        tv.powerOff();
    }
    
    public static void main(String[] args) {
        watchTV(new TV() {        // 이름이 없는 지역 내부 클래스 객체
            /* TV 라는 추상 클래스의 객체를 내부 클래스 형태로 생성하였기 때문에,
            실제로는 TV 클래스를 상속한 내부 클래스가 만들어지게 됨. */
            public void powerOn() {
                System.out.println("Power On");
            }
            public void powerOff() {
                System.out.println("Power Off");
            }
        });
    }
}
cs

  // 이름을 갖는 지역 내부 클래스와 비교 //
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
abstract class TV {
    public abstract void powerOn();
    public abstract void powerOff();
}
 
class AnonymousClass extends TV {    // 이름을 갖는 지역 내부 클래스
    public void powerOn() {
        System.out.println("Power On");
    }
    public void powerOff() {
        System.out.println("Power Off");
    }
}
 
public class Test {
    public static void watchTV(TV tv) {
        tv.powerOn();
        tv.powerOff();
    }
}
cs




참고 : SW Expert Academy


반응형

'Web > JAVA' 카테고리의 다른 글

[JAVA] HashSet  (0) 2019.08.14
[JAVA] 객체의 형변환(Casting)  (0) 2019.08.12
[JAVA] 추상 클래스(Abstract Class)  (0) 2019.08.12
[JAVA] 상속과 멤버(변수, 메서드)  (2) 2019.08.08
[JAVA] 자바의 상속  (0) 2019.08.08
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday