Java

Iterator, HashMap과 지네릭스

1space 2025. 6. 25. 23:08

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

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