Day 57

ChangWoo·2023년 6월 1일

자바의 정석

목록 보기
54/71
post-thumbnail

ch 12-4~6 지네릭스용어, 지네릭 타입과 다형성

지네릭스 용어

Box<T> : 지네릭 클래스. 'T의 Box'또는 'T Box'라고 읽는다.
T : 타입변수 또는 타입 매개변수. (T는 타입 문자)
Box : 원시타입(raw type) - 일반클래스 -> 지네릭 클래스

  • 지네릭 클래스 선언
  • 참조변수와 생성자가 일치해야 한다.
  • 대입된 타입은 어느거나 가능하다.

지네릭 타입과 다형성

  • 참조 변수와 생성자의 대입된 타입은 일치해야 한다.
ArrayList<Tv>  list = new ArrayList<Tv>();  // OK. 일치
ArrayList<Product> list = new ArrayList<Tv>(); 에러. 불일치
  • Product = 조상 / Tv = 자손 관계일 때도 불가능하다.
  • 지네릭 클래스간의 다형성은 성립.(여전히 대입된 타입은 일치해야)
List<Tv> list = new ArrayList<Tv>();  // OK. 다형성. ArrayList가 List를 구현
List<Tv> list =  new LinkedList<Tv>(); // OK. 다형성. LinkedList가 List를 구현
  • 매개변수의 다형성도 성립.
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv());	// OK.
list.add(new Audio()); // OK.   Product자손도 OK.
boolean add(E e) {...} -> boolean add(Product e) {...} // 다형성. Product와 그 자손 객체 가능
E get(int index) {...}
Product p = list.get(0);
Tv t = (Tv)list.get(1);

ch 12-7,8 Iterator< E >, HashMap< K, V >

Iterator< E >

  • 클래스를 작성할 때, Object타입 대신 T와 같은 타입 변수를 사용
   < 일반 클래스 > 					< 지네릭 클래스 >
public interface Iterator {		 public interfac Iterator<E> {
	boolena hasNext();				boolean hasNext
    Object next();          ->	 	E next();
    void remove();				 	void remove();
}								 }
Iterator it = list.iterator();
while(it.hasNext()) {
	student s = (Student)it.next();
	...	

  • 이제 next가 student를 반환하므로 타입이 일치하기 때문에 형변환이 필요없다.

HashMap<K,V>

  • 여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언
  • Key와 Value의 타입이 다를 때 사용한다.
  • 타입변수의 타입이 일치해야 한다.
  • K = String / V = Student
  • Object였기 때문에 형변환이 필요했는데, get이 반환하는 것이 Student가 되었으므로 형변환이 필요 없게 되었다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글