
익명 클래스란?
익명 클래스(Anonymous Class)는 이름이 없는 클래스로, 주로 한 번만 사용되는 특정 기능을 구현할 때 유용하다. 익명 클래스는 인터페이스를 구현하거나 추상 클래스를 확장하여 정의되며, 클래스 선언과 동시에 인스턴스를 생성한다.
익명 클래스의 특징
- 이름이 없음: 클래스 이름을 지정하지 않고 정의할 수 있다.
- 단일 사용: 보통 한 번만 사용되며, 인스턴스를 즉시 생성.
- 로컬 변수 접근: 자신이 정의된 메서드의 로컬 변수에 접근할 수 있지만, 해당 변수는 final이거나 실질적으로 final이어야 함
익명 클래스 예제 1
익명 클래스는 인터페이스나 추상 클래스를 구현할 때 사용된다. 예를 들어, Runnable 인터페이스를 구현하여 스레드를 생성하는 경우를 생각해보자.
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello, world!");
}
};
r.run();
이 코드는 Runnable 인터페이스를 구현하는 익명 클래스를 생성하고, run 메서드를 구현하여 "Hello, world!"를 출력한다.
# 람다 표현식을 사용한 방식
위 코드를 람다 표현식으로 더 간결하게 작성 가능
Runnable r = () -> System.out.println("Hello, world!");
r.run();
익명 클래스와 변수의 이름
익명 클래스는 이름이 없지만, 이를 참조하는 변수는 이름을 가질 수 있다. 이는 익명 클래스의 인스턴스를 참조하는 변수일 뿐, 클래스 자체의 이름은 여전히 없다는 것을 의미한다.
예제 2: Flyable 인터페이스 구현
public interface Flyable {
void fly(int numOfWings);
}
이 인터페이스를 구현하는 익명 클래스는 다음과 같다.
// Flyable 인터페이스 정의
public interface Flyable {
void fly(int numOfWings);
}
// 익명 클래스를 사용하여 Flyable 인터페이스 구현
public class Main {
public static void main(String[] args) {
Flyable flyingObject = new Flyable() {
@Override
public void fly(int numOfWings) {
System.out.println(numOfWings + "개의 날개를 가지고 납니다.");
}
};
// 메서드 호출
flyingObject.fly(2);
}
}
여기서 new Flyable() {} 부분이 익명 클래스를 정의하는 구문이다. 이 익명 클래스는 Flyable 인터페이스를 구현하고, fly 메서드를 오버라이드하여 정의한다. flyingObject는 익명 클래스의 인스턴스를 참조하는 변수이다. 이 코드에서 익명 클래스가 아니었다면, Flyable 인터페이스를 직접 인스턴스화하는 것은 불가능했을 것이다. 인터페이스는 구현체가 없기 때문에, 직접적으로 new 키워드를 사용하여 인스턴스화할 수 없다.
만일 위 예제를 익명 클래스가 아니게 구현했다면 다음의 코드가 되었을 것이다.
NamedFlyable 클래스 정의
public class NamedFlyable implements Flyable {
@Override
public void fly(int numOfWings) {
System.out.println(numOfWings + "개의 날개를 가지고 납니다.");
}
}
NamedFlyable 클래스 사용
public class Main {
public static void main(String[] args) {
Flyable flyingObject = new NamedFlyable();
flyingObject.fly(2);
}
}
결론
- 인터페이스는 그 자체로는 인스턴스화할 수 없다.
- 인터페이스를 인스턴스화하려면 이를 구현하는 구체적인 클래스를 작성해야 한다.
- 익명 클래스는 이러한 구체적인 클래스를 정의하고 인스턴스를 생성하는 간결한 방법이다.
- 익명 클래스가 아닌 경우, 명시적인 클래스를 작성한 후 그 클래스의 인스턴스를 생성해야 한다.
'개발 > java' 카테고리의 다른 글
일반 클래스, 람다식, 익명 클래스 예시 (0) | 2024.07.12 |
---|---|
Java의 람다 표현식 과 스트림 (0) | 2024.07.12 |
객체지향 프로그래밍의 4가지 요소(3) 다형성 (0) | 2024.07.12 |
객체지향 프로그래밍의 4가지 요소(2) 캡슐화 (0) | 2024.07.11 |
Java의 주요 키워드: this, static, super, final (0) | 2024.07.11 |
