어제 오늘 내일

[Java] 익명 클래스(anonymous class) 사용 예제 본문

IT/Java

[Java] 익명 클래스(anonymous class) 사용 예제

hi.anna 2025. 12. 29. 09:22

Java의 익명 클래스(anonymous class)는 이름이 없는 클래스이며,
일회성 동작을 만들 때 매우 유용합니다.
특히 인터페이스 구현, 추상 클래스 상속, 콜백 처리, 이벤트 핸들러 등에서 널리 사용됩니다.

익명 클래스는 “클래스를 만들고 → 객체 생성”의 과정을 한 번에 처리할 수 있는 간결한 방식입니다.

 

1. 익명 클래스 기본 형태

익명 클래스는 보통 인터페이스나 추상 클래스의 구현을 즉석에서 정의할 때 사용합니다.

형식:

타입 변수 = new 타입() {
    // 메서드 재정의(오버라이딩) 필요
};

 

2. 인터페이스 구현 예제

가장 일반적인 사용 방식입니다.

interface Greeting {
    void hello();
}

public class Main {
    public static void main(String[] args) {
        Greeting g = new Greeting() {
            @Override
            public void hello() {
                System.out.println("Hello from anonymous class");
            }
        };

        g.hello();
    }
}

설명

  • Greeting 인터페이스를 구현한 익명 클래스 생성
  • 별도의 구현 클래스를 만들지 않고 바로 오버라이딩

 

3. 추상 클래스 상속 예제

추상 클래스의 일부 메서드만 빠르게 구현할 때도 사용됩니다.

abstract class Animal {
    abstract void sound();
}

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal() {
            @Override
            void sound() {
                System.out.println("익명 클래스 동물 소리");
            }
        };

        a.sound();
    }
}

설명

  • Animal을 상속한 클래스를 즉석에서 생성
  • 클래스 이름 없이 바로 구현

 

4. 콜백(Callback) 구조에서 사용

메서드에 동작을 전달해야 할 때 자주 활용됩니다.

interface Task {
    void run();
}

public class Main {
    static void execute(Task task) {
        task.run();
    }

    public static void main(String[] args) {
        execute(new Task() {
            @Override
            public void run() {
                System.out.println("작업 실행!");
            }
        });
    }
}

설명

  • execute() 함수에 익명 클래스를 전달해 콜백 역할 수행

 

5. 버튼 클릭 이벤트 예제 (GUI)

GUI(예: Swing)에서 이벤트 핸들러로 매우 많이 사용됩니다.

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("버튼 클릭됨!");
    }
});

설명

  • ActionListener 구현체를 따로 만들 필요 없이 익명 클래스로 간단히 처리

 

6. 익명 클래스에서 변수 사용 규칙

익명 클래스는 내부적으로 지역 변수를 복사해서 사용하기 때문에
해당 변수는 **effectively final(실질적으로 final)**이어야 합니다.

void test() {
    int num = 10;

    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println(num);
        }
    };
}

num을 변경하면 오류:

num = 20; // ❌ 변경 불가

 

7. 익명 클래스가 유용한 상황

  • 특정 기능을 한 번만 구현하면 될 때
  • 불필요하게 새로운 클래스를 만들기 싫을 때
  • 인터페이스 구현, 이벤트 처리, 콜백 등에서 빠르게 동작 정의하고 싶을 때
  • 코드 가독성을 높이고 파일을 줄이고 싶을 때

 

8. 정리

  • 익명 클래스는 이름 없는 클래스 + 객체 생성을 동시에 하는 기능
  • 인터페이스 구현, 추상 클래스 상속을 간편하게 처리
  • 콜백, 이벤트 처리에서 특히 많이 사용
  • 지역 변수는 effectively final이어야 사용 가능

 

 

반응형
Comments