Lonely Snowman
 

[JAVA] Generic

클래스에 사용할 타입을 설계 시에 지정하지 않고 클래스를 사용할 때 지정하여 사용하는 기술

 

  • 컴파일 시 잘못된 타입 사용을 체크하기 때문에 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 로 쓸 수 있다.