본문 바로가기

Programming/JAVA

인터페이스(8) - 인터페이스의 타입 변환과 다형성 1

java logo image

 

 

 

상속 파트에서 우리는 다형성에 대해서 다루었습니다. 하나의 타입에 대입되는 인스턴스의 종류에 따라서, 그 실행 결과가 달라지는 성질을 확인했죠(부모 타입에 어떤 자식 객체를 대입하느냐에 따라 달라지는 결과). 인터페이스 타입에 구현 클래스 인스턴스가 어떤 것이 적용되느냐에 따라서도 그 실행 결과가 달라지는 것을 확인했습니다.

 

물론 부모-자식과 인터페이스-구현 간의 관계는 계층적 차이가 있어서 엄격하게는 다른 개념이지만, 동일한 형질을 통해서 다양한 결과를 구현할 수 있다는 점은 동일합니다. 

 

실제 사례를 예로 들어서, 인터페이스 다형성에 기반한 구조 설계를 살펴보겠습니다. 우선 XXX라는 클래스를 사용하여 프로그램 개발을 진행했다고 가정해 보겠습니다. 그런데, XXX클래스가 전반적으로 결함이 있어서 메서드 내용을 전면적으로 수정하기로 했습니다. 이때, YYY라는 클래스가 만들어졌다고 보겠습니다. 

 

그럼 기존에 작성해둔 호출 코드부터 대부분의 실행 관련 코드가 일일이 수정이 되어야 하는 상황이 벌어집니다. 이 골치 아픈 상황을 해결하려면 어떻게 해야 할까요? 

 

간단하게 생각하면, YYY라는 클래스는 XXX 클래스가 선언한 메서드의 리턴 타입, 이름, 파라미터를 모두 동일하게 사용해서 만들면 됩니다. 간단하죠? 하지만, 언제나 여기서 발생할 수 있는 오류의 여지가 남습니다. 메서드의 이름을 그대로 사용하자는 약속만으로는 실수 방지가 되지 않기 때문이죠. 

 

이럴 때 인터페이스를 유용하게 사용할 수 있습니다. 인터페이스에서 추상 메서드를 선언하고, 이를 구현하는 구현 클래스 XXX를 작성한 다음 이를 폐기해야 하면 동일 인터페이스를 구현하는 YYY 클래스를 만들면 되는 것입니다. 이런 경우라면, 실행 코드에서는 객체를 생성하는 코드에서 인스턴스 생성 타입 클래스 한 줄만 바꿔주면 금방 교체 작업이 마무리 됩니다. 

 

// 인터페이스 선언
public interface ExampleInterface {
    void method1();
    void method2();
}

 

// ExampleInterface ei = new A();
ExampleInterface ei = new B();

ei.method1();
ei.method2();

 

위의 코드에서 ei.method1( )과 ei.method2( )는 ei에 대입되는 구현 클래스가 변경되면 자동으로 바뀐 내용으로 실행되기 때문에, 한 줄의 교체만으로도 다른 결과를 가져올 수 있게 됩니다.

 

 


 

 

이러한 성질을 활용하게 되면 메서드의 파라미터에 적용해 다양한 결과를 산출할 수 있도록 응용할 수 있습니다. 우리가 살펴보았던 예시처럼, 인터페이스 RemoteControl을 구현한 클래스 Audio와 Television이 있다고 가정해 보겠습니다. 

 

그럼 어떤 메서드를 선언할 때, 다음과 같은 방식으로 파라미터를 선언해 선택적인 결과를 불러올 수 있습니다. 

 

public void useRemoteControl(RemoteControl rc) {
    // ...
    rc.메서드();
    // ...
}

 

위 메서드의 파라미터에는 RemoteControl을 구현한 Audio 또는 Television 인스턴스를 전달하고, 이를 통해 다양한 메서드 결과물을 확인할 수 있게 됩니다.