Language/Java

[JAVA 34] 내부 클래스 ( Inner Class )

reifier.tistory.com 으로 이전하였습니다. 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



반응형