코딩과 결혼합니다

231019 - 자바의 정석 chapter 12 (Generics) 본문

2세/Java

231019 - 자바의 정석 chapter 12 (Generics)

코딩러버 2023. 10. 19. 16:37
728x90

⭐Generics란?

  • 컴파일 시 타입을 체크해 주는 기능 - JDK1.5
  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌

 

 

⭐타입 변수

  • 클래스를 생성할 때, Object타입 대신 타입 변수를 선언해서 사용
  • 객체를 생성 시, 타입 변수(E) 대신 실제 타입을 지정(대입)
  • 타입 변수 대신 실제 타입이 지정되면, 형변환 생략가능

 

 

⭐Generics 용어

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

 

 

⭐Generics 타입과 다형성

  • 참조 변수와 생성자의 대입된 타입은 일치해야 한다.
ArrayList<TV> list = new ArrayList<TV>(); // ok, 일치
ArrayList<Product> list = new ArrayList<TV>(); // 에러, 불일치
  • 지네릭 클래스 간의 다형성은 성립
List<TV> list = new ArrayList<TV>(); // ok, 다형성, arrayList가 list를 구현
  • 매개변수의 다형성도 성립
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());// ok
list.add(new TV()); // ok, Product의 자손 클래스도 저장 가능하다.

 

 

⭐Iterator <E>

  • 클래스를 작성할 때, Object타입 대신 T와 같은 타입 변수를 사용

 

 

⭐HashMap <K, V>

  • 여러 개의 타입 변수가 필요한 경우, 콤마를 구분자로 선언
HashMap<String, Student> map = new HashMap<Sting, Student>();
map.put("자바왕", new Student("자바왕",1,1,100,100,100));

 

 

⭐제한된 제네릭 클래스

  • extends로 대입할 수 있는 타입을 제한
  • 인터페이스인 경우에 extends사용
Class FruitBox<T, extends Fruit> {
	ArrayLisst<T> list = new ArrayList<T>();
    ...
}

FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Toy> toyBox = new FruitBox<Toy>(); //에러

 

 

⭐제네릭스의 제약

  • 타입 변수에 대입은 인스턴스별로 다르게 가능
  • static 멤버에 타입 변수 사용 불가
  • 배열 생성할 때 타입 변수 사용 불가. 타입 변수로 배열 선언은 가능
T[] itemArr; //ok

T[] to Array(){
	T[] tmpArr = new T[itemArr, length]; //에러 
    ...

 

 

 

⭐와일드카드 <?>

  • 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능

 

 

 

⭐제네릭 메서드

  • 제네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
  • 클래스의 타입 매개변수 <T>와 메서드의 타입 매개변수 <T>는 별개
  • 메서드를 호출할 때마다 타입을 대입해야 한다.(대부분 생략 가능)

  • 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가

 

 

⭐제네릭 타입의 형변환

  • 제네릭 타입과 원시 타입 간의 형변환은 바람직하지 않다.(경고 발생)

  • 와일드카드가 사용된 제네릭 타입으로는 형변환 가능

 

 

⭐제네릭 타입의 제거

  • 컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
    1. 제네릭 타입의 경제를 제거
    2. 제네릭 타입 제거 후에 불일치하면, 형변환을 추가
    3. 와일드카드가 포함된 경우, 적절한 타입으로 형변환 추가