Generics : 제너릭
참고
자바의 정석
제너릭
- 제너릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.
장점
- 타입 안정성을 제공
- 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해짐
- 제너릭 타입은 클래스와 메서드에 선언가능하다.
- T 를 타입 변수라고 하며 T가 아닌 다른 것을 사용해도 된다. (E : Element, K : Key, V : Value ) 이들은 기호의 종류만 다를 뿐 임의의
class Box<T> {
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
용어
class Box<T> {
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
Box<T>
: 제너릭 클래스, T의 Box
또는 T Box
라고 읽는다.
T
: 타입 변수 또는 타입 매개 변수. (T는 타입 문자)
Box
: 원시 타입
특징
- static 멤버에는 타입 변수 T 를 사용할 수 없다. static 멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계 없이 동일한 것이여야 하기 대문이다. 즉,
Box<Apple>.item
과Box<Grape>.item
이 다른 것이어서는 안된다.
제한된 제너릭 클래스
- 다음과 같이 지정하면 T는 Fruit의 자손만 타입으로 지정가능하다.
class FruitBox<T extends Fruit> {
ArrayList<T> list = new ArrayList<T>();
}
- 인터페이스를 구현 해야한다는 제약 사양이 있을 때, 다음과 같이 implements 가 아닌 extends 로 사용함
interface Eatable {}
class FruitBox<T extends Eatable> { ... }
* Fruit의 자손이면서 Eable인터페이스도 구현해야한다면 다음과 같은 & 기호 사용
class FruitBox< T extends Fruit & Eatable> { ... }
### 와일드 카드
< ? extends T > # 와일드 카드의 상한 제한. T와 그 자손만 가능
< ? super T > # 와일드 카드의 하한 제한. T와 그 조상만 가능
< ? > # 제한 없음. 모든 타입이 가능 < ? extends Object > 와 동일
-
아래의 경우 Fruit 자손 타입 아무 것이나 와도됨
-
static 메서드 같은 경우 사용(컴파일 에러 발생)
static Juice makeJuice(FruitBox< ? extends Fruit > box ) { }
제너릭 메서드
-
매서드 선언 부에 제네릭 타입이 선언된 메서드
-
제너릭 타입의 선언 위치는 반환 타입의 바로 옆
class FruitBox<T> { static <T extends Fruit> Juice makeJucie(FruitBox<T> box) { .. return new Juice(tmp); } }
Author And Source
이 문제에 관하여(Generics : 제너릭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@borab/Generics저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)