익명 클래스(Anonymous class)
익명클래스는 특이하게도 다른 내부 클래스들과 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문이다.
즉, 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.
new 조상클래스이름() {
// 멤버 선언
}
OR
new 구현인터페이스이름() {
// 멤버 선언
}
이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
정리하자면, 익명 클래스는 재사용할 필요가 없는 일회성 클래스를 굳이 새로 클래스를 생성하는 것이 아닌 익명 클래스를 통해 코드를 줄이는 기법이라고 볼 수 있다.
익명 클래스 유의점
기존 부모 클래스를 상속한 자식 클래스에서는 부모 클래스의 메서드를 재정의할 뿐만 아니라 새로운 메소드를 만들어 사용할 수도 있다.
하지만 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드만 사용가능하고, 새로 정의한 메소드는 스코프 외부에서는 사용할 수 없다.
// 부모 클래스
class Animal {
public String ramble() {
return "산책을 한다!";
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Animal() {
// @Override 메소드
public String ramble() {
return "댕댕이가 산책을 한다!";
}
// 새로 정의한 메소드
public String poop() {
return "댕댕이가 똥을 싼다!";
}
};
dog.ramble(); // "댕댕이가 산책을 한다!"
dog.poop(); // ERROR -> 외부에서 호출 불가능
}
}
인터페이스 익명 구현 객체
위에서 익명클래스는 일회성 오버라이딩 용 이라고 정리했다.
이러한 특징을 잘 맞물려 추상화 구조인 인터페이스를 일회용으로 구현하여 사용할 필요가 있을 때, 익명 구현 객체로 선언해서 사용하면 매우 시너지가 잘 맞게 된다!
// 인터페이스
interface IAnimal {
public String bark(); // 추상 메소드
public String run();
}
public class Main {
public static void main(String[] args) {
// 인터페이스 익명 구현 객체 생성
IAnimal dog = new IAnimal() {
@Override
public String bark() {
return "개가 짖습니다";
}
@Override
public String run() {
return "개가 달립니다";
}
};
// 인터페이스 구현 객체 사용
dog.bark();
dog.run();
}
}
위의 코드 모습을 보면, 마치 인터페이스를 클래스 생성자 처럼 초기화하여 인스턴스화 한 것 같아 보인다.
하지만 알다시피 인터페이스 자체로는 객체를 만들수는 없다.
위의 코드에서 new 인터페이스명() 은 그렇게 보일 뿐이지, 사실 자식 클래스를 생성해서 implements 하고 클래스 초기화 한 것과 다름이 없다.
그냥 익명클래스를 작성함과 동시에 객체를 생성하도록하는 Java의 문법으로 보면 된다.
조금 더 깊은 설명은 inpa Dev 님 블로그에서 참조해주세요! 너무나 좋은 설명인데 그대로 긁어오기엔 조금 그래서... 강추!!
#참고자료
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
[JAVA] ☕ 익명 클래스(Anonymous Class) 개념 & 문법 정리
익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다
inpa.tistory.com
'개발 > JAVA' 카테고리의 다른 글
[JAVA] 예외처리(try - catch) 하기 (0) | 2023.03.27 |
---|---|
[JAVA] 예외(Exception)와 에러(Error) (0) | 2023.03.23 |
[JAVA] 내부 클래스(inner class) (0) | 2023.03.23 |
[JAVA] 인터페이스(Interface) vs 추상클래스(Abstract Class) 비교 (0) | 2023.03.06 |
[JAVA] 인터페이스(Interface) 총 정리 (0) | 2023.03.01 |