본문 바로가기
Java/study

제네릭(Generic)

by avvin 2019. 4. 17.

제네릭(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<StringString> p3 = new Pair<>("키""값1");
        Pair<StringString> 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