익명 클래스(Anonymous Class)는 이름이 없는 일회성 클래스로, 주로 인터페이스나 추상 클래스의 인스턴스를 생성하기 위해 사용됩니다. 익명 클래스는 특정 메서드 내에서 간단히 정의하고 사용할 수 있어, 간결하고 명확하게 특정 기능을 구현하는 데 유용합니다.
InterfaceType instance = new InterfaceType() {
// 구현해야 할 메서드들
};
이러한 형태는 인터페이스나 추상 클래스를 직접 구현 또는 확장하여 인스턴스를 생성하는 방법입니다. 익명 클래스는 클래스 정의와 인스턴스 생성을 동시에 처리합니다.
아래의 분석하고, 익명 클래스의 사용 이유를 설명하겠습니다.
package nested.anonymous;
import nested.local.Printer;
public class AnonymousOuter {
private int outInstanceVar = 3;
public void process(int paramVar) {
int localVar = 1;
// 익명 클래스 정의 및 인스턴스 생성
Printer printer = new Printer() {
int value = 0;
@Override
public void print() {
System.out.println("value=" + value);
System.out.println("localVar=" + localVar);
System.out.println("paramVar=" + paramVar);
System.out.println("outInstanceVar=" + outInstanceVar);
}
};
// 익명 클래스의 메서드 호출
printer.print();
System.out.println("printer.class=" + printer.getClass());
}
public static void main(String[] args) {
AnonymousOuter main = new AnonymousOuter();
main.process(2);
}
}
익명 클래스는 다음과 같은 특징을 가집니다:
간단한 일회성 구현:
코드의 간결성:
로컬 변수 접근:
final 또는 사실상 final인 로컬 변수에도 접근할 수 있습니다.외부 클래스 멤버:
AnonymousOuter 클래스에는 인스턴스 변수 outInstanceVar가 있습니다.process 메서드:
process는 매개변수 paramVar와 로컬 변수 localVar를 가집니다.Printer 인터페이스를 구현하는 익명 클래스가 정의되고 인스턴스가 생성됩니다.익명 클래스 정의:
Printer 인터페이스를 구현하는 익명 클래스가 Printer 변수에 할당됩니다.print 메서드를 오버라이드하여 특정 작업을 수행합니다.localVar, paramVar, outInstanceVar에 접근할 수 있습니다.익명 클래스 메서드 호출:
printer.print()를 호출하여 익명 클래스의 print 메서드를 실행합니다.printer.getClass()를 통해 익명 클래스의 실제 클래스를 확인할 수 있습니다.익명 클래스의 print 메서드를 실행하면 다음과 같은 출력이 예상됩니다:
value=0
localVar=1
paramVar=2
outInstanceVar=3
printer.class=class nested.anonymous.AnonymousOuter$1
익명 클래스는 간단한 인터페이스 구현이나 추상 클래스의 확장을 위해 사용되며, 코드의 간결성과 가독성을 높이는 데 유용합니다. 주로 특정 메서드 내에서 일회성으로 사용되며, 외부 클래스의 멤버와 로컬 변수에 쉽게 접근할 수 있는 장점이 있습니다.