재훈재훈
제네릭(Generic) 본문
제네릭(Generic)
제네릭은 클래스를 정의 내릴 때, 그 클래스에서 사용할 데이터타입을 미리 지정하지 않는 기법이다.
객체를 생성하는 시점에 가상의 타입을 실제하는 타입으로 지정해준다.
데이터 타입에 의존하지 않는다. Parameterized Class이다.
소스 출처 - 부경대 권오흠 교수님, <JAVA로 배우는 자료구조> 강의
예시 1)
public class Box<T> { // T라는 가상의 타입에 의해서 parameterized된 클래스
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
…
Box<Integer> integerBox = new Box<Integer>(); // 객체를 생성할 때 가상의 타입 T를 실제하는 타입으로 지정
integerBox.set( new Integer(10) );
Box<Event> eventBox = new Box<Event>();
eventBox.set(new OneDayEvent(“dinner”, new MyDate(2017,2,10)));
예시 2) 매개변수가 2개인 제네릭
public class Pair<K, V> { // 2개 이상의 타입 파라미터를 가질 수 있다.
private K key;
private V value;
public void set(K key, V value) {
this.key = key;
this.value = value
}
public K getKey() {
return key;
}
}
…
Pair<String, Integer> p1 = new Pair<String, Integer>(); // 똑같이 객체를 생성할 때 실제하는 타입으로 지정함
p1.set(“Even”, 9);
Pair<String, String> p2 = new Pair<String, String>();
제네릭을 사용함으로 여러 데이터 타입을 정의한 클래스에 쓸 수 있게 됬다.
그러나 Object 데이터 타입을 사용하면 데이터 타입의 구분 없이 다형성을
이용하여 사용할 수 있을텐데 굳이 제네릭을 사용하는 이유가 무엇일까?
Object를 사용한 코드 제네릭을 사용한 코드
왼쪽의 코드는 Object 데이터타입을 이용한 코드인데 get 메서드의 반환형이 Object형이다.
그러므로 밑의 코드 처럼 반드시 Type Casting이 필요하다.
반면에 제네릭의 경우는 객체 생성 시 사용할 데이터타입을 지정해줄 수 있어서 편리하게 사용이 가능하다.
제네릭은 타입 안정성에서 뛰어나다
한편 제네릭은 기본 데이터타입을 지원하지 않는다. 오직 참조형 데이터 타입에 대해서만 사용 가능하다.
그러므로 만약 기본 데이터타입을 사용하고 싶으면 Wrapper Class( ex. Integer i = new Integer(10); )을 사용하여
참조형 데이터타입으로 바꾼 후 사용해야 한다.
'Computer Engineering > JAVA' 카테고리의 다른 글
OODP - Strategy Pattern (0) | 2018.04.07 |
---|---|
OODP - Singleton Pattern (0) | 2018.04.07 |
파라미터의 다형성 (0) | 2018.04.07 |
추상클래스와 인터페이스 (0) | 2018.04.07 |
다형성과 동적 바인딩 (0) | 2018.04.07 |