내부클래스 :: 소림사의 홍반장!

내부클래스

2013. 1. 22. 15:56 - 삘쏘굿

내부 클래스

 

 

정의

 

 

 

구문법

 

 

의미

내부 클래스는 왜 필요할까?

내부 클래스는 외곽 클래스로 통하는 통로를 제공한다고 할 수 있다.

각 내부 클래스는 독자적으로 구현, 상속(클래스 상속)을 받을 수 있다.

따라서 외곽 클래스가 상속받은 것과는 별개로 또 다른 클래스로부터 상속받을 수 있다.

 

 

특성

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 및 이론 카테고리의 포스트를 톺아봅니다