01. 중첩클래스
- 클래스 내부에 선언된 클래스를 중첩클래스(Nested Class)라고 한다.
- 중첩클래스로 선언하면 두 클래스 멤버들간의 접근성이 좋아지며 불필요한 관계클래스가 외부에서 보이지 않으므로 코드의 복잡성이 줄어든다.
- 여러 클래스와 관계를 맺는 클래스는 독립적으로 선언하는 것이 좋고, 특정 클래스하고만 관계를 맺는 클래스는 중첩클래스로 선언하는 것이 좋다.
02. 중첩클래스의 분류
분류 | 선언 위치 | 설명 | |
멤버클래스 | 인스턴스 멤버 클래스 |
class A { class B { ... } } |
A 객체를 생성해야만 사용할 수 있는 B 중첩 클래스 |
정적 멤버 클래스 |
class A { static class B {...} } |
A클래스로 바로 접근할 수 있는 B 중첩 클래스 | |
로컬클래스 |
class A { void method( ) { class B {...} } } |
method( )가 실행될 때만 사용할 수 있는 B 중첩 클래스 |
03. 예시 코드
- class A 내부에 class B, class C , class D가 선언되어있다.
- class B는 인스턴스 멤버클래스, class C는 정적멤버클래스, class D는 로컬클래스이다.
1) 인스턴스 멤버 클래스에는 static 키워드가 붙지 않으며, 정적(static) 필드와 메소드 선언이 불가능하다.
2) 정적 멤버 클래스에는 static 키워드가 붙으며 정적 필드/메소드 뿐 아니라 인스턴스 필드/메소드 선언도 가능하다.
3) 로컬클래스는 메소드 안에 선언되므로 public, private, static 키워드를 붙일 수 없다(무의미)
4) 로컬클래스의 객체는 메소드 안에서만 생성 및 사용 가능하다.
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
|
public class A { // 바깥 클래스
A() { System.out.println("A 객체가 생성됨");}
class B { // 인스턴스 멤버 클래스... static 키워드 없음. 정적 필드와 메소드 사용 불가.
B() { System.out.println("B 객체가 생성됨");}
int field1;
// static int field2;
void method1() {}
// static void method2() {}
} //end class B{}
static class C { /// 정적 멤버 클래스... static 키워드 붙음. 인스턴스 필드와 메소드도 사용 가능.
C() { System.out.println("C 객체가 생성됨");}
int field1;
static int field2;
void method1() {}
static void method2() {}
} //end class C{}
void method() {
System.out.println("class A 의 메소드 실행");
class D { // 로컬클래스 (메소드 안에 선언됨 -> 메소드 실행 시에만 사용되고, 메소드가 실행 종료되면 없어진다)
// 로컬클래스에는 접근제한자(pubilc, private)및 static을 붙일 수 없다.
// 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문.
D() { System.out.println("D 객체가 생성됨");}
int field1;
// static int field2; //정적 필드와 메소드 선언 불가
void method1() {}
// static void method2(){}
} //end class D
//로컬클래스의 객체는 메소드 내에서 생성 및 사용해야 한다.
D d = new D();
d.field1 = 3;
d.method1();
} // end method()
} //end classA{}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
1) class C의 경우 static으로 선언되었으므로 메모리에 먼저 올라간다. 따라서, classA의 객체를 통해 생성하지 않는다.
2) static으로 선언된 필드와 메소드는 C클래스를 통해 객체 생성 없이 바로 접근 가능하다.
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
|
public class Main {
public static void main(String[] args) {
//바깥쪽 클래스의 객체를 먼저 생성
A a = new A();
//인스턴스 멤버 클래스 객체 생성
A.B b = a.new B();
b.field1 = 3;
b.method1();
//정적 멤버 클래스 객체 생성
A.C c = new A.C();
c.field1 = 3;
c.field2 = 4;
c.method1();
c.method2();
//클래스를 통해서는 field1, method1 접근 불가...static field, static method가아니므로 객체를 통해서만 접근가능.
A.C.field2 = 3;
A.C.method2();
//로컬 클래스 객체 생성을 위한 메소드 호출
a.method();
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
코드를 실행해보면 아래와 같이 class A 의 메소드가 실행된 후에 D의 객체가 생성됨을 확인할 수 있다.

'IT > Java' 카테고리의 다른 글
15_자바 예외 처리 : try-with-resources, 사용자 정의 예외 클래스 (0) | 2019.12.13 |
---|---|
14_자바 예외 : 에러(Error)와 예외(Exception), 자바 예외의 종류 (0) | 2019.12.13 |
12_인터페이스(interface) : 인터페이스의 구성, 다중인터페이스 (0) | 2019.12.11 |
11_상속(inheritance) : 다형성(Polymorphism), 자동형변환(Promotion), 강제형변환(Casting), instanceof 연산자, 추상클래스(abstract class) (0) | 2019.12.10 |
10_상속(Inheritance) : 클래스 상속, 메소드 재정의(@Override) (0) | 2019.12.09 |