메뉴 닫기

JAVA 익명 클래스 완벽 이해와 실전 예제 정리


JAVA 익명 클래스 완벽 이해와 실전 예제 정리

📌 람다식이 나오기 전까지 자바 개발자들이 애용하던 익명 클래스, 지금도 여전히 유용합니다

자바를 공부하다 보면 ‘익명 클래스(Anonymous Class)’라는 개념을 접하게 됩니다.
이름 그대로 클래스 이름 없이 일회성으로 정의되는 이 기능은, 특히 자바 8 이전 버전에서 매우 활발하게 사용되었죠.
인터페이스나 추상 클래스를 구현할 때 코드를 간결하게 만들어주고, 이벤트 처리나 쓰레드 정의 등 실무에서도 자주 활용되어 왔습니다.

요즘은 람다 표현식이 많이 보급되면서 익명 클래스의 자리를 대체한 부분도 있지만, 여전히 특정 상황에서는 익명 클래스가 더 적합한 경우도 많습니다.
이번 글에서는 자바의 익명 클래스가 어떤 개념인지, 언제 사용하는 게 좋으며 실제로 어떤 식으로 코드를 작성하는지까지 친절하게 정리해드릴게요.







🔗 익명 클래스란 무엇인가요?

자바에서 익명 클래스(Anonymous Class)는 이름이 없는 일회용 클래스로, 주로 인터페이스나 추상 클래스를 즉석에서 구현해야 할 때 사용됩니다.
말 그대로 이름 없이 정의되기 때문에 한 번만 사용할 목적의 클래스를 작성할 때 매우 유용합니다.

익명 클래스는 다음과 같은 특징을 가집니다.
클래스 이름이 없고, 객체를 생성하면서 동시에 클래스도 정의합니다.
이러한 구조 덕분에 코드가 간결해지고, 이벤트 처리나 콜백 구현처럼 간단한 작업을 빠르게 처리할 수 있죠.

💎 핵심 포인트:
익명 클래스는 주로 이벤트 처리, 쓰레드 생성, 간단한 인터페이스 구현 시 사용되며, 코드의 간결성과 일회성에 초점을 맞춥니다.

예를 들어, 버튼 클릭 이벤트를 처리할 때 익명 클래스를 사용하면 별도의 클래스를 만들지 않고도 동작을 정의할 수 있습니다.
자바 8 이전에는 람다 표현식이 없었기 때문에, 이러한 간단한 동작을 구현할 때 익명 클래스가 필수적으로 사용되었습니다.

지금도 여전히 익명 클래스는 람다로 대체하기 어려운 구조에서 유용하게 활용됩니다.
특히 복잡한 로직이 필요한 경우에는 익명 클래스가 더 나은 선택이 되기도 하죠.


🛠️ 익명 클래스의 문법과 구조

익명 클래스는 new 키워드를 사용하여 객체를 생성하면서, 동시에 클래스의 구현 내용을 작성하는 방식입니다.
주로 인터페이스추상 클래스를 구현할 때 사용되며, 이름 없는 새로운 클래스를 만들고 그 인스턴스를 즉시 사용하는 형태죠.

CODE BLOCK
// Runnable 인터페이스를 익명 클래스로 구현
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("익명 클래스 실행 중!");
    }
};
new Thread(task).start();

이처럼 익명 클래스는 특정 인터페이스나 클래스를 상속받으면서,
override 메서드를 바로 구현하는 패턴으로 작성됩니다.
굳이 외부 클래스를 따로 만들 필요가 없기 때문에, 코드가 훨씬 간단해지죠.

  • 🔸클래스 이름 없이 선언됨
  • 🔸객체 생성과 클래스 구현이 동시에 이뤄짐
  • 🔸인터페이스나 추상 클래스 기반 구현에 적합
  • 🔸단일 목적의 간단한 코드 작성에 이상적

이러한 문법은 자바 8 이전 버전에서 아주 흔하게 사용되었으며, 지금도 람다로 대체할 수 없는 복잡한 구조에서는 유용하게 쓰이고 있습니다.







⚙️ 자주 사용되는 활용 예시

익명 클래스는 인터페이스나 추상 클래스를 구현할 때 자주 사용됩니다.
특히 이벤트 처리나 쓰레드 생성, 콜백 함수 작성 등 실무에서 매우 유용하죠.
아래는 대표적인 사용 예시들입니다.

🖱️ 버튼 클릭 이벤트 처리

CODE BLOCK
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("버튼이 클릭되었습니다!");
    }
});

Swing 기반 GUI 애플리케이션에서 가장 흔하게 볼 수 있는 패턴입니다.
익명 클래스를 통해 코드가 간단하면서도 직관적으로 작성됩니다.

🧵 Runnable로 쓰레드 정의

CODE BLOCK
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("쓰레드 실행 중...");
    }
}).start();

익명 클래스를 통해 Runnable 인터페이스를 바로 구현하고 쓰레드를 실행할 수 있습니다.
이런 방식은 특히 단일 작업을 빠르게 처리할 때 유용합니다.

💎 핵심 포인트:
익명 클래스는 코드를 간소화하고 파일 분리를 줄이는 데 효과적입니다.
단, 복잡한 로직이 필요한 경우에는 별도 클래스로 분리하는 것이 더 바람직합니다.


🔌 익명 클래스 vs 람다 표현식

자바 8이 도입되면서 람다 표현식(Lambda Expression)이 등장하게 되었고, 익명 클래스의 자리를 대체하는 데 큰 역할을 했습니다.
두 문법 모두 코드 간소화를 목표로 하지만, 성격과 사용 방식에는 분명한 차이가 존재합니다.

