중첩 클래스, 중첩 인터페이스

한 클래스가 여러 클래스와 관계를 갖을 땐 독립적으로 선언하는것이 좋다. 하지만 특정 클래스와 관계를 맺을 땐 내부에 선언하여 불필요한 관계 클래스를 감추고 코드의 복잡성을 감출 수 있게된다.

중첩클래스

중첩클래스는 크게 두가지로 나뉘는데 다음과 같다.
멤버클래스 - 클래스의 멤버로서 선언되는 중첩클래스. 멤버클래스는 static 여부에 따라 인스턴스 멤버클래스, 정적 멤버클래스로 나뉜다. 클래스나 객체가 사용중이면 언제나 재사용 가능.
로컬클래스 - 메소드 내부에서 선언되는 중첩클래스. 메소드 실행 시에만 사용되고 종료되면 없어진다.

다음은 인스턴스 멤버 클래스 사용예시이다.

NestedClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
class B{
B() { }
int filed;
//static int filed2; //static는 안되는데 그 이유를 생각해보자
void mehtod1(){}
//static void method2(){} //역시 static은 안된다.
}
}

// 사용방벙
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();

다음은 인스턴스 정적 멤버 클래스 사용예시이다.

static변수에 대한 이해가 필요하다.

NestedClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
static class C{
B() { }
int filed;
static int filed2; //static 가능
void mehtod1(){}
static void method2(){} //static 가능
}
}

A.C c = new A.C();
c.file1 = 3;
c.method1();
A.C.filed2 = 3;
A.C.method2();

다음은 로컬 클래스 사용예시이다.

주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.

NestedClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void method() {
class D {
D() {}
int filed1;
//static int filed2; //static 안된다.
void method1() {}
//static void method2() {} //static 안된다.

}
D d = new D();
d.field1 = 3;
d.method1();
}

Share