18장. 제네릭(Generic) 기초 - 타입 안정성과 재사용성의 핵심
"T? E? 무슨 뜻이야?" 제네릭 문법이 헷갈렸다면, 이번 글에서 개념부터 예제까지 한 번에 정리해보세요!
안녕하세요! 오늘은 자바에서 고급 문법으로 여겨지지만 사실 기초 중의 기초인 '제네릭(Generic)'에 대해 이야기해볼게요. 저도 처음에는 List
제네릭이란 무엇인가?
제네릭(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처럼 잘못 이해하고 형변환 시도
- 제네릭을 남발하여 코드 가독성 저하
- 타입 매개변수의 이름을 무의미하게 지어서 혼란 유발
관례상 T
는 Type, E
는 Element, K/V
는 Key/Value, N
은 Number를 의미하지만, 실제로는 어떤 이름이든 사용할 수 있어요.
제네릭 타입이 명확하지 않거나, 하위/상위 제한을 걸고 싶을 때 ? extends T
, ? super T
형태로 사용해요.
직접 사용할 수는 없지만, 자바의 오토박싱 기능 덕분에 Integer
, Double
같은 래퍼 클래스를 사용하면 문제없이 제네릭과 함께 쓸 수 있어요.
자바 5부터 제네릭 기능이 도입되었어요. 이 버전 이후로는 컬렉션을 비롯한 많은 표준 클래스들이 제네릭 기반으로 설계됐어요.
컴파일 시 제네릭 타입 정보가 제거되고 Object로 변환되는 자바의 내부 동작 원리예요. 런타임에는 실제 타입을 알 수 없기 때문에 타입 검사는 컴파일 타임에만 가능합니다.
자바에서는 new T[]
처럼 제네릭 타입 배열을 직접 생성할 수 없어요. 대신 Object[]
를 만들고 타입 캐스팅하거나 List를 사용하는 것이 일반적이에요.
제네릭은 자바에서 가장 강력하면서도 실무에서 자주 사용하는 문법 중 하나예요. 처음엔 T, E, ? 같은 기호들이 낯설고 어려울 수 있지만, 몇 번만 써보면 자연스럽게 익숙해지더라고요. 제네릭을 잘 활용하면 타입 안정성과 코드 재사용성을 동시에 잡을 수 있어요. 오늘 설명드린 내용을 바탕으로 꼭 자신만의 제네릭 클래스를 한번 만들어보세요. 질문이 있다면 언제든 댓글로 남겨주세요. 같이 고민하고 성장해봐요!
제네릭, 자바제네릭, 타입매개변수, 형변환없는코드, 제네릭클래스, 제네릭메서드, 와일드카드, 타입소거, 자바기초문법, Java18장
'프로그래밍 > 자바[JAVA]' 카테고리의 다른 글
20장. 내부 클래스와 익명 클래스 - 자바 클래스의 유연한 구조 이해하기 (1) | 2025.05.16 |
---|---|
19장. 열거형(Enum)과 상수 관리 - 코드의 가독성과 안정성 높이기 (0) | 2025.05.16 |
17장. 컬렉션 프레임워크 한방에 정리 - List, Set, Map 완전 이해 (1) | 2025.05.16 |
16장. 예외 처리 마스터하기 - try-catch, throws, 사용자 정의 예외까지 (0) | 2025.05.15 |
15장. 다형성과 업캐스팅/다운캐스팅 제대로 이해하기 (1) | 2025.05.15 |