Why?
- TDD 하는 중 제네릭 Class 생성에 대해 의문점 생김
- 제네릭에 대해 정확한 정의가 안된 상태
1. 제네릭(Generic)
- 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스(Collection Class)에 컴파일 시
타입 체크(compile-time type check)를 해주는 기능
- 제네릭으로 저장된 객체를 꺼낼 때는 형변환할 필요가 없어 편리하다.
▶ 장점
- 타입 안정성을 제공
- 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.
2. 타입 변수
- 클래스 이름 옆의 '< >' 안에 있는 E를 일컫는다.
- 일반적으로 "Type"의 첫글자를 따서 T를 사용한다.
1) 여러 개의 변수 경우
- Map(K, V) 와 같이 콤마로 구분하여 작성한다. K = Key(키) , V = Value(값)을 의미한다.
2) 제네릭 클래스를 생성 할 시
- 참조변수와 생성자에 타입변수 E 대신에 실제 타입을 지정 해주어야 한다.
- get()의 Object (<E>) 가 아닌 Tv를 반환하게 되므로 형변환이 필요 없게 된다.
3. 용어
- Box<T> : 제네릭 클래스, 'T의 Box' 또는 'T Box' 라 한다.
- T : 타입 변수 또는 타입 매개변수. ( T는 타입 문자)
- Box : 원시타입(raw type)
- Box<String> : 제네릭 타입 호출
- <String> : 대입된 타입(매개변화된 타입)
- 제네릭 메소드를 호출 할 때는 메소드 명 앞에 <>로 타입을 지정해줘야 하지만 컴파일러가 타입을 추정할 수 있는
경우엔 생략할 수있다.
- 컴파일 후에 Box<String>과 Box<Integer>는 이들의 '원시 타입'인 Box로 바뀐다. 즉, 제네릭 타입이 제거된다.
4. 제네릭 타입과 다형성
- 참조변수에 지정해준 제레닉 타입과 생성자에 지정해준 제네릭 타입은 일치해야 한다.
- 클래스 Tv와 Product가 서로 상속관계에 있어도 일치해야한다.
1) ArrayList에 자손 객체만 저장
- 제네릭 타입의 ArrayList를 생성하고 ArrayList에 자손의 객체를 저장한다.
- 대신 ArrayList에 저장된 객체를 꺼낼 때, 형변환이 필요하다.
- 제네릭타입 Product는 그냥 꺼낼 수 있지만 add를 사용하여 새로운 자손 객체에서 꺼낼 때 에는
형변환인 (Tv)를 사용하여 꺼내준다.
This post leared
- 컴파일 후에 <String>, <Integer> 와 같은 제네릭 타입 제거되어 원시타입으로 바뀐다.
- ArrayList에 자손 객체를 add(new ''()) 를 통해 추가할 수 있고, get()을 이용해 꺼낼 때는 자손 객체의 경우 형변환을
사용해야 한다.
'Java' 카테고리의 다른 글
자바의 컴파일 과정 (0) | 2021.10.31 |
---|---|
[JAVA] Wrapper Class와 일급 컬렉션 (0) | 2021.10.17 |
[JAVA] Lambda와 Stream (0) | 2021.10.09 |
[JAVA] 이것저것.. (0) | 2021.08.19 |
[JAVA] 클래스 · 객체 · 인스턴스 (0) | 2021.08.14 |