..
자바 제네릭(Generics)의 목적과 안정성
1. 개요 (Overview)
Java 5.0부터 도입된 제네릭(Generics)은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시점에 미리 지정하는 기술입니다. 이를 통해 타입의 추상화 계층을 높이고 코드의 안정성을 강화할 수 있습니다.
2. 왜 사용하는가?
가독성과 편의성
제네릭이 없던 시절에는 컬렉션에서 요소를 꺼낼 때마다 명시적으로 형변환(Casting)을 해주어야 했습니다.
// 제네릭이 없는 리스트
List list = new LinkedList();
list.add(10);
Integer i = (Integer) list.iterator().next(); // 귀찮은 캐스팅
제네릭을 사용하면 코드의 의도가 명확해지고 번거로운 캐스팅 작업이 사라집니다.
// 제네릭 적용
List<Integer> list = new LinkedList<>();
list.add(10);
Integer i = list.iterator().next(); // 자동 타입 보장
컴파일 시점의 강력한 타입 체크
제네릭의 가장 큰 장점은 실수를 컴파일 시점에 잡아낸다는 것입니다. 잘못된 타입의 객체가 들어오려 하면 컴파일러가 즉시 경고를 주어, 런타임에 ClassCastException이 발생할 여지를 사전에 차단합니다.
3. 와일드카드 (Wildcards)
제네릭의 유연성을 극대화하기 위해 와일드카드(?)를 사용합니다.
<? extends T>: T와 그 자식 타입들만 허용 (상한 제한)<? super T>: T와 그 조상 타입들만 허용 (하한 제한)
와일드카드를 사용하면 특정 타입뿐만 아니라 논리적으로 연관된 다양한 타입들까지 포괄적으로 처리하는 메소드를 작성할 수 있어 코드의 재사용성이 높아집니다.
제네릭은 “이 주머니에는 특정 물건(Type)만 담겠다”고 선언하여, 꺼낼 때마다 확인해야 하는 번거로움을 없애고 주머니가 터지는(Error) 일을 방지하는 안전장치입니다.