제네릭(Generic)
제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터<T>로 대체했다가
실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화시킨다.
new Integer는 기본 데이터 타입인 int를 참조 데이터 타입으로 변환해주는 역할을 한다. 이러한 클래스를 래퍼(wrapper) 클래스라고 한다. 덕분에 기본 데이터 타입을 사용할 수 없는 제네릭에서 int를 사용할 수 있다.
제네릭은 참조 데이터 타입에 대해서만 사용할 수 있다. 기본 데이터 타입은 사용할 수 없다
<int> (X)
멀티 타입 파라미터( class <K,V>, interface<K,V> )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package testAPI; public class TestMain { public static void main(String[] args) { // Product<Tv, String> product1 = new Product<Tv, String>(); Product<Tv, String> product1 = new Product<>(); // 객체 생성 시에 타입 지정 Product<Car, String> product2 = new Product<>(); // 자바7부터는 다이아몬드 연산자 제공 : 타입 파라미터를 유추해서 자동으로 설정해준다. // 제네릭 내부에선 타입 재구성이 일어난다. product1.setKind(new Tv()); product1.setModel("스마트TV"); product2.setKind(new Car()); product2.setModel("디젤"); } } |
제네릭 메서드 ( <T, R> R method(T t) )
매개타입과 리턴타입으로 타입 파라미터를 갖는 메서드
리턴타입 앞에 <> 기호를 추가하고 타입파라미터를 기술한 다음, 리턴타입과 매개타입으로 타입 파라미터르 사용하면 된다.
<T, R> 리턴타입 method( 클래스<T,R> 변수)
호출 시엔 <T, R>method (변수);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package testAPI; public class Pair <K, V> { private K key; private V value; public Pair(K key, V value) { 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; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package testAPI; public class Util { public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) { // 타입파라미터는 리턴타입 앞에 위치하며 타입을 받아서 매개변수 타입파라미터에 전달해준다.?? boolean keyCompare = p1.getKey().equals(p2.getKey()); boolean valueCompare = p1.getValue().equals(p2.getValue()); return keyCompare && valueCompare; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package testAPI; public class TestMain { public static void main(String[] args) { // 제네릭 메서드의 매개값으로 제네릭 클래스의 객체를 Pair<Integer, String> p1 = new Pair<>(1, "사과"); // Integer말고 int로는 x? Pair<Integer, String> p2 = new Pair<>(1, "사과"); boolean result1 = Util.<Integer, String>compare(p1, p2); // 클래스명으로 불러왔으므로 Static // 타입 파라미터 구체적인 타입 생략 가능.아예 다이아몬드 연산자를 생략할 수 있다. if (result1) { System.out.println("p1과 p2는 논리적으로 동등한 객체"); } else { System.out.println("p1과 p2는 논리적으로 동등한 객체"); } Pair<String, String> p3 = new Pair<>("키", "값1"); Pair<String, String> p4 = new Pair<>("키", "값2"); boolean result2 = Util.compare(p3, p4); if (result2) { System.out.println("p1과 p2는 논리적으로 동등한 객체"); } else { System.out.println("p1과 p2는 논리적으로 동등한 객체"); } } } | cs |
제한된 타입 파라미터 (p.664)
와일드카드 타입(p.665)
제네릭 타입의 상속과 구현 (클래스 / 인터페이스)
'Java > study' 카테고리의 다른 글
로컬 객체의 로컬 변수, 매개 변수 사용 (0) | 2019.04.19 |
---|---|
람다식(Lambda Expression) (0) | 2019.04.18 |
멀티스레드 Synchronized Account Testing (0) | 2019.04.16 |
멀티스레드 (0) | 2019.04.16 |
Java 자주쓰는 단축키 모음 (0) | 2019.04.15 |