익명 객체 (Anonymous Object, 익명 클래스)
익명 객체란 이름이 없는 객체를 말한다. 익명 객체는 명시적으로 클래스를 선언하지 않기 때문에 쉽게 생성할 수 있으며, 주로 1회성으로 사용되거나 간단한 작업을 수행할 때 생성된다.
익명 객체는 일반적으로 두 가지로 분류할 수 있으며, 클래스를 상속해서 만드는 경우를 '익명 자식 객체'라 말하고, 인터페이스를 구현해서 인스턴스를 생성하는 것을 '익명 구현 객체'라고 한다.
*참고* 익명 객체는 '익명 자식 객체'와 '익명 구현 객체', 두 가지 개념으로 분류되는 것이 아니다. 단지 익명 객체의 구현 방식에 차이가 있다는 것을 설명하기 위함이다.
익명 자식 객체 (익명 자식 클래스)
익명 자식 객체란, 기존 클래스의 하위 클래스를 익명으로 정의하고 객체를 생성하는 것을 의미한다.
Parent p = new Parent(){
// 익명 자식 객체 영역
// 필드
// 메서드
}
위와 같이 익명 자식 객체의 영역에는 익명 자식 객체가 가져야 할 필드와 메서드를 선언하며, 이들은 중괄호 블록 안에서만 사용할 수 있다. 주로 부모 클래스의 메서드를 오버라이드하는 코드가 온다.
다음은 익명 자식 객체를 활용한 예제이다.
C09anonymous.java
public class C09anonymous {
public static void main(String[] args) {
// anonymous class(익명 클래스)
// 클래스 상속, 인스턴스 생성을 동시에
MyClass09 o1 = new MyClass09(){
// 이름이 없는 익명 자식 클래스의 영역
// field
// method
// 생성자는 사용할 수 없다.
@Override
void method1() {
System.out.println("C09anonymous.method1");
}
};
o1.method1(); // 출력 결과 C09anonymous.method1
}
}
MyClass09.java
class MyClass09{
void method1(){
System.out.println("MyClass.method1");
}
}
위 예제는 MyClass09 클래스를 선언하고 main 메서드에서 MyClass09의 인스턴스 생성과 동시에, 익명 자식 객체를 생성하여 메소드 오버라이드를 하는 예제이다.
출력 결과는 재정의한 메소드의 내용이 출력되는 것을 알 수 있다.
추상클래스를 통한 익명 클래스 선언도 가능하며, 선언 방법은 다음과 같다.
C10anonymous.java
public class C10anonymous {
public static void main(String[] args) {
// 추상 클래스는 인스턴스 생성이 불가
// MyClass10 o = new MyClass10();
// 추상클래스의 익명 자식 클래스를 생성
MyClass10 o2 = new MyClass10(){
// 자식 객체 영역
};
}
}
abstract class MyClass10{}
추상 클래스는 직접적으로 인스턴스 생성이 불가하지만, 위 예제와 같은 방법으로 익명 자식 객체를 생성할 수 있다.
익명 구현 객체 (익명 구현 클래스)
익명 구현 객체는 기존 인터페이스를 구현하는 클래스를 익명으로 정의하고 객체를 생성하는 것을 의미한다.
MyInterface i = new MyInterface(){
// 익명 구현 객체 영
// 필드
//메서드
}
익명 구현 객체에서도 중괄호 블록 안의 필드와 메서드는 익명 구현 객체가 가져야 할 멤버로, 중괄호 블록 안에서만 사용이 가능하다. 익명 구현 객체는 인터페이스를 구현하는 하위 클래스이므로, 해당 인터페이스의 메서드를 모두 오버라이드해야 한다.
다음은 익명 구현 객체의 예이다.
// 인터페이스 생성
interface MyInterface11{
void method1();
}
public class C11interface {
public static void main(String[] args) {
// MyInterface11 o1 = new MyInterface11(); // 인터페이스는 인스턴스 생성이 불가하다.
MyInterface11 o2 = new MyInterface11() { // 익명 구현 객체를 생성
@Override
public void method1() { // 인터페이스 메서드 오버라이드
System.out.println("C11interface.method1");
}
};
o2.method1(); // 익명 객체 메서드 호출
}
}
위 예제에서 확인되는 바와 같이 class를 명시적으로 선언하지 않아도 익명 구현 객체를 활용하여 interface를 구현할 수 있다.
살펴본 바와 같이 익명 객체는 자바에서 코드를 간결하게 만들고, 특정 인터페이스를 구현하거나 부모 클래스의 메서드를 재정의할 때 효과적으로 사용되며, 코드의 가독성과 유지보수성을 향상시키는데 도움이 된다.
'Java' 카테고리의 다른 글
객체 지향 설계의 기본 :: 역할과 구현의 분리 (0) | 2023.09.25 |
---|---|
추상 클래스(abstract class) (0) | 2023.08.30 |
클래스와 객체, 변수 (0) | 2023.08.28 |
인스턴스와 변수 (0) | 2023.08.09 |
객체지향 프로그래밍(OOP) (0) | 2023.08.09 |