변수에 대입될 값의 타입을 모를 때, 타입을 파라미터로 받아서 변수를 실제로 사용할 때 타입을 지정하는 기능
public class ClassName <T> {
public T field;
}
타입이 결정되지 않은 필드 field 의 타입을 T 라는 타입 파라미터로 받는다.
결정되지 않은 타입 ( < 타입 > ) 을 파라미터로 가지는 클래스나 인터페이스를 제네릭 타입이라고 한다.
ClassName<타입> instance = new ClassName<타입>();
ClassName<Integer> instance1 = new ClassName<>();
instance1.content = 100;
ClassName<String> instance2 = new ClassName<>();
instance2.content = "Hello";
instance1.content 의 타입은 int 가 되고, instance2.content 의 타입은 String 이 된다.
< 타입 > 을 파라미터로 전달했다면, 생성자의 타입은 <> 로 생략이 가능하다.Object 타입이 자동으로 지정된다.public class Desktop <C, M> {
/* 필드 */
public C component;
public M maker;
/* 메서드 */
public C getComponent() {
return this.component;
}
public M getMaker() {
return this.maker;
}
public void setComponent(C component) {
this.component = component;
}
public void setMaker(M maker) {
this.maker = maker;
}
}
setter 에서 타입을 모르는 필드에 타입이 지정된 값이 대입된다.
/* 사용 */
...
Desktop<CPU, String> pc1 = new Desktop<>();
pc1.setComponent( new CPU() );
pc1.setMaker("Intel");
CPU cpu = pc1.getComponent(); // component 필드의 값 반환
String cpuMaker = pc1.getMaker(); // maker 필드의 값 "Intel" 반환
pc1 생성 시,<C> 에는 CPU 라는 객체 타입이 전달되었고<M> 에는 String 타입이 전달되었다.Component 에는 CPU 객체의 인스턴스 가 대입되고,Maker 에는 Intel 가 대입되었다.public <T> 리턴타입 메서드명(매개변수) {}
public <T> boolean isInteger(T t) {
return (t.getClass().getSimpleName() == "Integer");
}
// 제네릭 메서드 호출
boolean result = isInteger(10);
타입 파라미터를 Number 같은 숫자 타입들 또는 Byte, Integer 같은 세부 타입으로 제한할 수 있다.
public <T extends Number> 리턴타입 메서드명(...) { ... }