본문 바로가기

Language/Java

[JAVA] 익명 클래스

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