본문 바로가기
Java

[Java] Generic 사용법

by 옹알이옹 2023. 8. 6.

 

 1. Generic타입 정의

클래스, 인터페이스, 메서드 등을 일반화하여 타입의 안전성을 제공하는 타입.
  • 클래스나 메서드를 선언할 때 실제 사용될 타입을 지정하지 않는다.
  • 하나의 유연한 클래스를 정의하고, 실제 사용부에서 타입에 대한 제한을 자유롭게 할 수 있어 편하다.
  • 사용 시점에 구체적인 타입을 결정할 수 있다.
  • 코드의 재사용성과 타입 안정성을 높아짐

 2. Generic타입 사용 이유

예를 들어 공통으로 사용하는 CustomReponseEntity를 정의한다고 생각해보자.

public class CommonResponseEntity implements Serializable {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Object data;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String message;

    public CommonResponseEntity(Object data, String message) {
        this.data = data;
        this.message = message;
    }
}

 

사용 Controller

/**
 * 게시판 목록 조회
 *
 * @return
 */
@GetMapping("/board")
public CommonResponseEntity selectBoardList(){

    List<BoardDto> boardList = boardService.selectBoardAll();

    return new CommonResponseEntity(boardList,null);
}

현재 위의 코드에서 List<BoardDto> 타입 말고 다른 타입을 넣으면 어떻게 될까? 첫 번째 파라미터를 Object로 했기 때문에
어떠한 값이 들어가도 에러가 발생하지 않는다.

그것은 문제가 된다. 왜냐하면 해당 API는 '게시판의 목록'을 조회 하는 것인데 return값으로 유저의 목록이나 문자가 반환 된다면 당황스럽지 않겠나.

 

그런 문제를 해결하기 위해 나온 것이 Generic 타입이다. Generic 타입을 사용하면 Object처럼 모든 타입을 허용할 수 있지만, 실제 생성부에서 원하는 타입을 지정하여 해당 타입으로 제한할 수 있어 컴파일 단계에서도 쉽게 체크가 가능하다.

위의 상황에서는 'Board 목록조회' 를 하는 API이므로  List<Board>로 리턴 타입을 제한하는 것이 옳다.

사용 방법은 아래와 같다.

 

 3. Generic타입 사용법

 

Generic 타입 클래스 정의

public class CommonResponseEntity<T> implements Serializable {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;
    private String message;

    public CommonResponseEntity(T data, String message) {
        this.data = data;
        this.message = message;
    }
}
  • 클래스를 생성한 뒤 그 뒤에 <T> 를 붙여 매개인자로 넘어올 값을 받아 준 뒤 그것을 여러 타입의 값을 받을 변수의 타입으로 사용

 

Generic 타입 클래스 사용 부분

/**
 * 게시판 목록 조회
 *
 * @return
 */
@GetMapping("/board")
public CommonResponseEntity<List<BoardDto>> selectBoardList(){

    List<BoardDto> boardList = boardService.selectBoardAll();

    return new CommonResponseEntity<>(boardList,null);
}
  • 실제 사용하는 메소드의 리턴 타입 지정 부분에 <List<BoardDto> 라는 변수를 명시한다.
  • 그러면 CommonReponseEntity에서 매개변수 T를 통해 값을 받고 data의 타입이 List<BoardDto>가 된다.
  • 이렇게 타입이 지정되었기 때문에 return 부분에서 List<BoardDto> 타입이 아닌 다른 타입을 넣을 수 없게 제한되며,
    다른 타입이 들어오면 컴파일 에러가 발생하여 쉽게 문제를 발견할 수 있다.
반응형

'Java' 카테고리의 다른 글

(Java) 패키지 양방향 의존 문제점과 해결 방안  (0) 2024.05.11
Session과 JSESSIONID  (2) 2023.11.20
객체지향 캡슐화 이해하기  (0) 2023.09.15
[Java] 입출력(I/O) 정리  (0) 2023.08.24