본문 바로가기
개발잡담

Generic(제네릭) 에 대해서

by 행복한집사 2022. 4. 13.

많은 분들이 제네릭에 대한 개념을 알고는 있고 개발하면서 여러번 제네릭의 도움을 받곤 하지만 사실 깊이 생각해 본 적은 없을 것이다.(저만 그런가요...?반성합니다..ㅜ)

제네릭에 대한 글을 작성하고자 마음먹고 난 후 갑자기 Spring의 Resttemplate를 이용하면서 무심히 스쳐 지나갔던(?) 제네릭의 존재가 문득 다시 떠올랐다.

사이드 프로젝트에서 네이버 영화검색 Open API를 호출하면서 아래와 같이 코드를 작성하였는데

NaverMovie naverMovie = restTemplate.exchange(OpenNaverMovieUrl_getMovies, HttpMethod.GET, entity, NaverMovie.class, title, start, genre)
                                            .getBody();

이 때 나는 요청응답의 body를 편리하게 바로 내가 작성한 NaverMovie란 클래스로 받을 수 있었다.

HttpEntity의 getBody 메서드는 사실 아래와 같이 되어 있기 때문이다.

public class HttpEntity<T> {
    public static final HttpEntity<?> EMPTY = new HttpEntity();
    private final HttpHeaders headers;
    @Nullable
    private final T body;

    protected HttpEntity() {
        this((Object)null, (MultiValueMap)null);
    }

    public HttpEntity(T body) {
        this(body, (MultiValueMap)null);
    }

    public HttpEntity(MultiValueMap<String, String> headers) {
        this((Object)null, headers);
    }

    public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {
        this.body = body;
        this.headers = HttpHeaders.readOnlyHttpHeaders((MultiValueMap)(headers != null ? headers : new HttpHeaders()));
    }

    public HttpHeaders getHeaders() {
        return this.headers;
    }

    @Nullable
    public T getBody() { //이 부분!!
        return this.body;
    }

HttpEntity는 제네릭 타입을 파라미터로 가지고 있다. 따라서 getBody 메서드는 외부에서 지정된 타입을 리턴타입으로 반환하게 되어 있다. 이처럼 제네릭은 클래스나 메서드에서 사용할 내부 데이터 타입을 외부에서 지정하는 기법이다.

 

제네릭을 사용하면 다음과 같은 장점이 있다.

1) 컴파일 타임에 자료형의 오류에 대한 검증을 수행하여 런타임에 자료형에 안전한 코드를 실행 가능

2) 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있고 형변환이 없어지므로 가독성 상승

 

제네릭은 상한경계 및 하한경계를 줄 수 있다.

T extends [타입]: 타입 매개변수의 클래스는 Fruit 클래스이거나 Fruit의 하위 클래스이어야 한다.

그러나 'T super [타입]' 이런 문법은 없다. 참고한 우아한Tech 유투브에는 아래와 같은 예시를 들어주셨지만... 

'T super Fruit : 타입 매개변수의 클래스는 Fruit 클래스이거나 Fruit의 상위 클래스이어야 한다.'

와일드카드 '? super [타입]'가 존재해서 헷갈리신거 아닐까...?

 

제네릭은 매우 많은 내용이 있는데...이만 12시가 넘어서 심화된 내용은 다음으로 넘기도록 하겠다.

 

  

참고: 우아한Tech 유투브 https://www.youtube.com/watch?v=Vv0PGUxOzq0 

 

댓글