프로그래밍/java, spring
추상클래스와 익명클래스
브래드 킴
2022. 12. 3. 20:18
728x90
java에서 추상클래스는 인스턴스화 시킬 수 없다고 흔히들 알고 있다.
추상클래스는 기본적으로 구현되지 않은 메서드가 포함되어 있는 클래스이므로, 인스턴스를 통해 해당 메서드를 실행하는 것이 불가능하기 때문이다.
public abstract class Animal {
abstract void cry();
}
위와 같이 생긴 Animal 추상클래스를 main메서드에서
Animal ac = new Animal();
이렇게 객체화 시키면
'Animal' is abstract; cannot be instantiated 라는 에러가 발생한다.
그런데, 그와 동시에 intellij에서는 아래와 같이 자동완성을 시켜준다.
Animal ac = new Animal() {
@Override
void cry() {
}
};
위의 코드를 보면 마치 Animal 추상 클래스를 통해 객체를 만든 것 같이 보인다.
그러나, 위 클래스는 Animal 추상클래스의 객체가 아닌, Animal객체를 일시적으로 구현한 익명클래스의 객체라고 볼 수 있을 것이다.
익명클래스란 클래스의 선언과 동시에 객체를 생성하는 이름을 가지지 않은 일회용 클래스이자 객체이다. 위의 Animal 객체처럼 보이는 ac라는 이름의 객체는, Animal 추상클래스를 구현한 익명클래스의 인스턴스이다.
해당 이슈와 동일한 내용을 스택오버플로우에 검색하면 아래와 같은 댓글에 많은 좋아요가 달려 있는 것을 알 수 있다.
"You can't instantiate your abstract class, however you can instantiate a concrete subclass of your abstract class"
"추상클래스를 인스턴스할수는 없지만, 해당 추상클래스를 구체화한 subclass는 인스턴스화할수 있다."
728x90