티스토리 뷰

지네릭스 용어

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

지네릭 클래스 선언

지네릭 클래스 선언

 

객체 생성

참조변수와 생성자의 타입 변수 T에 String 타입을 대입한 것이다. 이러한 타입 Box<String>을 '대입된 타입'이라 한다. 객체 생성할 때마다 다른 타입을 대입할 수 있다. 예를 들어, new Box<Tv>();처럼 말이다.

 

지네릭 타입과 다형성

  • 참조변수와 생성자의 대입된 타입은 일치해야 한다.
  • 지네릭 클래스간의 다형성은 성립.(여전히 대입된 타입은 일치해야)
  • 매개변수의 다형성도 성립.
더보기

참조변수와 생성자의 대입된 타입은 일치해야 한다.

ArrayList<Tv>      list = new ArrayList<Tv>();  // OK. 일치
ArrayList<Product> list = new ArrayList<Tv>();  // 에러. 일치

지네릭 클래스간의 다형성은 성립(여전히 대입된 타입은 일치해야)

List<Tv> list = new ArrayList<Tv>();   // OK. 다형성. ArrayList가 list를 구현
List<Tv> list = new LinkedList<Tv>();  // OK. 다형성. LinkedList가 list를 구현

List : 조상, ArrayList : 자손

매개변수의 다형성도 성립

ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv());     // OK. - Tv    : Product 자손 
list.add(new Audio());  // OK. - Audio : Product 자손
다형성 - Product와 그 자손 객체 가능
get메서드 - Product 타입이 대입됨
Product p = list.get(0);  // Product객체는 형변환이 필요없다.
Tv t = (Tv)list.get(1);   // Product의 자손객체들은 형변환을 필요로 한다.

list.get(o)의 반환타입이 Product이기 때문에, Product객체는 형변환이 필요 없다. 그러나 Tv객체는 형변환을 필요로 한다. Product의 자손객체들도 형변환을 필요로 하기 때문이다.

 

예제12_1

  • 코드
더보기
import java.util.*;

class Product {}
class Tv extends Product {}
class Audio extends Product {}

class Ex12_1 {
    public static void main(String[] args) {
        ArrayList<Product> productList = new ArrayList<Product>();
        ArrayList<Tv>      tvList = new ArrayList<Tv>();
//      ArrayList<Product> tvList = new ArrayList<Tv>(); // 컴파일 에러. '대입된 타입'의 불일치
//      List<Tv>           tvList = new ArrayList<Tv>(); // OK. 지네릭 클래스간의 다형성은 성립

        productList.add(new Tv());    // public boolean add(Product e) {  ← Product 또는 그 자손 객체 OK.
        productList.add(new Audio());

        tvList.add(new Tv());         // public boolean add(Tv e) {       ← Tv 또는 그 자손 객체 OK.
        tvList.add(new Tv());
//      tvList.add(new Audio());      // 컴파일 에러. Audio와 Tv는 서로 아무런 관계도 아니기 때문

        printAll(productList);  // Ok.                               ← productList 대입된 타입 = ArrayList<Product>
//      printAll(tvList); // 컴파일 에러. new ArrayList<Tv>를 대입 불가 ← tvList 타입 = ArrayList<Tv>
    }

    public static void printAll(ArrayList<Product> list) {  // new ArrayList<Tv>(); 대입 불가.
        for (Product p : list)                              // 참조변수에 '대입된 타입'인 <Product>와 생성자에 '대입된 타입'이 불일치하기 때문
            System.out.println(p);
    }

이 예제를 가지고 테스트를 많이 해보세요 👨‍🏫

 

'Java의 정석_기초편' 카테고리의 다른 글

제한된 지네릭 클래스 & 지네릭스의 제약  (0) 2022.11.08
Iterator<E>, HashMap<K,V>  (0) 2022.11.07
지네릭스란 & 타입 변수  (0) 2022.11.07
Collections  (0) 2022.11.05
HashMap  (0) 2022.11.05
댓글
공지사항