앞선 아티클에서 익명 인스턴스 형태로 자식 클래스를 정의해 사용하는 것을 배웠습니다. 실제 코드 작성 예제를 통해서 한번 살펴보도록 하겠습니다. 아래의 경우 일단 상위 부모 클래스인 Person에서 wake( )라는 메서드를 선언하고, Anonymous라는 클래스에 필드, 메서드의 로컬 변수, 메서드의 파라미터로 Person 클래스를 상속받는 익명의 자식 객체 인스턴스를 생성하게 됩니다.
각각의 익명 객체로 선언된 자식 객체들은 wake( )라는 공통의 메서드를 오버라이드하여 사용하게 되고, 각각 work, walk, study라는 고유의 자식 메서드를 사용하게 됩니다.
여기서 주의할 점, 이 익명 자식 객체에 새롭게 정의된 - wake( ) 이외의 필드나 메서드 - 의 경우에는 재정의된 wake( ) 메서드 안에서 사용이 가능하기 때문에 wake( ) 메서드 내부에서 해당 메서드를 실행하는 형태로 선언되어 있습니다. 이러한 형태로 자식 클래스의 익명 객체가 각각의 고유의 메서드를 실행하게 됩니다. 지난 아티클에서 확인한 예제를 다시 한번 상기하고 넘어가겠습니다.
public class A {
Parent field = new Parent() {
int childField;
void childMethod() {}
@Override
void parentMethod() {}
};
void method() {
// field.childField = 100;
// field.childMethod();
field.parentMethod();
}
}
다음 예제에서도 위의 패턴을 그대로 사용하니 주의하세요.
public class Person {
void wake() {
System.out.println("8시 기상");
}
}
public class Anonymous {
// 필드 초기값
Person field = new Person() {
void work() {
System.out.println("일합니다.");
}
@Override
void wake() {
System.out.println("일 때문에 일어납니다.");
work();
}
};
void method1() {
Person localVar = new Person() {
void walk() {
System.out.println("산책을 합니다.");
}
@Override
void wake() {
System.out.println("산책하러 일어납니다.");
walk();
}
};
localVar.wake();
}
void method2(Person person) {
person.wake();
}
}
public class ExampleMain {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
anony.field.wake();
anony.method1();
anony.method2(new Person() {
void study() {
System.out.println("공부합니다.");
}
@Override
void wake() {
System.out.println("공부하러 일어납니다.");
study();
}
});
}
}
/* 출력
일 때문에 일어납니다.
일합니다.
산책하러 일어납니다.
산책을 합니다.
공부하러 일어납니다.
공부합니다.
*/
'Programming > JAVA' 카테고리의 다른 글
중첩 클래스&인터페이스(5) - 익명 객체 5 (0) | 2023.04.20 |
---|---|
중첩 클래스&인터페이스(5) - 익명 객체 4 (0) | 2023.04.18 |
중첩 클래스&인터페이스(5) - 익명 객체 2 (0) | 2023.04.14 |
중첩 클래스&인터페이스(5) - 익명 객체 1 (0) | 2023.04.13 |
중첩 클래스&인터페이스(4) - 중첩 인터페이스 (3) | 2023.04.12 |