(class<K, V, ...>, interface<K, V, ...>)
]제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있는데, 이 경우 각 타입 파라미터를
,
로 구분한다.
Product<T, M>
제네릭 타입을 정의하고 ProduceExample
클래스에서 Product<Tv, String>
객체와 Product<Car, String>
객체를 생성한 뒤, Getter
와 Setter
를 호출해보자!
public class Product<T, M> {
private T kind;
private M model;
public T getKind() { return this.kind; }
public M getModel() { return this.model; }
public void setKind(T kind) { this.kind = kind; }
public void setModel(M model) { this.model = model; }
}
public class ProductExample {
public static void main(String[] args) {
Product<Tv, String> product1 = new Product<Tv, String>();
product1.setKind(new Tv());
product1.setModel("스마트Tv");
Tv tv = product1.getKind();
String tvModel = product1.getModel();
Product<Car, String> product2 = new Product<Car, String>();
product2.setKind(new Car());
product2.setModel("디젤");
Car car = product2.getKind();
String carModel = product2.getModel();
}
}
제네릭 타입 변수 선언과 객체 생성을 동시에 할 때 타입 파라미터 자리에 구체적인 타입을 지정하는 코드가 중복해서 나와 다소 복잡해질 수 있다. 자바 7부터 제네릭 타입 파라미터의 중복 기술을 줄이기 위해 다이아몬드 연산자 <>
를 제공한다.
자바 컴파일러는 타입 파라미터 부분에
<>
연산자를 사용하면 타입 파라미터를 유추해서 자동으로 설정해준다.
예를 들어 다음은 자바 6 이전 버전에서 사용한 제네릭 타입 변수 선언과 객체 생성 코드이다.
Product<Tv, String> product = new Product<Tv, String>();
자바 7부터는 다이아몬드 연산자 <>
를 사용해서 다음과 같이 간단하게 작성할 수 있다.
Product<Tv, String> product = new Product<>();
(<T, R> R method(T t)
]제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말한다.
제네릭 메소드를 선언하는 방법은
<>
기호를 추가하고 타입 파라미터를 기술한 다음, public <타입파라미터, ...> 리턴타입 메소드명(매개변수, ...) { ... }
다음 boxing()
제네릭 메소드는 <>
기호 안에 타입 파라미터 T
를 기술한 뒤, 매개 변수 타입으로 T
를 사용했고, 리턴 타입으로 제네릭 타입 Box<T>
를 사용했다.
public <T> Box<T> boxing(T t) { ... }
제네릭 메소드는 두 가지 방식으로 호출할 수 있다.
리턴타입 변수 = <구체적타입> 메소드명(매개값); //명시적으로 구체적 타입을 지정
리턴타입 변수 = 메소드명(매개값); //매개값을 보고 구체적 타입을 추정
다음 코드는 boxing()
메소드를 호출하는 코드이다.
Box<Integer> box = <Integer>boxing(100); //타입 파라미터를 명시적으로 Integer로 지정
Box<Integer> box = boxing(100); //타입 파라미터를 Integer로 추정
이것이 자바다 책