제네릭 Generics

김예지·2023년 1월 10일
0

컴파일시에 타입체크를 해주는 기능을 한다
장점 1. 타입 안정성을 제공한다
장점 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다

컴파일 체크시 한계가 있어 안정성으로 생긴것이 제네릭이다 제네릭을 사용하면 런타임에서 생길 에러를 컴파일 때 잡을 수 있다 그러므로 코드를 즉각적으로 수정이 가능하게 된다 (jdk1.5 부터 생겼음)

제네릭의 용어

class Box<T> {}
Box<t> -- 제네릭 클래스 T의 box 또는 T box 라고 읽는다
T -- 타입 변수 또는 타입 매개변수 (T는 타입 문자)
Box -- 원시 타입(raw type)

ArrayList<Product> list = new ArrayList<Product>(); 타입 일치
ArrayList<Product> list = new ArrayList<Tv>(); 타입 불일치

  • 상속 관계에 있어도 타입은 무조건 일치시켜줘야함
  • 상속 관계에 있는 객체를 삽입하는 것은 가능

list.add(new Product()); 가능
list.add(new Tv()); Product를 상속 받았기 때문에 가능
list.add(new Audio()); Product를 상속 받았기 때문에 가능

제네릭과 extends

class FruitBox <T extends Fruit> {
// Fruit의 자손만 타입으로 지정가능
}
만일 클래스가 안라 인처페이스를 구현해야 한다는 제약이 필요하다면, 이때도 'extends'를 사요한다. 'implements'를 사용하지 않는다는점에 주의하자

제네릭의 제약

  1. static 멤버에 타입변수 T를 사용할 수 없다
    -T는 인스턴스 변수로 간주되기 때문에 안됨
  2. 지네릭 타입의 배열을 생성하는 것도 혀용되지 않는다
    -T[] itemArr; 가능
    -T[] itemArr = new T(); // new 연산자 사용 불가능

와일드 카드

<? extends T> - 와일드 카드의 상한 제한 T와 그 자손들만 가능
<? super T> - 와일드 카든의 하한 제한 T와 그 조상들마 가능
<?> - 제한 없음 모든 타입이 가능 <? extends Object> 와 동일함

static Juice make Juice (FriutBox<? extends fruit> box){
// fruit를 상속받은 객체의 타입만 지정해줄 수 있음
}

제네릭 메소드

메서드의 선언부에 제네릭 타입이 선언된 메서드를 제네릭메서드라고 한다
static <T> void sort(List<T> list, Comparator<? super T> c)

제네릭 클래스에 정의도니 타입 매개변수가 T이고 제네릭 메서드에 정의된 타입 매개변수가 T이어도 이 둘은 전혀 별개의 것이다 같은 타입 문자 T를 사용해도 같은 것이 나이러는 것에 주의해야 한다

static <T extends Fruit> Juice makeJuice(FruitBox<T> box){
///.....
}
호출시 >>
Juicer.<Fruit>makeJuice(fruitBox);

profile
나만의 방식을 찾아가는 신입신입 개발자

0개의 댓글