hyeonga_code

Java_45_클래스_중첩 클래스 본문

Java

Java_45_클래스_중첩 클래스

hyeonga 2023. 10. 8. 05:59
반응형


- 클래스 멤버
    - 멤버 필드
     - 생성자
     - 멤버 메소드
     - 중첩 클래스

5. 중첩 클래스
     - 클래스 내에 클래스가 존재
     - 일반 중첩 클래스
     - 클래스 내에 클래스를 생성
          Outer$Inner
     - 객체 생성 후 메모리가 로딩됨
     - 외부 클래스가 객체를 생성해야 함
     - 외부 클래스에서는 내부에 중첩된 클래스의 객체에 접근할 수 없음
=====

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Outer {
    private int a;
    private static int b;
    //멤버필드
    
    static {
        //static멤버 초기화
        b = 20;
    }
 
    public Outer() {
        //생성자
        a = 10;
    }
 
    public void disp() {
        //멤버메소드
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        //System.out.println("c = " + c);
        //바깥클래스에서는 내부 클래스의 멤버에 접근하지 못한다
    }
 
    class Inner {
        //중첩클래스, Inner클래스  >> 'Outer$Inner.class'
        private int c;
        public Inner() {
            c = 30;
        }
        public void disp_in() {
            //내부클래스에서는 밖의 클래스 멤버에 접근 가능
            System.out.println("a = " + a);
            System.out.println("b = " + b);
            System.out.println("c = " + c);
        }
        class Inner_Inner {}
    }
}
 
public class same {
    public static void main(String[] args) {
        Outer ot = new Outer();
 
        // Outer.Inner oi = new Outer.Inner();
        // 오류 : 상위인 외부 클래스가 선언되어야 사용할 수 있음 
        Outer.Inner oi = ot.new Inner();
        oi.disp_in();
 
    }
}
 



- static 중첩 클래스
    - 클래스 안에 static 클래스를 생성
     - 메모리에 미리 로딩되므로 독립적으로 사용이 가능
     - 객체가 생성되지 않아도 사용할 수 있음
          Outer$Inner
=====

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
38
import java.util.*;
 
class Outer {
    private int a;
    private static int b;
    static {
        b = 20;
    }
    public Outer() {
        a = 20;
    }
    public void disp() {
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    static class Inner {
        // Outer$Inner.class
        private int c;
        public Inner() {
            c = 30;
        }
        public void disp_in() {
            // System.out.println("a = " + a);
            // 오류: static 중첩 클래스는 외부 클래스의 멤버 중 static 멤버만 불러올 수 있음
            System.out.println("b = " + b);
            System.out.println("c = " + c);
        }
    }
}
 
public class same {
    public static void main(String[] args) {
        Outer ot = new Outer();
        // Outer.Inner oi = ot.new Inner();
        // 오류  : Illegal enclosing instance specification for type Outer.Inner
        Outer.Inner oi = new Outer.Inner();
    }
}



- 지역 중첩 클래스

    - 메소드 안에 클래스를 만들어 사용
     - 선언된 범위에서만 사용할 수 있는 클래스
     - 다른 클래스라고 인식되어 지기 위해 인덱스를 붙여 저장된다.
     - 같은 이름일 경우에만 순서가 올라감
     - 다른 이름일 경우 1부터 다시 시작됨
          Outer$1Inner
=====

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
38
import java.util.*;
 
class Outer {
    private int a;
    private static int b;
    static {
        b = 20;
    }
    public Outer() {
        a = 10;
    }
    public void disp() {
        // 메소드
        class Inner {
            // 지역 중첩 클래스_ 메소드 내에 생성됨  >>  'Outer$1Inner.class' _ 인덱스와 같이 저장됨
            private int c;
            public Inner() {
                c = 30;
            }
            public void disp_in() {
                System.out.println("a = " + a);
                System.out.println("b = " + b);
                System.out.println("c = " + c);
            }
        }
 
        Inner in = new Inner();
        in.disp_in();
        // main()에서 객체를 생성해줄 수 없으므로  disp() 내에서 선언해주어야 함
    }
}
 
public class same {
    public static void main(String[] args) {
        Outer ot = new Outer();
        // disp() 내에 지역 객체를 만들고 싶어도 만들어줄 수 없음
    }
}


- 익명 중첩 클래스
    - 객체 생성 시 메소드르르 재정의하여 사용
     - 새로운 클래스가 되나 이름이 존재하지 않음
          same$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
import java.util.*;
 
class Outer {
    public void aaa() {
        System.out.println("aaa");
    }
    public void bbb() {
        System.out.println("bbb");
    }
    public void ccc() {
        System.out.println("ccc");
    }
}
 
public class same {
    public static void main(String[] args) {
        Outer ot = new Outer(){
            // Outer 에서 재 정의 된 bbb 메소드만 수정된 값으로 객체를 생성해주는 것
            public void bbb() {
                // 클래스의 특정 메소드를 오버라이드하여 'same$1.class'로 객체를 생성
                System.out.println("bbb2");
            }
        };
        ot.aaa();
        ot.bbb();
        ot.ccc();
    }
}

 

반응형

'Java' 카테고리의 다른 글

Java_47_상속  (0) 2023.10.11
Java_46_toString  (0) 2023.10.09
Java_44_클래스_지정 예약어  (0) 2023.10.07
Java_43_지정 예약어  (0) 2023.10.06
Java_42_캡슐화  (0) 2023.10.05