##Chapter10 내부 클래스

###1. 내부 클래스(inner class)란?

==내부 클래스의 장점==
* 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
* 코드의 복잡성을 줄일 수 있다(캡슐화).

 
    class A { //외부 클래스
     //...
     class B { //내부 클래스
         // ...
        }
        //...
    }
   

###2. 내부 클래스의 종류와 특징

|내부 클래스| 특징 |
|---------|-----|
|인스턴스 클래스<br>(instance class)|외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 인스턴스 멤버처럼 다루어짐.
|스태틱 클래스<br>(static class)|외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 static 멤버처럼 다루어짐.|
|지역 클래스<br>(local class)|외부 클래스의 메서드나 초기화블럭 안에 선언, 선언된 영역 내부에서만 사용.|
|익명 클래스<br>(anonymous class)|클래스의 선언과 객체의 생성을 동시에 하는 클래스(일회용)|

###3. 내부 클래스의 선언
 
    class Outer {
     class InstanceInner {}
        static class StaticInner {}
       
        void myMethod() {
         class LocalInner {}
        }
    }
   

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

==Ex1==
 
    class InnerEx1 {
     class InstanceInner {
         int iv = 100;
            static int cv = 100; //에러! static변수 선언X
            final static int CONST = 100; //final static은 상수이므로 허용.
        }
       
        static class StaticInner {
         int iv = 200;
            static int cv = 200; //static클래스만 static멤버 정의.
        }
       
        void myMethod() {
         class LocalInner {
             int iv = 300;
                static int cv = 300; //에러! static 변수 선언X
                final static int CONST = 300; //final static은 상수이므로 허용.
            }
           
        }
    }
   

==Ex2==
 
    class InnerEx2 {
     class InstanceInner {}
        static class StaticInner {}
       
        //인스턴스멤버 간에는 서로 직접 접근 가능.
        InstancdInner iv = new InstanceInner();
        //static멤버 간에는 서로 직접 접근 가능.
        static StaticInner cv = new StaticInner();
       
        static void staticMethod() {
       
         //static멤버는 인스턴스 멤버에 직접 접근X
 //  InstanceInner obj1 = new InstanceInner();
      staticInner obj2 = new StaticInner();
           
            //굳이 접근하고자 한다면, 아래와 같이 객체 생성.
            //인스턴스 클래스는 외부 클래스를 먼저 생성해야만 생성할 수 있다.
            InnerEx2 outer = new InnerEx2();
            InstanceInner obj1 = outer.new InstanceInner();
        }
       
        void instanceMethod() {
         
            //인스턴스메서드에서는 인스턴스멤버와 static멤버 모두 접근 가능.
            InstanceInner obj1 = new InstanceInner();
            StaticInner obj2 = new StaticInner();
           
            //메서드 내에 지역적으로 선언된 내부 클래스는 외부에서 접근할 수 없음.
 //  LocalInner lv = new LocalInner();
        }
       
        void myMethod() {
         class LocalInner {}
            LocalInner lv = new LocalInner();
        }
    }
   

==Ex3==

 * class InstanceInner {}
  * 외부 클래스의 private멤버도 접근 가능.
 * static class StaticInner {}
  * static 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없음.
 * class LocalInner {}
  * 외부 클래스의 지역변수는 final이 부은 변수(상수)만 접근 가능.


==Ex4==

 public static void main(String args[]) {}
 * 인스턴스클래스의 인스턴스를 생성하려면 외부 클래스의 인스턴스를 먼저 생성해야 함.
 * 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 됨.


==Ex5==

 내부 클래스 내의 메소드에서
    value, this.value, Outer.this.value.

 

ch10내부클래스.md

 

'CDG 3기 > JAVA의정석' 카테고리의 다른 글

ch9 lang패키지  (0) 2015.09.21
ch8 예외처리  (0) 2015.09.21
스터디 실습 문제 2  (0) 2015.09.21
스터디 실습 문제 1  (0) 2015.09.21
스터디 이론 문제  (0) 2015.09.21
Posted by 이선민이★
,