본문

[2017.12.08] 30. 제네릭 심화 사용법

도입

이번 포스팅에서는 제네릭을 실제로 어떻게 사용하고 심화된 사용법을 실습할 예정이다.

이론적으로 제네릭을 공부한 후 프로젝트를 진행하며 Interface에서 제네릭을 많이 사용해보았다.

사용하면서 알게된 제네릭의 특징을 정리 할 예정이다.



실습 1. 메소드에서 제네릭 사용과 가변 클래스 변수 

Fiebase를 이용한 프로젝트에서 Json객체를 Java 객체로 변환 할 때 Gson라이브러리를 사용했다.

Gson라이브러리에서 fromJson 메소드의 2번째 인자로 클래스를 받게 되고 해당 파라미터는 가변적이다.


가변적인 클래스를 처리하기 위해 

다양한 라이브러리에서 아래 그림과 같이 가변 클래스를 처리했고 여기서 힌트를 얻어 메소드를 생성했다.

실제 구현

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
// Firebase Object -> Json -> Java Object
public static <U> List<U> getNestedClass(Map<String, Map<StringString>> target, Class<U> CLASS) {
    List<U> ret = new ArrayList<>();
 
    HashMap<StringString> hashMap = new HashMap<>();
    Gson gson = new Gson();
    JSONObject jsonObject;
 
    Iterator<String> ids = target.keySet().iterator();
 
    while(ids.hasNext()) {
        String id = ids.next();
        Map<StringString> map2 = target.get(id);
        Iterator<String> keys = map2.keySet().iterator();
 
        while(keys.hasNext()) {
            String key = keys.next();
            hashMap.put(key, map2.get(key));
        }
 
        jsonObject = getJsonStringFromMap(hashMap);
        ret.add(gson.fromJson(jsonObject.toString(), CLASS));
 
    }
 
    return ret;
}
cs



실습 2. 2개 이상의 클래스를 상속(extends)하거나 구현(implements)한 클래스 사용 

프로젝트를 진행하며 의존성을 차단하기 위해 많은 Interface가 생겼다.

이 후 Adapter에서 2개 이상의 제네릭을 사용하기 위해 찾아본 결과

"&" 를 사용하므로 2개 이상의 클래스를 제네릭 처리가 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
public class InnerRecyclerAdapter<extends IModelGettable & IShowable>
                            extends RecyclerView.Adapter<InnerRecyclerAdapter.Holder> {
    private int index;
    ObservableArrayList<T> mItems;
    ObservableArrayList<T> realItems;
    int layoutResId;
 
    public InnerRecyclerAdapter() {
 
    }
    // ...
}
cs

해당 제네릭(T)에는 IModelGettable과 IShowable를 모두 상속, 구현한 클래스만 사용가능하다.



#제네릭 #제네릭 심화 #자바 제네릭

공유

댓글