반응형
이번 글에서는 제네릭 타입을 두 개 이상 사용하는 방법을 배워봅니다.
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> 등 다양한 제네릭 구조가 사용됩니다.
📌 정리하자면, 멀티 타입 제네릭은 객체가 서로 다른 두 종류 이상의 데이터를 안전하게 다룰 수 있게 해주는 도구입니다.
이를 통해 재사용성이 높아지고, 형변환 없는 안정적인 타입 처리가 가능해지므로, 복합 데이터 구조를 설계할 때 사용됩니다.
'프로그래밍 > JAVA' 카테고리의 다른 글
123. 메서드에도 제네릭을? – 제네릭 메서드 Boxing() (0) | 2025.05.15 |
---|---|
122. 제네릭 객체도 비교할 수 있다 – 같은 타입끼리의 compare() 메서드 (0) | 2025.05.15 |
121. 인터페이스도 제네릭으로! – 타입별로 유연한 구조 만들기 (0) | 2025.05.15 |
119. 타입을 자유롭게! – 제네릭 클래스 만들기 (0) | 2025.05.15 |
118. 클래스 구조를 꿰뚫어보자 – Reflection으로 생성자·필드·메소드 분석하기 (0) | 2025.05.14 |
117. 문자열이 규칙에 맞는지 검사하자 – Pattern.matches()와 정규 표현식 (0) | 2025.05.14 |