ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA 34] 내부 클래스 ( Inner Class )
    Language/Java 2018. 2. 19. 14:24
    반응형


    ■ Inner Class ( 내부 클래스 )

    1. 클래스 내부에 정의되는 클래스

    2. 특징

    1) 사용목적

    외부클래스의 멤버변수나 메소드 (= 자원 )를 ' 자신의 자원 ' 처럼 이용하기 위해서 사용한다.


    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class OutterClass1{
        private int a = 10;
     
        OutterClass1(){
            System.out.println("외부클래스의 생성자()");
        }
     
        private void m1(){
            System.out.println("외부클래스의 m1()");
        }
     
        class InnerClass1{
            int b = 20;
     
            InnerClass1(){
                System.out.println("내부클래스의 생성자()");
            }
     
            void m2(){
                System.out.println("내부클래스의 m2()");
                System.out.println(" a : " + a);     // 외부클래스의 멤버 변수 a
                m1();                                // 외부 클래스의 메소드
            }
        }
    }
     
    class User1{
     
        public static void main(String[] args){
            OutterClass1 out1 = new OutterClass1();    // 외부클래스 객체 생성
            
            OutterClass1.InnerClass1 oi1 = out1.new InnerClass1();
          //  외부클래스.내부클래스 객체명 = 외부클래스 객체.new 내부클래스();
            System.out.println(" b : " + oi1.b);
            oi1.m2();
        }
    }
    cs



    내부클래스가 있을때 컴파일을 하면,

    < 외부클래스명$내부클래스명.class > 라는 이름으로 파일이 생성된다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class OutterClass2 {
     
        private int a = 10;
     
        OutterClass2(){
            System.out.println("외부클래스 생성자()");
            InnerClass2 in2 = new InnerClass2(this);
            in2.m2();
        }
     
        void m1(){
            System.out.println("외부클래스 m1()");
        }
     
        int getA(){
            return a;
        }
    }
    cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class InnerClass2{
     
        int b = 20;
     
        OutterClass2 out2;
     
        InnerClass2(OutterClass2 out2){
            System.out.println("내부클래스 생성자()");
            this.out2 = out2;
        }
     
        void m2(){
            System.out.println("내부클래스 m2()");
            System.out.println(" a : " + out2.getA());    // 외부클래스의 멤버변수 a
            out2.m1();                                    // 외부클래스의 메소드 m2();
        }
    }
    cs

    1
    2
    3
    4
    5
    class User2{
        public static void main(String[] args){
            new OutterClass2();
        }
    }
    cs


    2) 모든 접근 제한자가 올 수 있다.

    3) static 은 접두 할 수 없다.

    4) 내부 클래스 안의 static 자원이 하나라도 있다면, static 내부 클래스가 되어야 한다.

       ( 내부 클래스 안에 main() 메소드가 존재 하기 위해서는 static 내부 클래스어야 한다. )


    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
    class OutterClass5{    // OutterClass Study 1
        static interface InnerInterface{
            int a = 20;
            void m();
        }
        
        static class InnerClass5 implements InnerInterface{
            public void m(){
                System.out.println("1. 내부클래스 m() 오버라이딩");
            }
        }
    }
     
    class User5{
        public static void main(String[] args){
            
            OutterClass5.InnerClass5 oi5 = new OutterClass5.InnerClass5(){
                public void m(){
                    System.out.println("2. 메인 m() 오버라이딩");
                }
            };
            
            System.out.println("내부 인터페이스 a : " + oi5.a);
            oi5.m();
        }
    }
    cs



    5) 내부 클래스의 객체 생성 방법

    (1) static 내부 클래스

    외부클래스.내부클래스 객체명 = new 외부클래스.내부클래스();

    (2) 일반 내부 클래스

    외부클래스.내부클래스 객체명 = 외부클래스객체.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
    class OutterClass3{
        int a = 10;
     
        static class InnerClass3{
            static int b = 20;
            int c = 30;
     
            static void m(){
                System.out.println(" a : " + new OutterClass3().a);
            }
        }
    }
     
    class User3{
        public static void main(String[] args){
            OutterClass3.InnerClass3 oi3 = new OutterClass3.InnerClass3();
     
            OutterClass3.InnerClass3.m();
            oi3.m();
     
            System.out.println(" b : " + OutterClass3.InnerClass3.b);
            System.out.println(" c : " + oi3.c);
        }
    }
    cs




    OutterClass3.InnerClass3.m();

    oi3.m();

    위의 2개는 a : 10 이라는 같은 결과를 도출한다.


    6) 내부 인터페이스

    클래스 또는 인터페이스 내부에 정의되는 인터페이스를 말한다.


    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
    class OutterClass4{
     
        interface InnerInterface{
            int a = 10;
     
            void m();
        }
     
        class InnerClass4 implements InnerInterface{
     
            public void m(){
                System.out.println("내부인터페이스 m() 오버라이딩");
            }
        }
    }
     
    class User4{
        public static void main(String[] args){
            OutterClass4 oc4 = new OutterClass4();
            OutterClass4.InnerClass4 oi4 = oc4.new InnerClass4();
            OutterClass4.InnerInterface oif = (OutterClass4.InnerInterface)oi4;
            System.out.println(" a : " + oif.a);
            oif.m();
        }
    }
    cs



    반응형
Designed by Tistory.