내부 클래스
정의
구문법
의미
내부 클래스는 왜 필요할까?
내부 클래스는 외곽 클래스로 통하는 통로를 제공한다고 할 수 있다.
각 내부 클래스는 독자적으로 구현, 상속(클래스 상속)을 받을 수 있다.
따라서 외곽 클래스가 상속받은 것과는 별개로 또 다른 클래스로부터 상속받을 수 있다.
특성
1. 내부 클래스는 자신의 인스턴스를 여러 개 가질 수 있다. 그리고 각 인스턴스는 외곽 클래스의 객체가 갖는 정보와는 무관하게 자신만의 정보를 갖는다.
2. 하나의 외곽 클래스는 여러 개의 내부 클래스를 가질 수 있으며, 각 내부 클래스는 동일한 인터페이스나 클래스로부터 서로 다른 방법으로 상속받을 수 있다.
3. 내부 클래스의 객체는 외곽 클래스의 객체와 서로 다른 시점에 생성할 수 있다.
4. 내부 클래스는 외곽 클래스와는 독립적이다.
클로저 & 콜백
클로저(closure)는 호출 가능한 객체로서, 자신이 속해있는 유효 범위 내에서 생기는 정보를 가질 수 있는 것을 말한다.
콜백(callback)은 다른 객체에 대한 정보를 가지고 있어서 객체간의 제어 이동이다. 일종의 포인터 매커니즘.
장점
클래스에 다른 클래스를 포함함으로써 코드를 감춘다.
내부 클래스는 인터페이스와 같이 사용할 때 그 진가를 발휘 한다.
내부 클래스를 private 으로 지정하면, 멤버 변수와 마찬가지로 내부 클래스의 구현 부분을 감출 수 있다.
그리고 private 내부 클래스에서 인터페이스를 implements하면, 이 interface에 제공된 public 메소드를 통해서만 액세스 가능
메소드 내부나 코드 블록{}내에서 내부 클래스 사용
1. 특정 인터페이스를 구현하는 내부 클래스의 객체를 생성한 후 그 참조를 리턴 시킬 수 있도록 하기 위해서 사용
2. 어떤 까다로운 문제의 해결을 위해서 클래스를 만들 필요가 있지만, 만들고자 하는 클래스의 접근을 일정 범위 내로 제한하고자 할 때 사용
익명 내부 클래스 사용
익명의 내부 클래스ㅡ 객체를 생성할 때, 객체의 초기화를 할 필요가 있다면?
- 필드를 정의할 때 초기화해주면 된다.
ex) public class Parcel8 {
public Destination dest(final String dest) {
return new Destination() {
private String label = dest;
public String readLabel() {return label;}
};
}
}
ex) public class Parcel9 {
public Destination dest(final String dest, final float price) {
return new Destination() {
private int cost;
// 인스턴스 초기화 블록
{
cost = Math.round(price);
if(cost>100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() {return label;}
};
}
}
내부 클래스를 상속받기 위해서는 외곽클래스의 객체 참조를 생성자 앞에 붙여줘야 한다.
ex)
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
inheritInner ii = new InheritInner(wi);
}
}
내부 클래스는 오버라이딩 할 수 없다.
'Dev. 자바 > API 및 이론' 카테고리의 다른 글
[JAVA] Network 한눈에 보기(URL, InetAddress, Socket, DatagramSocket 등) (0) | 2013.01.24 |
---|---|
[JAVA] 쓰레드(Thread)의 기초 및 이론, 활용, 응용, 예제 (2) | 2013.01.23 |
자바 예외(Exception)의 계층구조 및 자주 보이는 예외 설명 (0) | 2012.09.17 |
[JAVA API] java.net.InetAddress (0) | 2012.09.06 |
[JAVA API] java.net.URL (0) | 2012.09.06 |