JAVA 80%

Anonymous object

lshjju 2025. 11. 5. 16:40

자바에서 코드를 가장 간결하게 만들어주는 기법 중 하나인 **익명 객체(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