개발/java
익명클래스
캐리캐리
2022. 1. 1. 15:33
익명클래스는 이름 그대로 이름이 없는 클래스입니다.
사용하는 이유에 대해서 알려드리자면 부모 클래스를 사용하는 자식이 1회성에 그치거나 혹은 너무 무분별한 자식이 생길 경우
이를 익명 클래스를 이용해서 Override하여 사용할 수 있습니다.
예를 들어보겠습니다.
이런 부모 클래스가 있습니다.
이 메서드를 재활용하기 위해서는 일반적으로는 Person을 상속받는 자식 클래스를 만들고 거기에 구현부를 Override해서 작성해야합니다.
public class Person {
public void whoAmI() {
System.out.println("나는 사람이다.");
}
}
public class Child extends Person {
@Override
public void whoAmI() {
System.out.println("나는 자식이다");
}
}
그러나 자식이 한명도 아니고 여러명이고 1회성에 그칠경우 이를 익명 클래스를 통해서 구현할 수 있습니다.
@Test
void anonymousExample() {
Person p = new Person() {
String name="잘생긴";
@Override
public void whoAmI() {
System.out.println("나는 "+name+" 자식입니다.");
}
};
p.whoAmI();
}
그리고 이는 파라미터로도 전달할 수 있습니다.
@Test
void anonymousExample() {
walk(new Person() {
String name="잘생긴";
@Override
public void whoAmI() {
System.out.println("나는 "+name+" 자식입니다.");
}
});
}
void walk(Person person) {
person.whoAmI();
System.out.println("길을 걷고 있습니다");
}
또한 이는 인터페이스를 통해서도 가능합니다.
public interface Order {
public void Buy();
public void Cancel();
}
@Test
void anomousInterface() {
Order a = new Order() {
String name = "카페";
@Override
public void Buy() {
System.out.println(name+"에서 구매하였습니다.");
}
@Override
public void Cancel() {
System.out.println(name+"에서 취소하였습니다.");
}
};
a.Buy();
}
그러나 익명클래스 내부에 생성죈 메서드나 필드는 익명 클래스 밖에서 접근할 수 없습니다.
이유는 당연히 부모클래스의 인스턴스이므로 부모클래스에 있는 내용이 아니기 때문에 접근을 할 수 없습니다.
@Test
void anonymousError() {
Person a = new Person() {
String name="잘생긴";
public void error() {
System.out.println("에러입니다.");
}
};
a.error(); // 컴파일 에러
}