JAVA2_01_지네릭스

charl hi·2021년 9월 24일
0

JAVA2

목록 보기
1/8

지네릭스

  • 컴파일 시 타입을 체크해 주는 기능(compile-time type check)
  • <T> 해당 타입 외에 X
  • 컴파일러의 한계 극복 : 컴파일러가 못 잡아내는 에러(ClassCastException 등) 미리 잡아냄
    -> 실행 시 발생 에러를 컴파일 시 발생 에러로 미리 잡아낸다!
  • 타입체크가 강화된다.
  • <Object>로 하면 모든 게 다 들어갈 수 있다.

  • 이젠 <> 해야한다!!

  • 장점 : 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여서 코드가 간결해진다.

  • ClassCastException : RuntimeException 의 자손

  • 지네릭스는 RuntimeException(프로그래머 실수로 실행 중 발생하는 에러) 전에 컴파일 때 에러날 수 있게(compile time에러) 해준다.

  • ✔런타임에러를 컴파일 타임에 체크할 수 있게 해준다.

  • ✔컴파일러에게 타입정보를 줘서 형변환 에러를 줄인다.



타입변수

링크텍스트

  • 지네릭 클래스를 작성할 때 Object타입 대신 타입변수(E)를 선언해서 사용한다.

  • 일반 클래스 -> 지네릭 클래스
    : ArrayList -> ArrayList<E>

  • 보통 <T>, <E>

타입변수에 대입하기

  • 객체 생성 시, 타입변수(E) 대신 실제 타입(Tv)을 지정(대입)
  • 참조변수와 생성자에 같은 실제 타입을!!
ArrayList<Tv> tvList = new ArrayList<Tv>();
  • ✨✨타입변수 대신 실제타입이 지정되면 형변환 생략가능!!!

  • 예전)

ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0);
//형변환 필수!!! 왜?? 반환타입이 Object니까!!
  • 타입변수에 실제타입 사용)
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0);
//형변환 불필요!! 왜?? 반환타입이 Tv니까!!!


지네릭스 용어

Box<T>

  • 지네릭 클래스
  • 'T의 Box' / 'T Box'

T

  • 타입변수 / 타입 매개변수

Box

  • 원시타입, 일반 클래스


지네릭 타입과 다형성

1. 다형성 X

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

(O)
ArrayList<Tv> list = new ArrayList<Tv>();	//타입 일치
..
(X)
ArrayList<Product> list = new ArrayList<Tv>();	//타입 불일치 
  • 참조변수<>와 생성자<>의 ✨✨<타입변수>는 일치해야 한다!!

2. 다형성 O

✨✨지네릭 클래스 간의 다형성은 성립한다.

List<Tv> list = new ArrayList<Tv>();
List<Tv> list = new LinkedList<Tv>();

✨✨(매개변수)의 다형성도 성립한다.

ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv());	//Product의 자손 OK
list.add(new Audio());	//Product의 자손 OK
  • (매개변수)는 타입이 일치안해도 된다!!

주의해야 할 점

💖💖형변환 여부 결정하기

위의 예에서

Product p = list.get(0);	//get()의 반환타입 == Product

<Product>, get()의 반환타입 == Product 이므로 형변환이 필요없다.

Tv t = (Tv)list.get(1);	//get()의 반환타입 == Product

list[1]Tv가 들어가 있더라도 ✨✨원래 반환타입은 <Product>이므로 형변환 필수!!




Ref

0개의 댓글