[Java] Generic?

devShin·2024년 3월 27일
post-thumbnail

1. Generic

데이터 타입(data type)을 일반화(generalize)하는 것
클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하여
컴파일 시에 미리 타입 검사(Type Check)를 수행


1.1 Generic 사용시 장점

  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성 향상
  • 반환값 타입 변환 및 타입 검사 간소화

1.2 Object 사용과 Generic 사용의 차이점

1.2.1.1 Object를 사용했을 때(JDK 1.5 이전)

class Apple {}
class Banana {}
class fruitBox {
    private Object fruit;
    public FruitBox(Object fruit) { this.fruit = fruit; }
    public Object getFruit() { return fruit; }
}
public static void main(String[] args) {
    FruitBox appleBox = new FruitBox(new Apple());
    FruitBox bananaBox = new FruitBox(new Banana());
    Apple apple = (Apple) appleBox.getFruit();
//  Banana banana = (Banana) appleBox.getFruit(); // 런타임 에러 발생
}
  • 데이터 타입 검증이 컴파일 과정에 이루어지지 않는다. (비교적 발견 어려움)
  • 별도의 캐스팅 과정이 필요하다.
    • 반환된 Object 객체를 다시 원하는 타입으로 타입 변환 과정 중 오류가 발생할 가능성 존재

1.2.1.2 Generic을 사용했을 때(JDK 1.5 이후)

class Apple {}
class Banana {}
class fruitBox<T> {
    private T fruit;
    public FruitBox(T fruit) { this.fruit = fruit; }
    public T getFruit() { return fruit; }
}
public static void main(String[] args) {
    FruitBox<Apple> appleBox = new FruitBox(new Apple());
    FruitBox<Banana> bananaBox = new FruitBox(new Banana());
    Apple apple = appleBox.getFruit();
//  Banana banana = appleBox.getFruit(); // 컴파일 에러 발생
}
  • 데이터 타입 검증이 컴파일 과정에 이루어진다. (비교적 발견 쉬움)
  • 별도의 캐스팅 과정이 필요 없다.

1.3 Generic 선언 및 생성

1.3.1 Generic 선언

class fruitBox<T> {
    private List<Fruit> fruits = new ArrayList<>();
    public void add(T fruit) { fruits.add(fruit); }
 }
  • FruitBox<T>
    • fruits 에 다른 타입 원소가 추가 될 수 있어서 컴파일 에러 발생
  • FruitBox<T extends Fruit>
    • 타입 매개변수는 Fruit 클래스 or Fruit 하위 클래스 // 상한 경계
    • Fruit 하위 클래스만 오는 것을 보장하므로 에러 발생하지 않음
  • FruitBox<T super Fruit>
    • 타입 매개변수는 Fruit 클래스 or Fruit 상위 클래스 // 하한 경계

Reference

0개의 댓글