1 . 제네릭
다양한 타입 객체를 다루는 메서드, 컬렉션 클래스를 컴파일 할 때 타입을 체크해줍니다.
즉 타입의 안정성을 높여줍니다. 그리고 코드가 더욱 간결해집니다.
class A<T> {
T item;
void setItem(T item) {
this.item = item;
}
T getItem() {
return item;
}
}
T가 타입변수입니다. 이 T는 만능인데 이름은 다른 것으로 적용해도 가능합니다.
즉 ArrayList<E> , Map<K,V>와 같이 Element , Key, Value 앞자를 딴 것도 가능합니다.
즉 Object 타입을 기존에 적용시켰지만 이제 원하는 것을 지정만 하면 됩니다.
이를 객체를 생성하는 코드는 아래와 같습니다.
A<String> b = new A<String>();
//b.setItem(new Object()); //에러
b.setItem("abc");
//String item = (String) b.getItem(); //형변환 불필요
즉 제네릭을 적용시켰기 때문에 어떠한 타입도 적용이 가능한 것입니다.
A<T>는 제네릭 클래스라 불리고 T는 타입변수 A는 원시타입이라고 불립니다.
하지만 제네릭은 static 맴버에 적용하는 것은 불가합니다. 또한 제네릭 타입의 배열을 생성하는 것은 불가합니다.
실제 제네릭을 적용하여 원하는 타입 객체를 응용하는 예제는 아래 코드와 같습니다.
class A<T> {
ArrayList<T> list = new ArrayList<T>();
void add(T item) {
list.add(item);
}
T get(int i) {
return list.get(i);
}
ArrayList<T> getList() {
return list;
}
int size() {
return list.size();
}
public String toString() {
return list.toString();
}
}
A<Car> aBox = new A<Car>(); // OK, 타입 일치
A<Car> aBox = new A<Vox>(); // 에러, 타입 불일치
즉 타입이 일치해야합니다. 즉 Vox가 Car의 자손이여도 에러가 발생합니다.
하지만 제네릭 클래스 자체가 상속관계라면 허용됩니다.
A<Car> aBox = new A<Car>();
aBox.add(new Car()); // OK
aBox.add(new Vox()); // 에러
다른 타입을 추가할 수도 없습니다.
하지만 자손의 객체는 추가가 가능합니다.
A<Vox> voxBox = new A<Vox>();
voxBox.add(new Vox()); // OK
voxBox.add(new Car()); // OK, void add(Vox item);
2. 제네릭 메서드
메서드 선언부에 제네릭이 선언되면 제네릭 메서드라고 불립니다.
Collections.sort()가 바로 제네릭 메서드라고 할 수 있씁니다.
제네릭 타입은 반환 타입 앞에 선언하면 됩니다.
static <T> void sort(List<T> list, Comparator<? super T> c)
제네릭 클래스의 T와 메서드 T는 서로 별개입니다.
static Juice makeJuice2(FruitBox3<? extends Fruit3> box3) {
//...
}
를 제네릭 메서드로 바꾸게 되면 아래처럼 바꿀 수 있습니다.
static <T extends Fruit3> Juice makeJuice2(FruitBox3<T> box3) {
//...
}
// 제네릭 메서드 호출하기
FruitBox3<Fruit3> fruitBox = new FruitBox3<Fruit3>();
FruitBox3<Apple3> appleBox = new FruitBox3<Apple3>();
//...
// 메서드를 호출할 때는 타입변수에 타입을 대입해야함
System.out.println(Juicer.<Fruit3>makeJuice2(fruitBox));
System.out.println(Juicer.<Apple3>makeJuice2(appleBox));
또 위처럼 매개변수 타입을 간소화 시킬 수 있습니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java - 람다 (0) | 2019.07.28 |
---|---|
Java- 열거형 (0) | 2019.07.26 |
Java- 컬렉션 프레임워크(Collections) (0) | 2019.07.24 |
Java- 컬렉션 프레임워크(Properties) (0) | 2019.07.23 |
Java- 컬렉션 프레임워크(TreeMap) (0) | 2019.07.23 |