최신글
hyeonga_code
Java_45_클래스_중첩 클래스 본문
반응형
- 클래스 멤버
- 멤버 필드
- 생성자
- 멤버 메소드
- 중첩 클래스
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 |