본문 바로가기

수업 & 공부/용어 정리

46 : 제네릭 (Generics)

제네릭(Generics) 이란?

제네릭(Generics)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다.

> 특정타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것

 

제네릭을 쓰는 이유?

  • 형변환이 필요없고, 타입의 안정성이 보장된다.
  • 코드가 간결해지고 재사용성이 높아진다.
  • 제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거가능

 

 

클래스명 뒤에 <>를 붙여서 선언한다.

public class ApiResponse<T> {
    private final boolean success;
    private String message = null;
    private T data;

    public ApiResponse(boolean success, T data) {
        this.success = success;
        this.data = data;
    }

    public ApiResponse(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public ApiResponse(boolean success, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }
}

 

 

 

제네릭 메소드

제네릭은 클래스 레벨에서만 사용할 수 있는게 아니라 메소드 레벨에서도 사용할 수 있다.

제네릭 타입을 선언한 메소드를 제네릭 메소드라 한다.

    @GetMapping(value = "/")
    public ApiResponse<BoardDTO> getBoardList(){
        List<BoardDTO> list = boardService.getBoardList(); 
        return new ApiResponse(true, list);
    }

제네릭 타입을 메소드에서 선언할 때는 접근제어자와 반환타입 사이에 선언한다

 

<접근 제어자>

제어자  같은 클래스 같은 패키지 자손 클래스 전체
public O O O O
protexted O O O X
deafult  O O X X
provate O X X X

 

 

주의) 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다. 즉, int, double, char 같은 primitive type은 올 수 없다는 것이다. 그래서 int형 double형 등 primitive Type의 경우 Integer, Double 같은

Wrapper Type으로 쓰는 이유가 바로 위와같은 이유다.

또한 바꿔 말하면 참조 타입이 올 수 있다는 것은 사용자가 정의한 클래스도 타입으로 올 수 있다는 것이다. 

(출처 : https://st-lab.tistory.com/153 )