< > 기호의 의미
제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 결정하는 것이다.
왜 필요한가?
제네릭을 사용하면 컴파일러에게 클래스에 들어갈 데이터 타입을 미리 알려줄 수 있다.
List list = new ArrayList();
List<String> list = new ArrayList<>();
- 제네릭을 사용하지 않은 위의 경우 꺼낼 때 형변환이 필요하다.
- 그 아래의 제네릭을 사용한 경우 문자열만 넣을 수 있으므로 꺼낼 때 안전하다.오늘 마주친 제네릭들
- 1.
ResponseEntity<어쩌고Dto> - HTTP 응답을 보낼 때 응답 본문에
어쩌고Dto라는 객체를 담아서 보내겠다는 뜻. - 데이터를 받는 쪽에서 '이 응답을 뜯어보면
어쩌고Dto가 들어있겠구나'하고 확신할 수 있음.2.Response<Void> - 응답은 보내지만 본문에 담을 데이터는 없다는 뜻.
- 보통
deleteTag()처럼 데이터를 삭제하는 작업은 성공 여부만 중요하고 딱히 돌려줄 데이터 객체가 없어서Void를 사용함.3.<List<Question>>중첩 사용 - 응답 본문에
Question객체들이 여러 개 담긴 리스트를 넣어서 보내겠다는 의미.4.Map<String, Integer> - Key는 String 타입, Value는 Integer 타입인 Map을 의미함제네릭을 쓰면 좋은 점
- 타입 안정성
잘못된 타입이 들어오면 컴파일 단계에서 에러를 잡아줌 - 불필요한 형변환 제거
데이터를 꺼낼 때마다 타입을 강제로 변환할 필요가 없어서 코드가 깔끔해짐메서드 앞에 붙는<T>예를 들어
처럼 메서드 앞에public <T> T genericMethod(T t)< >가 붙는 경우도 있는데, 이는 이 메서드가 호출될 때 타입을 결정하는 제너릭 메서드라는 선언이다.왜T를 쓰는가?< >안에는 아무거나 써도 되는데 보통 관례적으로 다음과 같이 쓴다.
| 기호 | 의미 | 설명 |
|---|---|---|
<T> |
Type | 가장 일반적으로 타입을 나타낼 때 사용 |
<E> |
Element | 리스트나 셋 같은 컬렉션 내부 요소 |
<K> |
Key | Map의 키 타입 |
<V> |
Value | Map의 값 타입 |
<N> |
Number | 숫자 타입을 강조 |
<?>
코드를 보다보면 <?>가 적힌 경우도 보이는데 이건 와일드 카드라고 한다.
예를 들어 List<?>는 어떤 타입이든 상관없이 다 받을 수 있는 리스트라는 뜻이다.List<? extends Number>는 적어도 Number 클래스나 그 자식들이 들어올 수 있다고 상한선을 정하는 것이다.
제네릭 메서드
클래스 전체가 아니라 메서드 하나만 제네릭으로 만들고 싶을 때는 다음과 같이 쓴다.
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
이 메서드는 호출할 때 String[]을 넣으면 T가 String이고, Integer[]를 넣으면 T가 Integer가 된다. 하나의 코드로 모든 타입을 대응할 수 있다.
요약
< >는 타입을 변수처럼 처리하겠다는 약속이다. 컴파일할 때 미리 타입을 체크해서 좋다. 코드 재사용성이 올라간다.
'Java' 카테고리의 다른 글
| 깔끔한 Service 코드 만들기(from, map, collect) (0) | 2026.01.26 |
|---|---|
| from() (0) | 2026.01.26 |
| collect() (0) | 2026.01.26 |
| map() (0) | 2026.01.26 |