내부클래스



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
    public static void main(String a[]){
        TestClass c = new TestClass();
        c.innerClass.test1();
    }
}
class TestClass {
    String a = "TestClass 클래스의 멤버 변수.";
    
    class TestInnerClass{
        String b = "내부 TestInnerClass 클래스의 멤버 변수.";
        
        public void test1(){
            //내부 클래스는 외부 클래스의 멤버를 자신의 멤버처럼 사용할 수 있다.
            System.out.println(a);
            System.out.println(b);    
        }        
    }
    //클래스의 입장에서 내부클래스는 자신의 안에 있는것이 아닌
    //외부에 있는 다른 클래스처럼 인식 하므로 내부 클래스를 호출 할 수 있는 방법이 있어야 한다.
    //그중 하나가 내부클래스를 멤버로 선언 하는 것이다.
    TestInnerClass innerClass = new TestInnerClass();
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test2 {
    public static void main(String a[]){
        //외부 클래스를 먼저 선언후, 외부 클래스를 통해서 내부클래스를 선언 하는 방법이 있다.
        Test2Class c = new Test2Class();
        Test2Class.Test2InnerClass ic = c.new Test2InnerClass();
        
        ic.test1();
    }
}
class Test2Class {
    String a = "TestClass 클래스의 멤버 변수.";
    
    class Test2InnerClass{
        String b = "내부 TestInnerClass 클래스의 멤버 변수.";
        
        public void test1(){
            //내부 클래스는 외부 클래스의 멤버를 자신의 멤버처럼 사용할 수 있다.
            System.out.println(a);
            System.out.println(b);    
        }        
    }
}



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
public class Test3 {
    public static void main(String a[]){
        //본래는 직접적으로 호출이 불가능 하지만 스태틱 내부클래스는 직접 호출이 가능하다.
        Test3Class.Test3InnerClass c = new Test3Class.Test3InnerClass("");
        c.test1();
    }
}
class Test3Class {
    String a = "Test3Class 클래스의 멤버 변수.";
    static String c = "Test3Class 클래스의 스태틱 멤버 변수";
    static class Test3InnerClass{        
        public Test3InnerClass(String b) {
            super();
            this.b = b;
        }
        String b = "내부 Test3InnerClass 클래스의 멤버 변수.";
        
        public void test1(){
            //내부 클래스는 외부 클래스의 멤버를 자신의 멤버처럼 사용할 수 있다.
            //System.out.println(a);//내부 스태틱 클래스는 외부클래스의 멤버를 호출 할 수 없다.
            System.out.println(b);
            System.out.println(c);//스태틱 내부 클래스는 외부의 스태틱 멤버만 호출이 가능하다.            
        }        
    }
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test4 {
    public static void main(String a[]){
        Test4Class c = new Test4Class();
        //메소드 내에 선언된 내부 클래스는 외부에서 호출이 불가능 하다.
        //Test4Class.Test4InnerClass c1 = c.new Test4InnerClass();//에러!
    }
}
class Test4Class {
    String a = "Test4Class 클래스의 멤버 변수.";
    static String c = "Test4Class 클래스의 스태틱 멤버 변수";
    public void test4member(){
        //메소드 내에 선언된 내부 클래스.
        class test4InnerClass{
            String b = "test4InnerClass 내부 클래스의 멤버 변수.";
            public void test4InnerClassMember(){
                //메소드 내에 선언되었다 하더라도 외부 클래스의 멤버에 접근이 가능하다.
                System.out.println(a);
                System.out.println(b);
                System.out.println(c);
            }
        }
    }
}


댓글()