익명 내부 클래스(Anonymous Inner Class)는 이름이 없는 클래스로, 객체를 생성하는 시점(instantiation)에 곧바로 정의하는 방식입니다. 별도의 클래스 파일을 만들 필요 없이 인터페이스나 추상 클래스를 즉석에서 구현할 수 있어, 한 번만 사용되는 간단한 구현체가 필요할 때 특히 유용합니다.
기본 개념
일반적인 클래스는 먼저 선언한 뒤 객체를 생성하지만, 익명 내부 클래스는 new 키워드와 함께 클래스 본문을 중괄호 { } 안에 직접 작성합니다. 이때 컴파일러는 자동으로 고유한 이름을 부여하며, 코드가 더 간결해지고 가독성이 향상됩니다.
예제 코드
아래 프로그램에서는 TutorialsPoint 인터페이스의 toString() 메서드를 익명 내부 클래스로 구현하고, 그 반환값을 콘솔에 출력합니다.
interface TutorialsPoint {
public String toString();
}
public class Main implements TutorialsPoint {
public static void main(String[] args) {
System.out.print(new TutorialsPoint() {
public String toString() {
return "Welcome to Tutorials Point";
}
});
}
}
실행 결과
Welcome to Tutorials Point
코드 설명
new TutorialsPoint() { ... } 부분이 바로 익명 내부 클래스입니다. 인터페이스 타입의 객체를 생성하면서 동시에 toString() 메서드를 오버라이딩했습니다. 생성된 객체는 System.out.print()에 전달되며, 출력 시 자동으로 오버라이딩된 toString() 메서드가 호출되어 문자열이 화면에 표시됩니다.
익명 내부 클래스를 사용하는 이유
익명 내부 클래스는 다음과 같은 상황에서 활용하면 좋습니다.
- 일회성 구현: 해당 인터페이스를 프로젝트 전체에서 한 번만 구현할 경우 불필요한 클래스 선언을 줄일 수 있습니다.
- 코드 간결화: 구현과 객체 생성을 한곳에서 처리하므로 코드 흐름을 파악하기 쉽습니다.
- 이벤트 리스너 처리: GUI 프로그래밍(Swing, AWT 등)에서 버튼 클릭 리스너 등을 등록할 때 널리 사용됩니다.
참고로 Java 8부터는 람다식(Lambda Expression)을 통해 함수형 인터페이스를 더욱 간결하게 구현할 수 있지만, 여러 추상 메서드를 가진 인터페이스를 구현할 때는 여전히 익명 내부 클래스가 유용합니다.