Java의 < > 기호 - 제네릭(Generics)

< > 기호의 의미

제네릭클래스 내부에서 사용할 데이터 타입을 외부에서 결정하는 것이다.

왜 필요한가?

제네릭을 사용하면 컴파일러에게 클래스에 들어갈 데이터 타입을 미리 알려줄 수 있다.

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을 의미함제네릭을 쓰면 좋은 점
  1. 타입 안정성
    잘못된 타입이 들어오면 컴파일 단계에서 에러를 잡아줌
  2. 불필요한 형변환 제거
    데이터를 꺼낼 때마다 타입을 강제로 변환할 필요가 없어서 코드가 깔끔해짐메서드 앞에 붙는 <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