Java/자바 정리

121. 인터페이스도 제네릭으로! – 타입별로 유연한 구조 만들기

코딩하는냥이 2025. 5. 15. 11:03
반응형

이번 글에서는 제네릭 인터페이스를 구현하는 방법을 배웁니다.
Rentable<P>라는 인터페이스에 타입 매개변수를 선언하고,
각 구현 클래스에서 해당 타입을 지정해 객체를 유연하게 생성하거나 반환할 수 있습니다.


📌 예제 코드

package ch13.sec02;

public interface Rentable<P> {
    P rent();  // P 타입의 객체를 반환하는 추상 메서드
}
package ch13.sec02;

public class Home {
    public void turnOnLight() {
        System.out.println("전등을 켭니다.");
    }
}
package ch13.sec02;

public class Car {
    public void run() {
        System.out.println("자동차가 달립니다.");
    }
}
package ch13.sec02;

public class HomeAgency implements Rentable<Home> {
    @Override
    public Home rent() {
        return new Home();  // Home 객체를 반환
    }
}
package ch13.sec02;

public class CarAgency implements Rentable<Car> {
    @Override
    public Car rent() {
        return new Car();  // Car 객체를 반환
    }
}
package ch13.sec02;

public class GenericExample3 {
    public static void main(String[] args) {
        HomeAgency homeAgency = new HomeAgency();
        CarAgency carAgency = new CarAgency();

        Home home = homeAgency.rent();
        Car car = carAgency.rent();

        home.turnOnLight();
        car.run();
    }
}

💻 실행 결과

전등을 켭니다.
자동차가 달립니다.

💬 코드 설명

  • Rentable<P> 인터페이스는 P 타입을 반환하는 rent() 메서드를 정의하고 있습니다.
  • HomeAgency는 Rentable<Home>을 구현하여 집을 렌트할 수 있도록 구성되어 있고,
    CarAgency는 Rentable<Car>을 구현해 자동차를 렌트할 수 있게 구성되어 있습니다.
  • 제네릭 덕분에 하나의 인터페이스로 여러 종류의 객체를 일관된 방식으로 처리할 수 있습니다.
  • main()에서는 각각의 에이전시를 통해 객체를 받아 해당 객체의 고유 기능을 실행합니다.

💡 포인트 정리

  • 제네릭 인터페이스를 선언하면, 구현 클래스에서 원하는 타입으로 구체화할 수 있습니다.
  • Rentable<P>처럼 인터페이스에서 타입을 외부에 맡기면, 코드의 재사용성과 확장성이 크게 향상됩니다.
  • 이 구조는 서비스 제공자-이용자 패턴, 팩토리 구조, 전략 패턴 등의 설계에서도 유용하게 사용됩니다.

📌 정리하자면, 제네릭 인터페이스는 타입에 구애받지 않고 범용적으로 사용할 수 있는 추상 구조를 만들어 줍니다.
Rentable<P>는 집이든 자동차든 원하는 타입의 객체를 반환할 수 있는 공통된 구조를 제공하고,
각 구현 클래스는 자신에게 맞는 구체 타입으로 구현하면 됩니다.