Iterator의 소스↓
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
import java.util.*;
public class IteratorGenericsExample {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student> ();
list.add(new Student("자바왕", 1, 1));
list.add(new Student("자바짱", 1, 2));
list.add(new Student("홍길동", 2, 1));
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
// Student s = (Student) it.next(); // 제네릭을 사용하지 않으면 형변환이 필요하다.
Student s = it.next();
System.out.println(s.name);
}
}
}
class Student {
String name = "";
int ban;
int no;
Student(String name, int ban, int no) {
this.name = name;
this.ban = ban;
this.no = no;
}
}
HashMap처럼 데이터를 키-값 쌍으로 저장하는 컬렉션 클래스는 지정해야 하는 타입이 두개이다.
public class HashMap<K,V> extends AbstractMap<K,V> {
...
public V get(object key) { ... }
public V put(K key, V value) { ... }
public V remove(Object key) { ... }
...
}
만약 키의 타입이 String이고 저장할 타입이 Student라면 아래와 같이 생성한다.
HashMap<String, Student> map = new HashMap<String, Student>(); // 생성
map.put("자바왕", new Student("자바왕", 1, 1, 100, 100, 100)); // 데이터 저장
이렇게 HashMap을 만들었다면 아래와 같이 작동한다고 보면 된다.
public class HashMap extends AbstractMap {
...
public Student get(Object kye) { ... }
public Student put(String, key, Student value) { ... }
public Student remove(Object key) { ... }
```
}
이렇게 제네릭을 사용하면 HashMap에서 get(Object key), keySet(), values()를 사용할 때 형변환이 필요없다.