1.정의
익명 클래스== 이름 몰라도 되는 클래스 == 다시 불려서 쓰일 일이 없는 클래스 == 1회용 클래스
객체 만들 때, 그 객체에 필요한 매소드 재정의, 추상화 함수 실체화를 같이 해버림.
(이건 해당 내용으로 다시 쓰일 일이 없을 때 유용하다.
만약 재사용이 필요하다면 상속 클래스로 만들어두고 써야함.)
2. 일반 클래스에 대한 상속 없이 다른 기능이 추가된 객체를 만드는 경우
(1) 우리가 쓸 클래스
class Coffee{
public void order(String coffee){
System.out.println("주문하신 " + coffee + "나왔습니다. ");
}
public void returnTray(){
System.out.println("커피 반납이 완료되었습니다.");
}
}
(2) Main method
public class _01_AnonymousClass1 {
public static void main(String[] args) {
// 익명 클래스
// 클래스 내부에서 정의 되는 클래스
Coffee c1 = new Coffee();
c1.order("아메리카노");
System.out.println("---------------------");
Coffee c2 =new Coffee();
c2.order("라떼");
System.out.println("---------------------");
// 굉장히 친한 친구 방문
// 이 친구만 따로 뭔가 챙겨주고 싶음. 이 행동은 다시 할 일이 거의 없음.
// 딱 이 객체 하나만을 위한 Class
// 객체 생성 시 {}도 추가해서 필요한 재정의 작업함.
Coffee specialCoffee = new Coffee() {
@Override
public void order(String coffee) {
super.order(coffee);
System.out.println("(귓속말) 딸기 케이크는 서비스예요^^");
}
// 부모 클래스의 내용과 아예 다를 수 있음 (super.method(); 뺀 경우)
@Override
public void returnTray() {
System.out.println("(귓속말)자리에 두시면 제가 치울게요~");
}
};
specialCoffee.order("바닐라 라떼");
specialCoffee.returnTray();
}
}
3. 익명 클래스 선언을 따로 매소드로 뺀 경우
(1) 추상 클래스
abstract class HomemadeBurger{
public abstract void cook();
}
// 알다시피 추상클래스는 스스로 객체를 생성할 수 없다.
(2) 익명 클래스 객체 생성을 위한 매소드
//반환형이 HomemadeBurger이기 때문에 리턴 값도 HomemadeBurger 자료형 값이어야함.
private static HomemadeBurger getBroMadeBurger() {
return new HomemadeBurger() {
@Override
public void cook() {
System.out.println("집에서 만드는 동생 표 군대리아");
System.out.println("재료: 빵, 치킨퍁, 양배추 샐러드, 딸기잼, 치즈, 삶은 계란");
}
};
}
public static HomemadeBurger getMomMadeBurger(){
return new HomemadeBurger(){
@Override
public void cook() {
System.out.println("집에서 만드는 엄마 표 수제버거");
System.out.println("재료: 빵, 소고기패티, 해시브라운, 양상추, 마요네즈, 피클");
}
};
}
(3) Main Method
public static void main(String[] args) {
//추상 클래스는 객체를 만들 수 없는데, 익명 클래스로 오버라이딩도 한 큐에 다 해버리면 가능하다.
HomemadeBurger momMadeBurger = getMomMadeBurger();
momMadeBurger.cook();
System.out.println("-------------------------------------------");
HomemadeBurger broMadeBurger = getBroMadeBurger();
broMadeBurger.cook();
}
4. 스스로 해보기
public class AnnoymousClass_Myself {
public static void main(String[] args) {
hallServing2 emp1 = new hallServing2();
emp1.WorkFinished(6);
hallServing jaden = new hallServing() {
@Override
public void WorkFinished(int i) {
System.out.println("제이든은 "+ i + "시에 퇴근했습니다.");
}
};
jaden.WorkFinished(19);
hallServing Sancho = GetGoingHomeTime();
Sancho.WorkFinished(22);
}
public static hallServing GetGoingHomeTime() {
return new hallServing() {
@Override
public void WorkFinished(int i) {
System.out.println("산초는 "+ i + "시에 퇴근했습니다.");
}
};
}
}
abstract class hallServing {
abstract public void WorkFinished(int i);
}
class hallServing2 extends hallServing {
@Override
public void WorkFinished(int i) {
System.out.println("모든 직원은 " + i + "시에 똑같이 퇴근합니다.(야근하는 인원 제외)");
}
}
'Language > Java' 카테고리의 다른 글
[JAVA] Stream (0) | 2023.02.18 |
---|---|
[JAVA] 람다식과 함수형 인터페이스 (0) | 2023.02.16 |
[JAVA] Iterator (0) | 2023.02.15 |
[JAVA] HashMap (0) | 2023.02.13 |
[JAVA]HashSet (0) | 2023.02.09 |