Nested Class 란?
class 내부 또는 메소드에 class를 정의할 수 있는데, 이를 nested(중첩) class라고 한다.
왜 Nested Class를 사용하는가?
- Logical group of classes
class A가 Class B에서만 사용될 경우, A를 B에 내장하여 유지하는 것이 바람직하다.
- Increased encapsulation
두개의 class A와 B에 대하여, A가 B의 private 멤버(field, method)에 접근할 필요가 있을경우, A를 B의 안에 만들면 B의 멤버들을 private으로 만들면서 A에서 접근할 수있게 된다. 또한, A 자신은 캡슐화상태로 외부로부터 보호된다.
- More readable, Maintainable code
class A가 Class B에서만 사용될 경우, A를 B안에 정의하면 정의된 곳과 사용하는 곳이 가까이에 있기때문에 가독성과 유지보수성이 좋아진다.
Nested Class의 종류
* static inner class → Outer Class의 static 멤버만 접근가능
ex) class Outer {
public static class Inner {
}
}
Inner는 Outer의 인스턴스가 아닌 클래스와 연결된다. 즉 Inner는 Outer의 클래스 명을 사용하여 접근한다. 그리고 static 메소드/변수 처럼 Inner는 Outer의 인스턴스 필드와 메소드를 사용할 수 없다
* non-static inner class → Outer Class의 static/instance 멤버 모두 접근 가능
ex) class Outer {
private int a;
class Inner {
public void go() {
System.out.println(a);
}
}
}
Inner는 Outer의 인스턴스와 연결된다. 즉, Inner의 인스턴스는 Outer의 인스턴스 안에만 존재할 수 있으며 이로 인해 Inner는 Outer의 인스턴스 필드와 메소드를 직접 사용할 수 있다. 또한, Inner는 인스턴스와 연관되어 있기 때문에 static member를 가질 수 없다. Inner의 인스턴스는 Outer의 인스턴스를 통해서만 생성이 가능하다.
만약 class inner가 static 클래스일 경우 접근 go메소드에서 변수 a 접근 불가능
* method block 내에 정의 → 같은 메소드에 선언된 final local변수만 접근 가능
ex) class Outer {
int k = 30;
public void go() {
final int j = 20;
class Inner {
public void come() {
System.out.println(j);
}
}
}
}
익명 클래스(Anonymous Class)
- 객체 생성가 정의를 동시에 하는 class
- 구문 : Super s = new Super() → 부모 class(Interface)(type) {
void go() {
-----
}
}
'Wanna be a Programmer > Java Programming' 카테고리의 다른 글
Java Programming - String, StringBuffer, StringBuilder, DTO (0) | 2012.07.10 |
---|---|
Java Programming - Generic(제네릭), Object, Wrapper Class (0) | 2012.07.10 |
Java Programming - Map, Iterator (0) | 2012.07.09 |
Java Programming - Collection API, 배열 vs 컬렉션 (0) | 2012.07.04 |
Java Programming - Abstract vs Interface (0) | 2012.07.03 |