승민아 2023. 11. 24. 15:32

 

REST API 응답을 만들며 아래의 코드를 봤다.

public class ApiResponse<T> {

    private T data;
    
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

 

T가 뭐야..

 

자바에서 제네릭은 데이터 형식에 의존 받지 않고 여러 데이터를 가질 수 있도록 지원하는 방법이다.

 

ArrayList와 같이

ArrayList<Integer> l = new ArrayList<Integer>(); 와 같이 생성하고 썼다. 이게 제네릭이였다.

 

그럼 궁금한게 생긴다.

 

Object를 쓰고말지 왜 제네릭을 쓸까??

 

아래의 코드를 보자.

List list = new ArrayList();
list.add(“hello”);
String str = list.get(0);

list의 데이터타입은 Object이다.

list.get(0)으로 꺼냈을때 Object 타입이지만 이것을 String 타입으로 가리키지 못한다.

그래서 컴파일 에러가 난다.

 

(String)list.get(0)으로 매번 타입 변환을 해주어야한다. 이것도 많이 변환하면 성능의 문제로 연결된다.

또한. (int)list.get(0)으로 잘못된 타입 변환을 할 수 있어 예외가 터져 죽어버릴 수 있다..

 

그래서 자바5부터는 기본적인 컬랙션 클래스들 ArrayList 등에  제네릭이 추가되었다.

List<String> list = new ArrayList<>();
list.add(“hello”);
String str = list.get(0);

잘 작동한다.

 

꼬박꼬박 형변환과 타입체크의 번거로움을 덜자..