중첩클래스는 필드나 메소드가 클래스 내부에 정의될 수 있듯이 클래스가 다른 클래스의 멤버로 정의될 수 있는 기능을 의미한다. 코드 블록에서 변수를 정의 하듯이 클래스를 코드블록 내부에서 정의할 수도 있다.
중첩클래스의 종류에는 최상위 클래스,멤버 클래스, 지역 클래스, 익명 클래스가 있다.
중첩클래스는 보통 nested class라고 하는데 이는 inner class보다 한차원 발전된 개념이다.그러나 이해 측면에서는 같은 것이라고 생각해도 무방하다.
최상위 클래스(패키지 멤버 클래스,중첩된 최상위 클래스) 와 inner class(멤버 클래스,지역 클래스,익명 클래스)를 합쳐서 중첩 클래스라한다.
그러니까 중첩클래스가 익명 클래스보다 광의의 개념이다.
그럼 본론으로 들어가서 inner class의 기능과 특징에 대해서 알아보자.
외향상으로 볼때는 X$Y.class 이렇게 생겼다. X.class 속에 들어있는 Y.class를 말하는 것이다.
1.멤버 클래스 : 마치 멤버 변수처럼 사용하기 위해서 사용되어지면 외부 클래스의 변수까지 참조 할수 있기 때문에 static으로 써지지 않는다. 물론 변수뿐 아니라 외부 클래스의 멤버 클래스까지 참조 할 수 있다. 이때 외부클래스의 참조할 변수가 private로 선언되었다 하더라도 이를 자유로이 참조할 수 있다.
클래스의 내부의 변수는 모두 this가 생략되어 있다. 만약 this를 명시적으로 써주어야 할경우가 있다.
ex)
public class LinkedList {
private Linkable head;
private class Enumerator implements Iterator{}
}
여기서
public Enumerator() {this.current = this.head;} ====> 이것은 잘 못되었다.
왜냐하면 this가 LinkedList를 말하는 것인지 Enumerator를 말하는 것인지 헤깔리기 때문이다.
이때는
public Enumerator() {this.current = LinkedList.this.head;}
이렇게 해주어야 맞다.
참고로 inner class의 객체생성 코드는 다음과 같다.
LinkedList aList = new LinkedList();
Enumerator anEnum = aList.new Enumerator();
2. 지역 클래스
한마디로 메소드안에 클래스가 구현되어있는 것을 말한다.
위의 예제 코드와 비교해보라.
public class LinkedList {
private Linkable head;
public Iterator enumerate() {
class Enumerator implements Iterator{}
}
}
지역 클래스는 그들이 정의된 코드 블록 내부에서만 가시적으로 블록 외부에서는 참보불가
final로 선언된 지역변수와 인수사용가능하며 물론 자바에서 지역변수와 인수를 final로 선언할 수 있기에 가능한 것이다.
3. 익명클래스
익명클래스는 extends절을 기술할 수 없다. 항상 Object의 서브클래스가 된다.
익명 클래스는 명칭이 없으므로 생성자를 정의할 수 없다.
보통
클래스의 내부가 매운 단순할 경우
그 클래스의 인스턴스가 단 하나만 필요할 경우
클래스가 정의된 직후에 곧바로 사용될 경우
클래스의 이름이 없더라도 이해에 별 문제가 되지 않을 경우
이런때 지역클래스보다 익명클래스를 사용하는 것이 좋다.
'Education > Bit 18th' 카테고리의 다른 글
간단한 메신져 프로그램 (0) | 2009.09.24 |
---|---|
선비 프로젝트 (0) | 2009.09.24 |
선문비트 프로그램 - 첫째날 - (0) | 2009.09.21 |
Boxing과 unBoxing (0) | 2009.09.20 |
If와 Switch (0) | 2009.09.19 |
댓글