자바 - 익명 클래스
안녕하세요, 미래의 자바 마법사 여러분! 오늘 우리는 자바의 익명 클래스 세계로 흥미로운 여정을 떠납니다. 프로그래밍 초보자라도 걱정하지 마세요; 이 개념을 단계별로 안내해드리고, 많은 예제와 설명을 제공하겠습니다. 그麼, 시작해보겠습니다!
익명 클래스는 무엇인가요?
masquerade ball(마스querade ball)에서 모두가 마스크를 쓰고 있어서 누가 누구인지 알 수 없는 것을 상상해보세요. 자바의 익명 클래스는 그런 것과 비슷합니다 - 이름이 없는 클래스로, 코드의 마스크 뒤에 숨겨져 있습니다!
익명 클래스는 이름이 없는 특별한 종류의 내부 클래스로, new
키워드를 사용하여 선언하고 인스턴스화됩니다.
익명 클래스를 사용하는 이유는 무엇인가요?
- 일회성 사용에 적합합니다.
- 코드를 간결하게 유지하는 데 도움이 됩니다.
- 간단한 인터페이스를 구현하거나 클래스를 즉시 확장하는 데 완벽합니다.
익명 클래스 정의 방법
간단한 예제로 시작해보겠습니다:
interface Greeting {
void greet();
}
public class AnonymousClassDemo {
public static void main(String[] args) {
Greeting englishGreeting = new Greeting() {
@Override
public void greet() {
System.out.println("Hello, World!");
}
};
englishGreeting.greet();
}
}
이 예제에서 우리는 Greeting
인터페이스를 구현하는 익명 클래스를 만들었습니다. 이를 단계별로 설명해보겠습니다:
- 간단한
Greeting
인터페이스를 정의하고,greet()
메서드를 포함합니다. -
main
메서드에서Greeting
인스턴스를 익명 클래스를 사용하여 생성합니다. - 익명 클래스는
greet()
메서드의 구현을 제공합니다. -
englishGreeting
객체의greet()
메서드를 호출합니다.
이 코드를 실행하면 콘솔에 "Hello, World!"가 출력됩니다.
자바에서의 익명 내부 클래스 유형
자바에서는 세 가지 주요 유형의 익명 내부 클래스가 있습니다:
- 클래스를 확장하는 익명 클래스
- 인터페이스를 구현하는 익명 클래스
- 메서드/생성자 인자 내부에서 정의되는 익명 클래스
각각의 예제를 살펴보겠습니다:
1. 클래스를 확장하는 익명 클래스
abstract class Animal {
abstract void makeSound();
}
public class AnonymousClassExtend {
public static void main(String[] args) {
Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("Woof! Woof!");
}
};
dog.makeSound();
}
}
이 예제에서 우리는 추상 Animal
클래스를 확장하는 익명 클래스를 만들고, makeSound()
메서드의 구현을 제공합니다.
2. 인터페이스를 구현하는 익명 클래스
우리는 이미 첫 번째 예제에서 이를 본 적이 있지만, 다른 예제를 더 보겠습니다:
interface Calculatable {
int calculate(int a, int b);
}
public class AnonymousClassImplement {
public static void main(String[] args) {
Calculatable adder = new Calculatable() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
System.out.println("5 + 3 = " + adder.calculate(5, 3));
}
}
이 익명 클래스는 Calculatable
인터페이스를 구현하고, 두 수를 더하는 calculate()
메서드의 구현을 제공합니다.
3. 메서드/생성자 인자 내부에서 정의되는 익명 클래스
public class AnonymousClassArgument {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Anonymous thread is running!");
}
});
t.start();
}
}
여기서 우리는 Runnable
인터페이스를 직접 Thread
생성자의 인자로 구현하는 익명 클래스를 만듭니다.
익명 클래스 사용 시기
익명 클래스는 다음과 같은 경우에 특히 유용합니다:
- 인터페이스를 구현하거나 클래스를 확장해야 하는 일회성 사용이 필요할 때.
- 구현이 매우 짧고 간단할 때.
- 간단한 연산을 수행하기 위해 별도의 이름이 있는 클래스를 생성하고 싶지 않을 때.
그러나 익명 클래스를 여러 번 재사용하게 되면, 이름이 있는 클래스를 생성하는 것이 더 나을 수 있습니다.
익명 클래스의 제한 사항
익명 클래스는 강력하지만, 몇 가지 제한 사항이 있습니다:
- 동시에 하나의 인터페이스를 구현하거나 하나의 클래스를 확장할 수만 있습니다.
- 정적 초기화자나 멤버 인터페이스를 가질 수 없습니다.
- 생성자가 없기 때문에 생성자를 가질 수 없습니다.
결론
자바의 익명 클래스는 코드 속의 비밀 요원과 같습니다 - 그들은 들어와서 임무를 수행하고, 이름을 남기지 않고 사라집니다. 그들은 빠르고 일회성 사용을 위한 클래스를 만드는 강력한 도구로, 코드를 더 간결하고 가독성 있게 만들 수 있습니다.
기억하세요, 어떤 프로그래밍 개념이든, 연습이 완벽을 이루는 열쇠입니다. 자신만의 익명 클래스를 만들어 다양한 사용 사례를 실험해보세요. 얼마 지나지 않아, 진정한 자바 ninja처럼 익명 클래스를 사용할 수 있을 것입니다!
행복하게 코딩하세요, 그리고 익명 클래스들이 항상 "Hello, World!"로 여러분을 환영하기를 바랍니다!
Credits: Image by storyset