익명 클래스(anonymous class)는 새로운 클래스에 대한 이름을 짓지 않고 클래스, 인터페이스, 추상 클래스를 확장·구현하는 방법이다. 새로운 클래스를 정의하지 않아도 확장·구현 가능한 장점이 있어서 일회성 인스턴스 생성에 유용하다. 함수형 인터페이스를 구현하는 경우 Java 8부터 람다 표현식을 사용해 익명 클래스보다 간결하게 표현할 수 있다.
익명 클래스의 적용 사례
다음 예제는 Vehicle 인터페이스를 구현한 익명 클래스를 정의하고 Vehicle 자료형의 변수 car에 익명 클래스의 인스턴스를 할당한다.
// Main.java
interface Vehicle {
void turnOn();
void turnOff();
}
public class Main {
public static void main(String[] args) {
Vehicle car = new Vehicle() {
@Override
public void turnOn() {
System.out.println("자동차의 시동을 겁니다.");
}
@Override
public void turnOff() {
System.out.println("자동차의 시동을 끕니다.");
}
};
car.turnOn(); // "자동차의 시동을 겁니다." 출력
car.turnOff(); // "자동차의 시동을 끕니다." 출력
}
}다음 예제는 Person 클래스를 확장한 익명 클래스를 정의하고 Person 자료형의 변수 doctor에 익명 클래스의 인스턴스를 할당한다. 익명 클래스는 examine 메서드를 추가로 포함했지만 변수 doctor는 Person 타입이므로 examine 메서드 호출 시 오류가 발생한다.
class Person {
String name;
Person(String name) {
this.name = name;
}
void say() {
System.out.println("저는 " + this.name + "입니다.");
}
}
public class Main {
public static void main(String[] args) {
Person doctor = new Person("홍길동") {
@Override
void say() {
System.out.println("저는 의사 " + this.name + "입니다.");
}
void examine() {
System.out.println("환자를 진찰하고 있습니다.");
}
};
doctor.say(); // "저는 의사 홍길동입니다." 출력
doctor.examine(); // java: cannot find symbol 오류
}
}