til/Java
제네릭(generic)
값진
2022. 4. 27. 23:11
제네릭(generic)
- 데이터의 타입(data type)을 일반화(generalize) 하는 것
- 클래스나 메소드에서 사용할 데이터 타입을 컴파일 시에 미리 지정하는 것
- 객체의 타입 안정성을 높일 수 있다.
- 컴파일 할 때 타입이 미리 정해지므로, 형 변환같은 번거로운 작업을 생략할 수 있다.
사용
class MyArray<T> {
T element;
void setElement(T element) { this.element = element; }
T getElement() { return element; }
}
- T는 타입변수로, 임의의 참조형을 의미 (다른 문자 사용 가능)
- 메소드의 매개변수나 반환값으로도 사용할 수 있다.
MyArray<Integer> myArr = new MyArray<Integer>();
- 제네릭 클래스를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야함
- 자바에서 타입 변수 자리에 사용할 실제 타입을 명시할 때 기본 타입을 바로 사용할 수 없다.
- Integer와 wrapper를 사용해야한다.
import java.util.*;
class LandAnimal { public void howl() { System.out.println("육지동물"); } }
class Cat extends LandAnimal { public void howl() { System.out.println("야옹"); } }
class Dog extends LandAnimal { public void howl() { System.out.println("멍멍"); } }
class Sparrow { public void howl() { System.out.println("까악"); } }
class AnimalList<T> {
ArrayList<T> al = new ArrayList<T>();
void add(T animal) { al.add(animal); }
T get(int index) { return al.get(index); }
boolean remove(T animal) { return al.remove(animal); }
int size() { return al.size(); }
}
public class Generic {
public static void main(String[] args) {
AnimalList<LandAnimal> landAnimal = new AnimalList<>();
landAnimal.add(new LandAnimal());
landAnimal.add(new Cat());
landAnimal.add(new Dog());
// landAnimal.add(new Sparrow()); //에러
for (int i = 0; i < landAnimal.size() ; i++) {
landAnimal.get(i).howl();
}
}
}
결과
육지동물
야옹
멍멍
Cat과 Dog 클래스는 LandAnimal 클래스를 상속받는 자식 클래스이므로 AnimalList<LandAnimal>에 추가할 수 있다.
Sparrow 클래스는 타입이 다르므로 추가할 수 없다.