본문 바로가기

Java

Java (익명 클래스)

익명 클래스:

클래스를 명시적으로 정의하지 않고, 필요한 클래스를 인터페이스나 추상 클래스를 구현하거나 확장하여 생성하는 방법으로 일회성으로 사용되는 클래스를 간단하게 작성할 때 유용하다.

 

먼저 추상 클래스를 사용하여 익명 클래스를 생성하고, cook() 메소드를 구현하는 예제를 보자.

abstract class HomeMadeBurger {
    public abstract void cook();
}

public class AnonymousClassExample {
    public static void main(String[] args) {
        // 엄마가 만든 버거 객체를 가져와서 cook 메소드 호출
        HomeMadeBurger momMadeBurger = getMomMadeBurger();
        momMadeBurger.cook();

        // 동생이 만든 버거 객체를 가져와서 cook 메소드 호출
        HomeMadeBurger broMadeBurger = getBroMadeBurger();
        broMadeBurger.cook();
    }

    // 엄마가 만든 버거를 반환하는 메소드
    private static HomeMadeBurger getMomMadeBurger() {
        return new HomeMadeBurger() {
            @Override
            public void cook() {
                System.out.println("집에서 만드는 엄마표 수제 버거");
                System.out.println("재료: 빵, 소고기패티, 해시브라운, 양상추, 마요네즈, 피클");
            }
        };
    }

    // 동생이 만든 버거를 반환하는 메소드
    public static HomeMadeBurger getBroMadeBurger() {
        return new HomeMadeBurger() {
            @Override
            public void cook() {
                System.out.println("집에서 만드는 동생표 군대리아");
                System.out.println("재료: 빵, 치킨패티, 양배추 샐러드, 딸기잼, 치즈, 삶은 계란");
            }
        };
    }
}

 

getMomMadeBurger() 메소드를 호출하여 엄마가 만든 버거와 동생이 만든 버거를 얻어오고 각각의 익명 클래스는 cook() 메소드를 구현하고 있으며, 호출할 때 해당 메소드를 실행합니다.

 

다음으로 간단한 인터페이스를 정의하고, 그 인터페이스를 구현하는 익명 클래스를 생성하여 메시지를 출력하는 예제를 보겠습니다.

interface Greeting {
    void greet();
}

public class AnonymousClassExample {
    public static void main(String[] args) {
        // 익명 클래스를 사용하여 Greeting 인터페이스의 구현체 생성
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void greet() {
                System.out.println("안녕하세요!");
            }
        };

        // 익명 클래스의 메소드 호출
        anonymousGreeting.greet();
    }
}

 

익명 클래스의 특징으로는 

- 익명 클래스는 클래스 이름이 없습니다. 즉, 이름 없이 객체를 생성합니다.

- 일회성으로 사용할 때 유용하며, 클래스를 따로 정의할 필요가 없습니다.

- 주로 인터페이스나 추상 클래스의 구현체를 만들 때 활용됩니다. { } 내에서 메소드를 오버라이딩하거나 필드를 추가할 수 있습니다. 한 번만 사용할 수 있으며, 재사용이 불가능합니다.