Langauge/Java-basic

[Java] 익명 이너 클래스(Anonymous Class)

강잇 2022. 8. 11. 23:16

익명 이너 클래스란?

  • 단어 그대로 '이름을 가지지 않은 클래스'를 의미한다.
    • 이름이 없기 때문에 생성자도 없다.
  • 하나의 객체만을 생성하는 일회용 클래스다.
    • 이름이 없기 때문에 다시 찾을 수도 없다.
  • 익명 이너 클래스를 사용하면 코드를 간결화할 수 있다.
    • (클래스 작성 + 해당 클래스 타입의 객체 생성)를 익명 이너 클래스 하나로 해결할 수 있다.
  • 여러 개의 객체를 생성해야 하는 상황에서는 사용하지 않는 편이 좋다.
    • 일회용 클래스이기 때문에 객체를 생성할 때마다 기능을 구현해야 하기 때문이다.
// 익명 이너 클래스
new 클래스명() {
    // 기능 구현
};

new 인터페이스() {
    // 기능 구현
};
// 세미콜론(;) 필수

익명 이너 클래스 사용 예시

인터 페이스 객체 생성

public class Main {
    public static void main(String[] args) {
        // 익명 이너 클래스를 이용하여 인터페이스 인스턴스를 생성
        A a = new A(){
            @Override
            public void abc() {
                System.out.println("익명 이너 클래스");
            }
        };
        a.abc(); // "익명 이너 클래스" 출력
    }
}

// 인터페이스 생성
interface A {
    public void abc();
}

/*
원래라면 인터페이스를 구현한 하위 클래스를 생성해서 abc() 메서드를 오버라이딩을 통해 구현해야 사용할 수 있다.
하지만 익명 이너 클래스를 이용하면 아래와 같은 과정을 생략할 수 있다.

class B implements A {
    @Override
    public void abc() {
        // 기능 구현
    }
}
/*

입력매개변수를 익명 이너클래스로 전달

public class Main {
    public static void main(String[] args) {
        // 익명 이너 클래스를 이용하여 인터페이스 인스턴스를 생성
        B b = new B(new A() {
            @Override
            public void abc() {
                System.out.println("오버라이딩");
            }
        });
        /*
        원래라면 인터페이스 A를 구현한 하위 클래스의 인스턴스를 생성 후 B() 생성자의 매개변수로
        전달해야 B 클래스의 인스턴스를 생성할 수 있다.
        하지만 익명 이너 클래스를 위와 같이 활용하면 생략할 수 있다.
         */
        b.bcd(); // "오버라이딩" 출력
    }
}

// 인터페이스 생성
interface A {
    public void abc();
}

class B {
    private A a;
    // 생성자의 매개변수를 통해 A클래스의 인스턴스를 전달받음.
    public B(A a) {
        this.a = a;
    }
    // 메서드를 선언하여 A 인스턴스의 메소드를 호출함.
    public void bcd() {
        a.abc();
    }
}