제너릭이란 ?
계기 ..
현재 기존에 Flask로 작업했던 프로젝트를 Springboot로 리펙토링하는 프로젝트를 작업중이다.
responseDto에 반환값이 id 하나다 보니 위와 같은식으로 코드를 작성했는데 아래와 같은 피드백을 받았다.
제너릭을 대략적으로 ArrayList<T>
또는 Map<K,V>
말고는 잘 써보지 못하였기도 하고 익숙하지가 않았다. 이번 기회에 한번 제네릭에 대해서 알아보려고 한다.
제너릭이란?
- 파라미터 타입이나 리턴 타임에 대한 정의를 외부로 미룬다
- 반환값에 대한타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다
- 타입에 대해 유연성과 안정성을 확보한다
- 런타임 환경에 아무런 영향이 없는 컴파일 시점의 전처리 기술이다
간단한 제너릭 class 사용법!
class Sample<T>{
// 데이터 타입 T
private T data;
// 파라미터로 T를 받는다
public void setData(T data){
this.data = data;
}
// return 타입 : T
public T getData(){ㄴ
return data;
}
}
제너릭을 이용하여 위와 같이 제너릭 클래스와 메서드를 선언할 수 있다.
위와 같이 선언된 제너릭 클래스를 생성할 때는 타입 변수 자리에 사용할 실제 타입을 명시하면 된다.
Sample<Integer> sample = new Sample<Integer>();
sample.setData(2);
Integer ret = sample.getData();
타입 파라미터 컨밴션
- E - Element
- K - Key
- N - Number
- T - Type
- V - Value
- S, U, V etc - 2nd, 3rd, 4th types
- 처음 E,K,T,V 등등 제네릭에서 사용하는 타입 파라미터는 여러개가 있다. 처음에는 이게 무슨 제약 조건을 걸어주는 옵션인 줄 알았다. 하지만 <> 내부에 아무 문자나 넣어도 코드는 작동한다는 거다.
그럼 왜? 컨밴션이 존재하는걸까?
Code Conventions for Java Programming Language에 보면 아래와 같이 나와있다.
“without this convention, it would be difficult to tell the diference between a variable and an ordianry class or interface “
“컨벤션이 없으면, 타입 변수와 클래스 인터페이스의 차이점을 구별하기 어려울 것입니다.” 라고 나와있다.
마지막으로 코드리뷰 받은 것에 대한 수정은 ..?
제너릭 타입의 IdResonpse
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class IdResponse<T> {
private T id;
}
GameService의 일부이다. IdResponse<> 객체를 만들어서 반환해줬다.
public IdResponse<Long> createGame(GameRequestDto requestDto) {
Game game = gameRepository.save(gameMapper.toEntity(requestDto));
return new IdResponse<>(game.getId());
}
반환값이 범용적으로 많이 받는 id 하나라면 자바의 제너릭을 사용해 위와 같은식으로 구성을 하면 코드량이 줄어 유지보수 관점에서 좋을거 같다란 생각이 들었다.
Leave a comment