<aside>
</aside>
익명 클래스는 클래스 정의와 동시에 객체를 생성할 수 있다.
메서드, 지역 변수 등으로 객체를 선언할 수 있으며 쓰임에 따라 생명주기에 맞게 일회용으로 쓰인다. 그래서 부모 클래스의 자원을 상속받아 재정의하며 사용할 자식 클래스가 한 번만 사용되고 버려질 자료형이라면 익명 클래스 객체를 통해 코드를 줄이면서도 메모리를 아끼며 유지보수성을 높일 수 있다.
public class Animal {
public String bark() {
return "동물이 웁니다";
}
}
public class Main {
public static void main(String[] args) {
// 익명 클래스 - 자식 클래스 정의와 객체화를 동시에
Animal dog = new Animal() {
// 오버라이딩
public String bark() {
return "개가 짖습니다";
}
};
dog.bark();
}
익명 클래스 내에서 새로이 선언한 메서드는 익명 클래스 밖에서 사용하지 못한다. 아래 코드에서 run()
이라는 메서드는 익명 클래스 밖에서 실행할 때 컴파일 에러가 난다.
public class Main {
public static void main(String[] args) {
// 익명 클래스 - 자식 클래스 정의와 객체화를 동시에
Animal dog = new Animal() {
// 오버라이딩
public String bark() {
return "개가 짖습니다";
}
// 새로 정의
public String run() {
return "달리다.";
}
};
// 컴파일 에러 - 익명 클래스 밖에서 실행하기 때문에.
dog.run();
}
익명 클래스는 3가지 케이스로 나누어 선언할 수 있다.
먼저, 클래스 필드로써 사용할 수 있다. Animal 클래스의 필드로써 Animal을 익명으로 선언했다.
public class Creature {
Animal dog = new Animal() {
public String bark() {
return "필드에서 멍멍";
}
};
...
}
두 번째로, 지역 변수로써 사용할 수 있다. method()
내에서 활용하기 위해 익명 클래스를 선언했다.
public class Creature {
public void method() {
Animal dog = new Animal {
public String bark() {
return "지역변수로써 멍멍";
}
};
dog.bark();
}
}
마지막으로, 메서드의 매개변수로 받을 수 있다. Creature
내에 Animal
객체를 매개변수로 받는 메서드를 만들어 다른 곳에서 새로이 Animal 객체를 익명으로 선언해 전달했다.