반응형
익명 클래스 (Anonymous Class)
- 내부 클래스의 일종 , 이름이 없는 클래스
- 일시적으로 한 번만 사용되고 버려지는 객체
- 자식이 될 클래스를 만들고 상속 후 객체 인스턴스 초기화 후 가능하다.
- // 부모 클래스 class Animal { public String bark() { return "동물이 웁니다"; } } public class Main { public static void main(String[] args) { // 익명 클래스 : 클래스 정의와 객체화를 동시에. 일회성으로 사용 Animal dog = new Animal() { @Override public String bark() { return "개가 짖습니다"; } }; // 단 익명 클래스는 끝에 세미콜론을 반드시 붙여 주어야 한다. // 익명 클래스 객체 사용 dog.bark(); } }
유의점
- 오버라이딩한 메소드만 사용가능하고, 새로 정의한 메소드는 외부에서 사용 불가하다.
- new Aninal(){}을 통해 생성하는 인스턴스는 별도의 클래스가 아니라 Animal 클래스를 상속받는 익명 클래스기 때문에 부모 클래스 Animal에는 run()메소드가 선언되지 않아 사용하지 못한다. (다형성)
// 부모 클래스
class Animal {
public String bark() {
return "동물이 웁니다";
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Animal() {
// @Override 메소드
public String bark() {
return "개가 짖습니다";
}
// 새로 정의한 메소드
public String run() {
return "달리기 ㄱㄱ싱";
}
};
dog.bark();
dog.run(); // ! Error - 외부에서 호출 불가능
}
}
선언 방법 3가지
- 클래스 필드로 이용
- 특정 클래스 내부에서 여러 메소드에서 이용될 때 고려
class Animal { ... } class Creature { // 필드에 익명자식 객체를 생성 하여 이용 Animal dog = new Animal() { public String bark() { return "멍멍"; } }; public void method() { dog.bark(); } public void method2() { dog.bark(); } }
- 지역 변수로 이용
- 메소드에서 일회용으로 사용하고 버려질 클래스면 적당함
class Animal { ... } class Creature { // ... public void method() { // 지역 변수같이 클래스를 선언하여 일회용으로 사용 Animal dog = new Animal() { public String bark() { return "멍멍"; } }; dog.bark(); } }
- 메소드 아큐먼트로 이용
- 메소드 매개변수로 클래스 자료형이 이용된다 할 때 일회성으로만 사용한다면 아규먼트로 익명 객체 넘겨주면 된다.
class Animal { ... } class Creature { // ... public void method(Animal dog) { // 익명 객체 매개변수로 받아 사용 dog.bark(); } } public class Main { public static void main(String[] args) { Creature monster = new Creature(); // 메소드 아규먼트에 익명 클래스 자체를 입력값으로 할당 monster.method(new Animal() { public String bark() { return "멍멍"; } }); } }
인터페이스 익명 구현 객체
- 사실 실무에서 멀쩡한 클래스 놔두고 익명 클래스 사용할 일은 거의 없다.
- 하지만 인터페이스를 익명 객체로 선언하여 사용할 때는 많이 사용한다.
// 인터페이스
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();
}
}
- 클래스가 인터페이스를 구현한 후 인터페이스를 구현한 클래스로 객체를 만들어야하는데, 위 코드는 인터페이스를 바로 구현해서 클래스명 없이 객체를 만들었다. 이것은 익명 구현 객체라한다.
한계점
- 오로지 하나의 인터페이스만 구현하여 객체 생성할 수 있다는 점이다.
'Backend > Java' 카테고리의 다른 글
Java - 스레드 (Thread) (0) | 2023.02.23 |
---|---|
Java - 예외 (0) | 2023.02.22 |
Java - 중첩 클래스 (0) | 2023.02.22 |
Java - 상속 (0) | 2023.02.19 |
Java - 객체, 클래스, 인스턴스의 차이 (2) | 2023.02.19 |
댓글