다양한 타입의 데이터를 다루는 클래스나 메서드에서 사용할 데이터의 타입을 컴파일 시 미리 지정할 수 있게 해주는 기능이다.
한 종류의 객체만을 저장하는 경우에 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 기존의 타입과 다른 타입으로 형변환되어 발생할 수 있는 에러를 사전에 방지할 수 있다.
또한 컴파일 시에 타입을 체크하고 형변환을 생략할 수 있으므로 코드가 간결해진다.
클래스나 인터페이스 이름 옆에 '<>'를 붙이고, 사이에 타입 변수(type variable)를 넣어준다.
public class 클래스명<타입 변수> {...}
public interface 인터페이스명<타입 변수> {...}
타입 변수 | 설명 |
---|---|
<T> | Type |
<E> | Element |
<K> | Key |
<N> | Number |
<V> | Value |
<R> | Result |
public class Card<T> {
private T pattern;
public void setPattern(T pattern) {
this.pattern = pattern
}
public T getPattern() {
return pattern;
}
}
클래스를 설계할 때 구체적인 타입을 명시하지 않고 타입 변수로 넣어 놓는다.
그러다가 설계한 클래스가 사용되어질 때 다음과 같이 구체적인 타입을 지정하면 형변환을 최소화할 수 있다.
Card card<String> = new Card<String>();
인스턴스를 생성할 때 <String>을 붙여주면 클래스를 설계할 때 작성했던 T타입들이 String타입으로 취급되어 실행된다.
public class ExMultiType<K, V> implements Map.Entry<K, V> {
private K key;
private V value;
public void setValue(V value) {
this.value = value;
}
public K getKey() {
return this.key;
}
public V getValue() {
return this.value;
}
}
HashMap처럼 데이터를 키(key)와 값(value)의 형태로 저장하는 컬렉션 클래스는 지정해줘야 할 타입이 두 개다. 따라서 <K, V>와 같이 두 개의 타입을 콤마','로 구분해서 적어준다.
public <T> T ExMethod(T param) {
...
}
제네릭 메서드임을 알리기 위해서 리턴 타입 앞에 제네릭 메서드임을 명시해야 한다.
클래스의 타입 변수와 메서드의 타입 변수는 관련이 없다.