Box <String> box = new Box <String>();
Box <String> box = new Box <>();
public <T> Box <T> boxing(T t){..} //선언하기 //타입파라미터 리턴타입 메소드명
Box <Integer> box = <Integer> boxing(100); //호출 //타입 파라미터 추정가능하면 생략해도됨
매개변수(인자)에서 허용 -> 유연성 !!
1) 제네릭타입<?> : 제한없음
2) 제네릭타입<? extends 상위타입> : 상위 클래스 제한
3) 제네릭타입<? super 하위타입> : 하위 클래스 제한
" PEG_CSA "
Producer extends get
Consumer super add

Lab#4: ArrayList와 Iterator

Iterator
//for-each
for (Integer i : num)
System.out.println(i);
//iterator
Iterator <Integer> e = num.listIterator();
while(e.hasNext()){
System.out.println(e.next());
}
Lab#6: HashSet

#10 generic으로 구현(문자열도 출력할 수 있도록)
Lab#7: HashMap

#13 map.keySet() : key 모아서 set 형태로 리턴
#16 map.values() : value 모아서 리턴
#24 map.entrySet() : <K, V> key와 value 묶어서 리턴
// Map은 key를 통해 value를 가져올 수 있음 (map.get(key) -> value)
// Entry는 key와 value를 각각 가지고 올 수도 있음 (entry.getKey(), entry.getValue())
#28 for-each : entrySet을 하나씩 꺼내서 entry에 담고 getKey, getValue
interface PrettyPrinter


CollectionPrinter_forEach / CollectionPrinter_Iterator
for-each에서 )
#22 람다식 이용해서 표현하기 //이건 더 익숙해지고 나서 써보자,,
set.forEach(item -> System.out.println(item + ", "));
#24 메소드 참조로 표현하기
set.forEach(System.out::println);
#31~39 Map
for (Map.Entry<K, V> entry : map.entrySet()){
System.out.println(entry.getKey() + " => " + entry.getValue());
}
Map은 entrySet -> entry -> getKey, getValue !!! 잊지말기
Iterator에서)
#23~27 Map
Iterator <Map.Entry<K, V> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<K, V> entry = it.next();
System.out.println(entry.getKey() + " => " + entry.getValue());
여기도 마찬가지로 entrySet -> entry -> getKey, getValue
CollectionPrinterTest

개념은 어느 정도 이해가 되고 있는 것 같다
이제 최대한 정답 코드 안보고 스스로 작성하는 연습을 더 해보자,,,,,,