Generic Programming

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 Classes

그래서 위와 같은 문제점을 해결하기 위해 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);