지네릭스 용어, 지네릭 타입과 다형성
지네릭스 용어
지네릭스는 클래스이름 옆에 타입변수<T>를 선언하는 것이다.
그리고 T를 타입변수 또는 타입 매개변수라고 한다. (T는 타입 문자)
Box는 원시타입(raw type)으로, 일반클래스가 지네릭 클래스로 바뀐건데, 원래 있는 그대로의 타입을 원시타입이라고 한다.
지네릭 클래스를 선언한 것인데, 'T Box'라고 읽는다.
<T>가 타입변수이고,
클래스이름을 원시타입이라고 한다.
이렇게 지네릭 클래스가 선언되어있을 때, 이 클래스의 객체를 생성해서 사용하려면,
이렇게 참조변수와 생성자에 대입된 타입으로 <타입변수>를 넣어줘야 한다.
그리고 두 <타입변수>가 일치해야 한다.
지네릭 클래스가 타입이 있을 때, 타입변수에 실제 타입을 정해주는 것이다.
이 타입은 객체를 만들 때 마다 다르게 지정할 수 있다.
영어로 parameterized type이라고 하는데, 매개변수화된 타입, 대입된 타입이라고 부른다.
지네릭 타입과 다형성
- 참조 변수와 생성자의 대입된 타입은 일치해야 한다.
반복적으로 언급하고 있지만, 참조 변수에 대입된 타입과 생성자에 대입된 타입은 일치해야 한다.
불일치하면 에러가 발생한다.
Product와 Tv는 조상 자손 관계인데,
지네릭 타입에서는 이러한 관계일 때도 안된다.
참조 변수와 생성자의 대입된 타입은 일치해야 한다.
- 지네릭 클래스간의 다형성은 성립. (여전히 대입된 타입은 일치해야)
List<Tv> list = new ArrayList<Tv>(); 처럼
지네릭 클래스간의 다형성은 성립한다.
하지만, 지네릭타입에 대입된 타입은 여전히 일치해야 한다.
- 매개변수의 다형성도 성립
ArrayList에 <Product> 타입이 대입되면,
매개변수의 타입이 <Product> 타입 뿐만 아니라,
Product의 자손들도 Ok다.
Tv와 Audio가 Product의 자손이라서 Product지네릭타입인 ArrayList에 저장될 수 있다.
이게 왜 가능하냐면,
ArrayList의 add메서드를 보면, E에 Product가 대입이 되서
오른쪽처럼 바뀐다.
그러면, 바뀐 add(Product e) {}에는 Product와 그 자손객체가 가능하다. 이것이 다형성이다.
get() 메서드인 경우에도 E에 Product가 대입되면,
get()의 반환타입이 Object가 아니라 Product가 되는 것이다.
그래서 Product p = list.get(0);에 형변환이 필요없는 것이다.
그런데 만약, Tv타입의 참조변수 t에 list.get(1)을 저장하려고 한다면 이때는 형변환이 필요하다.
왜냐하면 list.get(1)의 반환타입이 Product이기 때문이다.
[Ex12_1]
'JAVA' 카테고리의 다른 글
제한된 지네릭 클래스, 지네릭스의 제약 (0) | 2022.05.04 |
---|---|
Iterator, HashMap과 지네릭스 (0) | 2022.05.04 |
타입 변수 (0) | 2022.05.04 |
지네릭스란? (0) | 2022.05.03 |
Collections클래스, 컬렉션 클래스 요약 (0) | 2022.05.03 |
댓글
이 글 공유하기
다른 글
-
제한된 지네릭 클래스, 지네릭스의 제약
제한된 지네릭 클래스, 지네릭스의 제약
2022.05.04 -
Iterator, HashMap과 지네릭스
Iterator, HashMap과 지네릭스
2022.05.04 -
타입 변수
타입 변수
2022.05.04 -
지네릭스란?
지네릭스란?
2022.05.03