항목 익명 클래스 람다 표현식
지원 시점 자바 1.1부터 자바 8부터
형태 클래스를 직접 구현 함수형 인터페이스만 구현
this 키워드 익명 클래스 자신을 가리킴 외부 클래스의 this 사용
가독성 복잡한 편 간결함

익명 클래스는 여전히 람다로 대체할 수 없는 기능을 포함하고 있습니다.
예를 들어, 두 개 이상의 메서드를 가진 추상 클래스를 구현해야 하거나, 상태를 내부적으로 유지해야 하는 경우에는 익명 클래스가 더 적합합니다.

⚠️ 주의: 람다 표현식은 오직 하나의 메서드를 갖는 함수형 인터페이스에서만 사용 가능합니다. 구조가 복잡해질 경우에는 익명 클래스를 고려하는 것이 좋습니다.

결국 익명 클래스와 람다는 용도에 따라 선택하는 것이 가장 좋습니다.
단순한 기능 구현에는 람다를, 다소 구조적인 설계에는 익명 클래스를 선택하는 유연한 판단이 필요합니다.







💡 언제 익명 클래스를 써야 할까?

익명 클래스는 코드의 길이를 줄이고 간단한 기능을 빠르게 구현할 수 있는 장점이 있지만, 모든 상황에 적합한 것은 아닙니다.
그렇다면 어떤 경우에 익명 클래스를 사용하는 것이 효과적일까요?

  • ✔️해당 기능이 단 한 번만 사용될 경우
  • ✔️클래스를 외부로 노출하지 않아야 할 때
  • ✔️코드를 간결하고 직관적으로 유지하고 싶을 때
  • ✔️상태를 내부에서 유지해야 할 필요가 있을 때

반대로 코드가 길어지고 복잡해질 경우, 또는 여러 번 재사용해야 하는 로직이라면 익명 클래스보다는 별도 클래스로 분리하는 것이 유지보수 측면에서 훨씬 낫습니다.

💎 핵심 포인트:
익명 클래스는 일회성 구현이 필요한 순간에 강력한 도구입니다.
그러나 설계의 명확성이 요구되는 상황에서는 사용을 자제하고 구조화된 클래스를 선택하는 것이 더 적절합니다.

무조건 간결한 코드가 좋은 건 아닙니다.
필요한 곳에 필요한 문법을 사용하는 것이 진짜 고수의 선택입니다.


자주 묻는 질문 (FAQ)

익명 클래스는 언제 쓰는 게 좋나요?
클래스가 한 번만 쓰이거나 간단한 기능만 구현할 때 익명 클래스를 사용하는 것이 효율적입니다.
익명 클래스와 람다 표현식의 차이는 무엇인가요?
람다는 함수형 인터페이스에만 사용할 수 있고 문법이 더 간결합니다. 익명 클래스는 좀 더 유연하게 클래스 구조를 가질 수 있습니다.
람다로는 구현할 수 없고 익명 클래스로만 가능한 게 있나요?
네, 두 개 이상의 메서드를 오버라이드하거나 상태를 유지해야 할 경우는 람다가 아닌 익명 클래스를 사용해야 합니다.
익명 클래스는 성능에 영향을 주지 않나요?
일반적인 상황에서는 거의 차이가 없지만, 너무 많은 익명 클래스가 생성되면 클래스 수가 늘어나 성능에 간접적인 영향을 줄 수 있습니다.
익명 클래스 안에서는 어떤 변수들을 사용할 수 있나요?
외부 메서드의 지역 변수 중 final 또는 effectively final 변수만 접근 가능합니다.
익명 클래스 안에서 this 키워드는 무엇을 가리키나요?
익명 클래스 자기 자신을 가리킵니다. 외부 클래스의 this를 참조하려면 클래스명.this 형태를 사용해야 합니다.
자바 17 이후에도 익명 클래스는 여전히 사용되나요?
네, 여전히 사용됩니다. 특히 람다로 대체할 수 없는 복잡한 인터페이스 구현이 필요한 경우에 적합합니다.
익명 클래스는 다른 클래스 안에서도 만들 수 있나요?
네, 메서드 안이나 초기화 블록, 생성자 내부에서도 익명 클래스를 정의할 수 있습니다.



📌 익명 클래스를 이해하면 자바가 더 쉬워집니다

익명 클래스는 자바의 객체지향적 특성을 유지하면서도 코드를 간결하게 작성할 수 있게 도와주는 강력한 기능입니다.
특히 일회성 구현이나 이벤트 처리처럼 단발성 작업이 많을 때 그 진가를 발휘하죠.
자바 8 이후에는 람다 표현식이 도입되며 많은 부분을 대체했지만, 여전히 람다로 해결할 수 없는 구조에는 익명 클래스가 꼭 필요합니다.

이번 글에서는 익명 클래스의 개념부터 구조, 사용 예시, 람다와의 비교, 그리고 실전에서 언제 사용하는 게 좋은지까지 차근차근 정리해 보았습니다.
실무에서도 여전히 유용하게 쓰이는 만큼, 상황에 따라 유연하게 선택할 수 있는 기준을 갖추는 것이 중요합니다.
이제 익명 클래스에 대한 감이 좀 잡히셨나요?
여러분의 자바 코딩 실력에 확실한 도움이 되었기를 바랍니다.


🏷️ 관련 태그 : java익명클래스, 자바인터페이스, 람다표현식비교, 이벤트핸들링, Runnable사용법, 자바기본문법, 클래스정리, 자바8문법, 객체지향예제, 자바코딩팁