Generic Programming: 여러가지 타입의 객체를 같은 코드로 만들고자 하는 테크닉
동일한 류의 코드는 한 번만 사용하기 위해서 하는 프로그램 테크닉
예를 들어 다음과 같은 코드 두개가 있다고 가정해 보자
class BoxA {
A item;
void setItem(A item) { this.item = item; }
A getItem() { return item; }
}
class BoxB {
B item;
void setItem(B item) { this.item = item; }
B getItem() { return item; }
}
BoxA 와 BoxB는 같은 역활을 수행하지만 클래스명이 다른 이유로 다른 타입의 객체를 다루게 된 상태이다.
그런데 우리는 super class와 sub class를 만들 수 있기 때문에 다음과 같은 일을 할 수 있다.
class Box {
Object item;
void setItem(Object item) { this.item = item; }
Object getItem() { return item; }
}
위와 같이 우선 Object 변수와 매개변수를 가지는 클래스를 만든다. 이렇게 할 경우 A와 B 클래스 모두 다룰 수 있게 된다.
Box b = new Box();
b.setItem(new Object());
b.setItem("ABC");
String item = (String)b.getItem();
System.out.println(item);
그러나 이렇게 하는 것의 문제점은 Object라는 것이 너무 광범위한 클래스이다 보니 이렇게 해서 사용할때 이 객체가 어떠 클래스를 가리키고 있는지 확인을 해주어야 한다.
또한 다른 객체에 데이터를 넘길때에도 type casting을 해주어야 한다는 단점이 존재한다.
그래서 위와 같은 문제점을 해결하기 위해 Generic CLass들을 선언한다.
class Box<T> {
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
class Box<T>
와 같은 Type variable 즉 템플릿을 선언하는 것이다. 그 이후 타입을 바꿀 곳에 자료형을 모두 T로 작성한다.
그래서 객체를 생성한때 타입 T를 우리가 선택하여서 결정해 줄 수 있다.
Box<String> b = new Box<String>();
b.setItem(new Object()); // this line causes error.
b.setItem("ABC");
String item = b.getItem(); // type casting not necessary.
System.out.println(item);
그래서 위와 같이 new BOx<String>()
으로 선언하는 순간 String 타입의 객체가 생성되게 된다.
class Entry<K, V> {
private K key;
private V value;
public Entry(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
---
객체 선언
Entry<String, Integer> entry = new Entry<String, Integer>("Fred", 42);
혹은
Entry<String, Integer> entry = new Entry<>("Fred", 42);