자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
Iterator<E>
기본 배경
- Iterator는 컬렉션(List, Set 등)을 순회할 수 있도록 해주는 인터페이스입니다.
- 기존에는 Object next() 방식으로 모든 객체를 리턴했기 때문에, 실제 타입으로 형변환(casting)이 필요했습니다.
제네릭을 사용하지 않음
public interface Iterator {
boolean hasNext();
Object next(); // Object로 반환하므로
void remove();
}
Iterator it = list.iterator();
while (it.hasNext()) {
Student s = (Student) it.next(); // 형변환 필요
}
- list 안에는 Student 객체가 담겨 있음에도 불구하고 Object 타입으로 리턴되기 때문에, 형변환(casting)을 해야 함.
- 문제점: 형변환은 귀찮고, 실수 가능성이 있으며, 런타임 에러(ClassCastException) 발생 가능.
제네릭 사용
public interface Iterator<E> {
boolean hasNext();
E next(); // 타입 E로 반환 (예: Student)
void remove();
}
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
Student s = it.next(); // 형변환 필요 없음
}
- <E>는 타입 파라미터. 예제에서는 E = Student로 사용.
- next()의 반환 타입이 Student가 되므로 형변환 생략 가능.
- 코드의 가독성과 안전성이 높아짐.
HashMap<K, V>
기본 배경
- HashMap은 Key-Value 쌍으로 데이터를 저장하는 컬렉션입니다.
- K는 Key의 타입, V는 Value의 타입입니다.
제네릭 없이 선언한 경우
HashMap map = new HashMap();
map.put("자바왕", new Student(...));
Student s1 = (Student) map.get("자바왕"); // 형변환 필요
- HashMap은 기본적으로 Object 타입을 받기 때문에, get() 결과를 Student로 형변환 필요.
- 위와 같이 사용하면, 컴파일러는 타입 오류를 잡지 못함 → 런타임에 ClassCastException 가능성 존재.
제네릭 사용한 경우
HashMap<String, Student> map = new HashMap<>();
map.put("자바왕", new Student(...));
Student s1 = map.get("자바왕"); // 형변환 필요 없음
- K = String, V = Student
- 제네릭을 사용하면 get() 반환 타입이 자동으로 Student가 되므로 형변환 생략 가능
- 오류를 컴파일 타임에 잡을 수 있어 안전하고 명확함
클래스 내부 정의 방식 차이
제네릭 없이 선언한 클래스
public class HashMap extends AbstractMap {
public Object get(Object key) { ... }
public Object put(Object key, Object value) { ... }
}
제네릭 사용한 클래스
public class HashMap<K, V> extends AbstractMap<K, V> {
public V get(Object key) { ... }
public V put(K key, V value) { ... }
}
- <K, V>를 사용하여 다양한 타입에 대응 가능
- get(), put() 등의 반환 타입이 V가 되므로 형변환 없이 사용 가능
요약
구분 | 제네릭 미사용 | 제네릭 사용 |
타입 명시 | 불가능 | 가능 (<T>, <K, V>) |
형변환 필요 여부 | 필요함 ((Student) 등) | 불필요 |
컴파일 시 타입 체크 | 불가능 (런타임 오류 가능) | 가능 (컴파일러가 체크함) |
코드 가독성/안전성 | 떨어짐 | 높음 |
'Java' 카테고리의 다른 글
와일드 카드, 지네릭 메서드 (0) | 2025.06.26 |
---|---|
지네릭스 제약네릭스 제약 (0) | 2025.06.25 |
지네릭 다형성 (0) | 2025.06.25 |
타입 변수 (0) | 2025.06.25 |
지네릭스 (0) | 2025.06.25 |