1) Generic programming
2) Generic을 사용하는 이유
제네릭을 사용하지 않았을 때
List list = new ArrayList();
list.add("hello");
String str = (String)list.get(0);
//타입변환(String)을 해야하는 불편함이 발생함!
Box box = new Box();
box.set("hello"); //String -> Object 자동 타입 변환
String str = (String) box.get(); //Object -> String 강제 타입 변환
//object면 다 들어갈 수 있지만 타입변환 발생!(n)
제네릭 사용했을 때
List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0);
//타입변환 불필요! list에는 String만 저장할 수 있도록 타입을 명시했으므로.
3) Generic 만들기
public class Box<T> {
private T t;
public T get() { return t; }
public void set(T t) { this.t=t; }
Box <String> box = new Box <String>();
box.set("hello");
String str = box.get();
4) Generic 메소드
public <A,B,...> 리턴타입 메소드명(매개변수,...) {...}
// A,B: 타입 파라미터
public <T> Box<T> boxing(T t) {...}
// T를 받아서 Box<T> 리턴
Box<Integer> box1 = boxing(100);
<T> (표지판): "이 메서드 안에서는 임시로 T라는 알 수 없는 타입을 쓸 거야!"라고 컴퓨터에게 미리 알려주는 역할
Box<T> (리턴 타입): "이 메서드 작업이 다 끝나면 T 타입이 담겨있는 Box 객체를 결과로 돌려줄게."
boxing(T t) (매개변수): "입력값으로는 T 타입의 데이터를 하나 받을게."
-> 실제 실행했을 때
"입력값 자리에 100(Integer)이 들어왔네? 그럼 지금부터 이 메서드의 T는 전부 Integer로 바꿔서 처리해야겠다!" 하고 알아서 타입을 유추
-> 메서드가 public Box<Integer> boxing(Integer t)로 완벽하게 변신
5) Generic의 제한된 타입 파라미터
public <T extends 동물> T getAnimal() { return ...}
6) Generic 와일드카드 타입
?: 제네릭 타입을 매개값이나 리턴타입으로 사용할 때, 범위에 있는 모든 타입으로 대체할 수 있는 ?로 표시 -> 특정 타입 종속x, 재사용성.
자바 제네릭의 '불공변성'
타입 파라미터끼리 상속관계가 있더라도 제네릭 타입 간에는 상속 관계가 전혀 성립하지 않는 성질
-> 사과가 과일의 자식이지만, List<사과>가 List<과일>의 자식은 아님
=> 와일드 카드를 통해 타입의 다형성과 유연성 보장(extends, super의 한정적 와일드카드를 통해 List<과일>로 옮길 수 있음
제네릭타입<?>: Unbounded Wildcards(제한없음)
제네릭타입<? extends 상위타입>: Upper Bounded Wildcards(상위 클래스 제한) -> 꺼내기만 가능
public void printFruits(List<? extends Fruit> basket) {
for (Fruit f : basket) {
System.out.println(f); //꺼내기
}
public void addFruits(List<? super Fruit> basket) {
basket.add(new Apple()); //상위타입에 추가
basket.add(new Pear());
1) collection
2) 컬렉션 인터페이스
-> 컬렉션 인터페이스에는 모든 컬렉션의 공통 기능만 정의. get(index i)X
3) List 컬랙션과 주요메소드
(1) ArrayList
List<E> list = new ArrayList<>();
(2) LinkedList
List<E> list = new LinkedList<E>();
3) Vector
1) Set
2) Set 인터페이스 구현
(1) HashSet
(2) LinkedHashSet
(3) TreeSet
(4) Enumset
3) Map
(1) Map 컬렉션
Set<Map.Entry<K,V>> entrySet() //키, 값 쌍의 모든 Map.Entry 객체를 Set에 담아 리턴
Set<K> keySet() // 모든 키를 Set에 담아서 리턴
Collection<V> values() //저장된 모든 값 Collections에 담아서 리턴
(2) HashMap
Map<K,V> map = new HashMap<K,V>();
4) CollectionPrinter - PrettyPrinter
링크텍스트