본문 바로가기

반응형

이번 글에서는 제네릭 타입을 두 개 이상 사용하는 방법을 배워봅니다.
Product<K, M>처럼 제네릭 타입을 여러 개 선언하면,
각기 다른 타입의 데이터를 하나의 객체에 유연하게 담을 수 있어 실무에서 자주 활용됩니다.


📌 예제 코드

package ch13.sec02;

public class Product<K, M> {
    private K kind;   // 첫 번째 타입 매개변수
    private M model;  // 두 번째 타입 매개변수

    public K getKind() {
        return kind;
    }

    public void setKind(K kind) {
        this.kind = kind;
    }

    public M getModel() {
        return model;
    }

    public void setModel(M model) {
        this.model = model;
    }
}
package ch13.sec02;

public class Tv {
}
package ch13.sec02;

public class Car {
}
package ch13.sec02;

public class GnericExample2 {
    public static void main(String[] args) {
        Product<Tv, String> product1 = new Product<>();
        product1.setKind(new Tv());
        product1.setModel("스마트Tv");

        Tv tv = product1.getKind();
        String tvModel = product1.getModel();
        System.out.println(tv.getClass().toString() + " / " + tvModel);

        Product<Car, String> product2 = new Product<>();
        product2.setKind(new Car());
        product2.setModel("SUV 자동차");

        Car car = product2.getKind();
        String carModel = product2.getModel();
        System.out.println(car.getClass().toString() + " / " + carModel);
    }
}

💻 실행 결과

class ch13.sec02.Tv / 스마트Tv
class ch13.sec02.Car / SUV 자동차

💬 코드 설명

  • Product<K, M> 클래스는 두 개의 타입 매개변수(K, M) 를 사용합니다.
  • K는 제품의 종류(Tv, Car 등), M은 모델명을 의미하며, 두 타입은 서로 다른 자료형으로 지정할 수 있습니다.
  • Product<Tv, String> 형태로 객체를 생성하면 K는 Tv, M은 String이 되고,
    Product<Car, String>은 Car와 String 조합으로 생성됩니다.
  • 각각의 kind, model에 대해 타입 안정성(type safety) 을 확보하면서 코드 재사용성도 확보할 수 있습니다.

💡 포인트 정리

  • 제네릭은 타입 매개변수를 여러 개 사용할 수 있으며, 각기 다른 목적의 타입을 다룰 때 매우 유용합니다.
  • 선언 방법:
public class 클래스명<T, U> { ... }
  • 사용할 때는 <Tv, String>, <Integer, Double>처럼 두 개 이상 타입을 명시하면 됩니다.
  • 실무에서는 Map<K, V>, Entry<K, V>, Pair<L, R> 등 다양한 제네릭 구조가 사용됩니다.

📌 정리하자면, 멀티 타입 제네릭은 객체가 서로 다른 두 종류 이상의 데이터를 안전하게 다룰 수 있게 해주는 도구입니다.
이를 통해 재사용성이 높아지고, 형변환 없는 안정적인 타입 처리가 가능해지므로, 복합 데이터 구조를 설계할 때 사용됩니다.

댓글