클래스에 사용할 타입을 설계 시에 지정하지 않고 클래스를 사용할 때 지정하여 사용하는 기술
- 컴파일 시 잘못된 타입 사용을 체크하기 때문에 Type safety 코딩을 할 수 있다.
- 불필요한 타입변환을 하지 않아도 된다.
제너릭타입글자
- T → Type
- K → Key
- V → Value
- E → Element
Map<K, V> 맵은 key와 value
List<E> 리스트는 element
이런 느낌이다.
Generic 클래스 선언 방법
class 클래스명<제너릭타입글자>{
제너릭타입글자 변수명; //변수선언에 제너릭을 사용하는 경우
제너릭타입글자 메서드명(){ //반환값이 있는 메서드에 제너릭을 사용하는 경우
return 값;
}
}
예시
class MyGeneric<T> {
private T val;
public T getVal() {
return val;
}
public void setVal(T val) {
this.val = val;
}
}
클래스명 뒤에 <T>를 붙여주면 해당 클래스 내에서 T라고 쓴 부분은 다 해당 타입인 것처럼 사용한다.
MyGeneric<String> mg1 = new MyGeneric<>();
mg1.setVal("가나다");
System.out.println(mg1.getVal()); //가나다 출력
String 타입으로 클래스 변수를 만들고 초기화했다.
잘 출력이 된다.
MyGeneric<Integer> mg2 = new MyGeneric<>();
mg2.setVal(200);
System.out.println(mg2.getVal());
Integer 타입으로도 만들어봤는데 잘 된다.
만약 제너릭을 사용하지 않고 이렇게 하려고 하면 두 가지 타입의 경우를 만들어야 했다.
아니면 Object 타입으로 만들고 값을 꺼낼 때 casting을 하든가
이번에는 멀티 타입을 가지는 Generic 클래스를 만들었다.
K와 V 두가지를 사용했다.
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
super();
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
@Override
public String toString() {
return "Pair [key=" + key + ", value=" + value + "]";
}
public <K, V> void displayKeyValue(K key, V value) {
System.out.println(key.toString()+" : "+ value.toString());
}
}
key와 value를 같이 출력하는 Generic 메서드도 만들었다.
Generic 메서드는 파라미터 타입과 리턴타입으로 타입파라미터를 가지는 메서드이다.
public class T03GenericMethodTest {
public static void main(String[] args) {
Pair<Integer, String> p1 = new Pair<Integer, String>(1, "홍길동");
Pair<String, String> p2 = new Pair<String, String>("001", "홍길동");
p1.displayKeyValue(160, "키"); //160 : 키 출력
p1.<String, Integer>displayKeyValue("키", 160); //키 : 160 출력
}
}
p1은 key를 Integer로, value를 String으로 생성한 변수이고
p1은 key와 value 모두 String으로 생성한 변수이다.
p1.displayKeyValue() 에는 Integer, String 이 들어가야 한다.
p1.<String, Integer>displayKeyValue() 로 다시 적어주면 String, Integer 로 쓸 수 있다.