익명 이너 클래스
익명 이너 클래스의 정의와 특징
말 그대로 ‘이름을 알 수 없는 이너 클래스’를 의미한다. 익명 이너 클래스는 정의된 위치에 따라 분류할 수 있다. 클래스의 중괄호 바로 아래에 사용했을 때는 인스턴스 익명 이너 클래스
interface C {
void bcd();
}
class A1 {
C b = new B();
// 인스턴스 이너 클래스
class B implements C {
void bcd() {
}
}
void abc() {
// ...
}
}
메서드 내부에서 사용했을 때는 지역 익명 이너 클래스를 의미한다.
class A2 {
// C를 상속받아 bcd() 메서드를 오버라이딩한 익명 이너 클래스의 객체
C b = new C() {
void bcd() {
}
};
void abc() {
// ...
}
}
익명 이너 클래스를 활용한 인터페이스 타입의 입력 매개변수 전달
인터페이스 타입의 입력매개변수로 익명 이너 클래스를 이용해 생성한 객체를 전달하는 방법
예제) interface A에는 추상메서드 abc(), 클래스 C에는 A 타입을 매개변수로 받는 def(A a)가 있다.
- 클래스 C의 객체를 생성한 후 def(A a) 메서드를 호출하기 위해서는 A 타입의 객체를 생성해야 한다.
- 인터페이스로는 객체를 직접 생성할수 없음 -> A를 구현한 자식 클래스의 객체가 있어야 한다.
interface A {
void abc();
}
class C {
void def(A a) {
a.abc();
}
}
class B implements A {
@Override
public void abc() {
// ...
}
}
public class Test {
public static void main(String[] args) {
C c = new C();
// 1. A를 구현한 자식클래스 B를 생성자를 통해 변수에 저장하고 메서드에 전달
A a1 = new B();
c.def(a1);
// 2. A를 구현한 자식클래스 B를 생성자를 메서드에 직접 전달
c.def(new B());
// 3. 익명 이너클래스를 사용해 객체를 생성하고, 참조 변수 a를 메소드에 전달
A a = new A() {
@Override
public void abc() {
//
}
};
c.def(a);
// 4. 참조변수를 전달하지 않고 곧바로 익명 이너 클래스 객체를 생성해 전달
c.def(new A() {
@Override
public void abc() {
//
}
});
}
}
댓글남기기