본문 바로가기
프로그래밍/자바[JAVA]

18장. 제네릭(Generic) 기초 - 타입 안정성과 재사용성의 핵심

by 사업가 Jay 2025. 5. 16.

18장. 제네릭(Generic) 기초 - 타입 안정성과 재사용성의 핵심

"T? E? 무슨 뜻이야?" 제네릭 문법이 헷갈렸다면, 이번 글에서 개념부터 예제까지 한 번에 정리해보세요!

안녕하세요! 오늘은 자바에서 고급 문법으로 여겨지지만 사실 기초 중의 기초인 '제네릭(Generic)'에 대해 이야기해볼게요. 저도 처음에는 List 이런 거 보고 "이게 뭔 소리야?" 싶었는데, 알고 보면 제네릭은 정말 강력한 기능이더라고요. 특히 형 변환 없이도 안전하게 데이터를 다룰 수 있어서 코드가 훨씬 깔끔해지고, 재사용성도 높아져요. 이번 18장에서는 제네릭의 기본 문법과 왜 필요한지, 그리고 자주 쓰는 패턴들을 정리해드릴게요. 제네릭에 자신 없던 분들, 이 글로 확실히 다잡고 가세요!

제네릭이란 무엇인가?

제네릭(Generic)은 클래스나 메서드를 정의할 때, 사용할 데이터 타입을 나중에 지정할 수 있도록 하는 기능이에요. 흔히 사용하는 <T>, <E> 같은 기호는 타입 매개변수(type parameter)를 의미하죠. 예를 들어 List<String>은 String 타입만 저장할 수 있는 리스트를 의미해요. 덕분에 타입 안정성과 코드 재사용성이 크게 향상돼요.

왜 제네릭을 사용해야 할까?

이점 설명
타입 안정성 보장 컴파일 시 타입 검사를 통해 오류를 방지할 수 있어요.
형변환 제거 Object를 쓸 때처럼 형변환을 따로 하지 않아도 돼요.
코드 재사용성 향상 하나의 코드로 다양한 타입을 처리할 수 있어요.

제네릭 기본 문법

  • <T>: Type, 타입 일반화
  • <E>: Element, 컬렉션 요소에 자주 사용
  • <K, V>: Map에서 Key, Value

List names = new ArrayList<>();
names.add("영희");
String name = names.get(0); // 형변환 없이 바로 사용 가능

제네릭 클래스와 메서드

제네릭은 클래스나 메서드에도 적용할 수 있어요. 제네릭 클래스는 타입 매개변수를 멤버 필드나 메서드에서 사용할 수 있게 해주고, 제네릭 메서드는 호출 시점에 타입을 지정할 수 있어요. 대표적으로 Box, Pair 같은 구조에서 자주 사용돼요.


// 제네릭 클래스
public class Box {
  private T value;
  
  public void set(T value) { this.value = value; }
  public T get() { return value; }
}

// 제네릭 메서드
public  void print(T data) {
  System.out.println(data);
}

Object 사용과의 차이점 비교

구분 Object 사용 Generic 사용
형변환 필요함 불필요
타입 안정성 낮음 (런타임 오류 가능) 높음 (컴파일 타임 검증)
가독성 낮음 높음

제네릭 사용 시 흔한 실수

  • 제네릭 타입을 Object처럼 잘못 이해하고 형변환 시도
  • 제네릭을 남발하여 코드 가독성 저하
  • 타입 매개변수의 이름을 무의미하게 지어서 혼란 유발
Q 제네릭 타입은 어떤 알파벳을 써야 하나요?

관례상 T는 Type, E는 Element, K/V는 Key/Value, N은 Number를 의미하지만, 실제로는 어떤 이름이든 사용할 수 있어요.

Q 와일드카드(?)는 언제 사용하나요?

제네릭 타입이 명확하지 않거나, 하위/상위 제한을 걸고 싶을 때 ? extends T, ? super T 형태로 사용해요.

Q 제네릭은 기본형(int, double 등)에도 사용할 수 있나요?

직접 사용할 수는 없지만, 자바의 오토박싱 기능 덕분에 Integer, Double 같은 래퍼 클래스를 사용하면 문제없이 제네릭과 함께 쓸 수 있어요.

Q 제네릭은 자바 몇 버전부터 지원되나요?

자바 5부터 제네릭 기능이 도입되었어요. 이 버전 이후로는 컬렉션을 비롯한 많은 표준 클래스들이 제네릭 기반으로 설계됐어요.

Q 타입 소거(Type Erasure)란 무엇인가요?

컴파일 시 제네릭 타입 정보가 제거되고 Object로 변환되는 자바의 내부 동작 원리예요. 런타임에는 실제 타입을 알 수 없기 때문에 타입 검사는 컴파일 타임에만 가능합니다.

Q 제네릭 배열은 만들 수 없나요?

자바에서는 new T[]처럼 제네릭 타입 배열을 직접 생성할 수 없어요. 대신 Object[]를 만들고 타입 캐스팅하거나 List를 사용하는 것이 일반적이에요.

제네릭은 자바에서 가장 강력하면서도 실무에서 자주 사용하는 문법 중 하나예요. 처음엔 T, E, ? 같은 기호들이 낯설고 어려울 수 있지만, 몇 번만 써보면 자연스럽게 익숙해지더라고요. 제네릭을 잘 활용하면 타입 안정성과 코드 재사용성을 동시에 잡을 수 있어요. 오늘 설명드린 내용을 바탕으로 꼭 자신만의 제네릭 클래스를 한번 만들어보세요. 질문이 있다면 언제든 댓글로 남겨주세요. 같이 고민하고 성장해봐요!

제네릭, 자바제네릭, 타입매개변수, 형변환없는코드, 제네릭클래스, 제네릭메서드, 와일드카드, 타입소거, 자바기초문법, Java18장