1. 문제

public class ResponseDTO {
    private List<T> data;  // T가 무엇인지 정의되어 있어야 함
}

위와 같이 작성하니까 에러가 발생한다.

 

에러 메세지는 'cannot find symbol'인데 왜 발생하는 걸까?

 

2. 문제 원인

자바의 제네릭(Generic) 문법에서 <T>는 타입 파라미터(parameterized type)를 선언하는 것이다. 이 선언은 컴파일러에게 T가 어떤 타입으로 사용될지를 알려주는 역할을 한다.

 

만약 위와 같이 public class ResponseDTO처럼 <T>를 생략하면, T는 선언되지 않은 정의되지 않은 심볼(symbol) 이 되기 때문에 다음과 같은 에러가 발생한다.

 

위는 매개변수 없이 함수 내부에서 x를 쓰는 것과 같은 오류라고 한다.

 

3. 문제 해결

public class ResponseDTO<T> {
    private String error;
    private List<T> data;
}

제네릭을 사용하고 싶다면 반드시 클래스 정의부에 <T>를 선언해야 한다.

 

public class ResponseDTO {
    private String error;
    private List<Object> data; // 또는 List<String>, List<SomeDTO> 등 명시적으로 작성
}

만약 제네릭이 필요 없다면 T 대신 명시적인 타입을 지정해야 한다.

 

[결론] 타입 파라미터에 Generic 타입을 사용할 경우 클래스 정의부에 <T>를 선언하자.

+ Recent posts