본문 바로가기

Programming/JAVA

중첩 클래스&인터페이스(5) - 익명 객체 4

java logo image

 

 

지금까지 익명 객체의 사용 형태와 관련해서 부모-자식 클래스를 사용하는 경우를 중심으로 살펴보았습니다. 그럼, 이제부터는 인터페이스를 익명 객체를 통해서 사용하는 케이스를 살펴보도록 하겠습니다. 

 

사실 익명 객체를 활용한 인터페이스 구현 객체의 생성을 진행하는 케이스는 이미 인터페이스 아티클에서 배운 적이 있지만, 다시 한번 살펴보도록 하겠습니다. 일단 자식 클래스의 구현과 원리 자체는 거의 유사합니다. 인터페이스의 구현 객체 역시 다형성을 기반으로 하여 생성하고 있기 때문이죠. 

 

기본적으로 인터페이스는, 인터페이스 타입의 변수를 만들고 거기에 구현 클래스의 인스턴스를 대입해 객체를 생성했습니다. 그리고 그 구현 클래스에는 필수로 인터페이스의 추상 메서드에 대해서 재정의를 진행해야 했습니다. 

 

그런데 자식 클래스의 사용과 마찬가지로, 별도의 구현 클래스 파일을 생성해 선언하지 않고 일회성 구현 클래스를 만들고 싶을 때 이 익명객체를 사용하면 됩니다. 아래의 예시를 보겠습니다. 

 

인터페이스 필드|변수 = new 인터페이스() {
    // 인터페이스에 선언된 추상 메서드의 실체 메서드 재정의
    // 필드
    // 메서드
};

 

자식 클래스를 익명 객체로 선언할 때와 상황이 거의 동일합니다. 애초에 구현 클래스가 따로 존재하지 않기 때문에, new 인터페이스 객체 형으로 인스턴스를 선언하고 중괄호( { } ) 안에 익명의 구현 클래스를 선언하게 됩니다. 여기서 선언된 필드와 메서드는 구현 클래스 안의 실체 메서드에서만 사용이 가능하고, 외부에서는 사용이 불가능합니다. 

 

실제로 코드 상에서 익명의 인터페이스 구현 클래스 선언 방식을 살펴보겠습니다. 

 

 class A {
     RemoteControl field = new RemoteControl() {
         @Override
         void turnOn() { ... }
     };
 }

 

위의 예제에서는 클래스 A의 필드로서 익명의 구현 클래스를 선언하였습니다. 

 

 

 

void method() {
    RemoteControl localVar = new RemoteControl() {
        @Override
        void turnOn() { ... }
    };
}

 

위의 예제에서는 메서드의 로컬 변수에 익명의 구현 클래스를 선언하는 형태를 보여주었습니다. 그럼 남은 것은 이제 파라미터가 인터페이스 타입으로 선언된 경우가 있겠네요.

 

 

class A {
    void method1(RemoteControl rc) { ... }
    
    void method2() {
        method1(
            new RemoteControl() {
                @Override
                void turnOn() { ... }
            }
        );
    }
}

 

 

기본적인 익명 구현 객체의 사용 방식은 충분히 익혔을 것입니다. 응용하여 사용하게 되면 역시 UI 관련 클래스에서의 리스너+이벤트 구현에서도 유용하게 사용되는 방식인데, 이 예제는 다음 아티클에서 살펴보도록 하겠습니다.