자바에서 코드를 가장 간결하게 만들어주는 기법 중 하나인 **익명 객체(Anonymous Object)**에 대해 알아보겠습니다.
익명 객체는 이름 그대로 **'이름이 없는 객체'**입니다.
클래스를 별도로 정의하지 않고, 만드는 시점에 딱 한 번만 사용하고 버릴 때 아주 유용합니다.
📘 익명 객체: "이름 없는 일회용 도구"
1. Anonymous Child Object (익명 자식 객체)
- 설명: 부모 클래스를 상속받아 일부분(메서드)만 재정의(Override) 하여 즉석에서 만드는 객체입니다.
- 비유: 기존의 표준 레시피(부모 클래스)가 있지만, 지금 이 순간만 특별한 재료를 추가한 '오늘의 특선 요리'를 만드는 것과 같습니다.
- 특징: 클래스 파일(.java)을 따로 만들지 않고 코드를 작성하는 위치에서 바로 생성합니다.
Java
class Person {
void wake() { System.out.println("7시에 일어납니다."); }
}
public class AnonymousChildExample {
public static void main(String[] args) {
// 익명 자식 객체 생성
Person person = new Person() {
@Override
void wake() {
System.out.println("오늘은 휴일이라 10시에 일어납니다.");
study(); // 익명 객체 내부에서 정의한 메서드
}
void study() { System.out.println("자바를 공부합니다."); }
};
person.wake();
// person.study(); // (주의) 부모 타입 변수로는 익명 객체 내부의 메서드에 접근 불가!
}
}
2. Anonymous Implementation Object (익명 구현 객체)
- 설명: 인터페이스를 구현(implements) 하는 클래스를 따로 만들지 않고, 인터페이스의 추상 메서드를 즉석에서 구현하여 만드는 객체입니다.
- 비유: '리모컨 버튼을 누르면 동작한다'는 약속(인터페이스)에 대해, 구체적인 동작(TV 켜기 등)을 그때그때 정의해서 쓰는 것입니다.
- 특징: 안드로이드나 웹 프레임워크에서 버튼 클릭 이벤트 등을 처리할 때 가장 많이 쓰이는 방식입니다.
Java
interface RemoteControl {
void turnOn();
}
public class AnonymousImplementExample {
public static void main(String[] args) {
// 익명 구현 객체 생성
RemoteControl rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("TV를 켭니다.");
}
};
rc.turnOn();
}
}
3. 익명 객체 (Anonymous Object) 총정리
- 이름이 없다: 클래스 이름이 없으므로 생성자를 가질 수 없습니다.
- 일회용이다: 한 번 만들어진 익명 객체는 재사용할 수 없으며, 해당 위치에서만 쓰입니다.
- 필드와 메서드: 내부에서 필드와 메서드를 선언할 수는 있지만, 익명 객체 밖(부모 타입의 변수)에서는 접근할 수 없습니다.
👨🏫 실무 꿀팁: 람다(Lambda)와의 관계
자바 8부터는 인터페이스의 추상 메서드가 하나뿐인 경우(함수형 인터페이스), 위에서 배운 긴 익명 구현 객체 코드를 다음과 같이 단 한 줄로 줄일 수 있습니다.
기존: new RemoteControl() { public void turnOn() { ... } } 람다: () -> System.out.println("TV를 켭니다.")
오늘의 요약
- 익명 자식 객체: 부모 클래스를 상속받아 즉석에서 메서드를 고쳐 쓴다.
- 익명 구현 객체: 인터페이스의 약속을 즉석에서 구현해서 사용한다.
- 핵심 목적: 코드를 간결하게 만들고, 일회성 객체 관리를 편하게 하기 위함이다.
자바의 유연함을 보여주는 익명 객체의 개념을 완벽히 이해하셨습니다!

'JAVA 80%' 카테고리의 다른 글
| Collection framework (0) | 2025.11.05 |
|---|---|
| Thread control (0) | 2025.11.05 |
| java.util package (0) | 2025.11.05 |
| java.lang package (0) | 2025.11.05 |
| Nested class and Nested interface (0) | 2025.10.08 |