익명객체, Anonymous Object
- 익명 클래스, Anonoymous Class
- 이름이 없는 클래스
- 반드시 인터페이스(interface)가 필요(자바 특성)
실명 클래스
- 객체를 n개 만들 수 있다. > 다회용 클래스
- 클래스 선언 후 객체 생성
익명 클래스
- 객체를 딱 1개만 만들 수 있다. > 1회용 클래스
- 클래스 선언과 동시에 객체 생성
- 일반 클래스와 거의 유사하게 생김8
필요 이유
- 내가 만드는 객체를 딱 한 번만 필요할 때가 있음
-> 붕어빵을 나중에 또 다시 먹고싶지는 않은데 이번에 딱 한번만 먹고 싶음
-> 한 번 먹자고 붕어빵틀 살 순 없음
-> 익명 클래스 선언(더이상 사용하지 않는 버리는 클래스)
TODO 익명 클래스 생성 시 반드시 부모 interface 도 만들어 놔야 하는가?
- 익명 클래스의 구현에서 사용될 부모 클래스나 인터페이스가 없다면, 새로운 클래스를 만들어야 함
그렇지 않으면 컴파일러 오류 발생
-> 익명 클래스를 사용할 때는 항상 부모 클래스나 인터페이스를 만들어서 상속받아야 함
요구사항] 인터페이스를 구현한 클래스 선언하기 > 객체를 생성하기(목적)
1. 본인 타입의 참조 변수
BB o1 = new BB();
o1.aaa();
2. 부모 타입의 참조 변수
AA o2 = new BB(); //자식 -> 부모 업캐스팅
o2.aaa(); //부모가 인터페이스인 경우 업캐스팅 엄청 자주 함
3. 추상 클래스, 인터페이스는 객체를 생성할 수 없음 > 추상 메소드이기 때문에
AA o3 = new AA(); //(X) AA는 인터페이스이기 때문에 객체 생성 불가
o3.aaa(); //라고 했을때 아무일도 일어나지 않음 > 구현부가 없기 때문
AA를 상속받는 이름없는 클래스 선언 중(= BB 클래스와 동일한 문법)
익명 클래스 > 익명 객체 생성
인터페이스와 이름없는 클래스를 부모-자식으로 무조건 만들자
AA o4 = new AA() { //중괄호를 붙이면 구현 가능
//AA는 아무 의미 없음. 바지사장 느낌
public void aaa() { //어떤 클래스의 몸통. 몸통은 있는데 머리통은 안보임
System.out.println("추상 메소드 구현");
}
};
//자식 메소드에서 오버라이딩 된 구현과 같음
//누군가의 몸통인지는 모르지만 AA를 상속받았을 것이다
//클래스 선언도 없고 클래스 이름도 없음 -> 익명 클래스
AA o5 = new AA() { AA라는 부모 interface를 상속받은 것
public void aaa() { AA가 상속한 aaa()메소드의 구현부 완성시키기
System.out.println("추상 메소드 구현");
}
};
o5.aaa(); //"추상 메소드 구현" 출력
AA o6 = new AA() { AA라는 부모 interface를 상속받은 것
public void aaa() { AA가 상속한 aaa()메소드의 구현부 완성시키기
System.out.println("추상 메소드 구현2");
}
};
o6.aaa(); //"추상 메소드 구현2" 출력
//o5와 o6은 완전히 다른 것
//일반 클래스는 다회용 클래스지만 익명객체는 객체를 딱 1개만 만들 수 있는 1회용 클래스
}//main
}//main class
interface AA {
void aaa();
}
class BB implements AA { //BB라는 클래스의 몸통 안에 AA인터페이스가 강제로 강요한 메소드를 갖고있음
public void aaa() { // 인터페이스에서 받은 메소드를 오버라이딩으로 구현
System.out.println("추상 메소드 구현");
}
} //BB의 몸통을 갖고 AA를 상속받음
'[JAVA] 정리 > 클래스(Class)_타입(Type)' 카테고리의 다른 글
| 클래스_정렬 sort, Comparator, Collections.sort() (0) | 2023.03.01 |
|---|---|
| 클래스_예외 처리2 (0) | 2023.02.23 |
| 클래스_예외처리(Exception) (0) | 2023.02.23 |
| 클래스_오브젝트(Object) (0) | 2023.02.23 |
| 향상된 for문 for(자료형 변수명 : 배열명) (0) | 2023.02.23 |