Generics

soob·2021년 3월 21일
0

생존 java

목록 보기
4/6

generics란?

  • 다양한 타입의 객체들을 다루는 메서드나 클래스에 컴파일 시의 타입체크를 해주는 기능
  • 컴파일시 제네릭 타입을 실제 타입으로 다 변경 시킨다

1. 선언 방법

class A<T>{
	T item;
	
    void setItem(T item){this.item = item};
    T getItem() {return item;}
}
  • static 멤버는 제네릭 타입을 사용 할 수 없다.
  • 제네릭 배열은 생성할 수 없다.
T[] itemArr; ///가능

T[] Arr = new T[10] ///불가능
  • 제네릭 배열을 생성 하기 위해서는 Object배열을 생성해서 복사한 다음에 T[]로 형변환 하는 방법을 사용

2. 제네릭 클래스의 객체 생성과 사용

  • 객체를 생성할 때는 참조변수와 생성자에 대입된 타입이 일치해야한다.
  • 두 타입이 상송관계에 있어도 마찬가지
Box<Fruit> appleBox = new Box<Apple>(); ///error

3. 제한된 제네릭 클랙스

  • 매개변수 T에 지정할 수 있는 타입의 종류를 제한하는 방법
  • 제네릭 타입에 extends를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한할 수 있다.
class FruitBox<T extends Fruit>{}
  • Fruit의 자손만 타입으로 지정가능

4. 와일드 카드

제네릭 클래스 타입의 매개변수를 사용하는 함수에서 다형성을 주기위해 사용

  • 종류
    • 제한없음. 모든타입이 가능. 와 동일
    • 와일드 카드의 상한 제한. T와 그 자손들만 가능
    • 와일드 카드의 하한 제한. T와 그 조상들만 가능
  • 예시
class Juicer{
	static Juice makeJuice(FruitBox<? extends Fruit> box){
		String tmp = ";
		for(Fruit f : box.getList()) tmp += f + " ";
		return new Juice(tmp);
	}
}

5. 제네릭 메서드

  • 메서드의 선언부에 제네릭 타입이 선언된 메서드를 제네릭 메서드라 한다.
static <T> void sort(List<T> list, Comparator<? super T> c)
  • 제네릭 클래스에 선언된 T와 제네릭 메서트에 선언된 T는 문자만 같을 뿐 서로 다른 것이다.

ex)

static Juice makeJuice(FruitBox<? extends Fruit> box){
		String tmp = ";
		for(Fruit f : box.getList()) tmp += f + " ";
		return new Juice(tmp);
}

을 변경하면,

static <T extends Fruit> Juice makeJuice(FruitBox<T> box){
		String tmp = ";
		for(Fruit f : box.getList()) tmp += f + " ";
		return new Juice(tmp);
}
profile
쓸데없는 소리를 좋아하는 개발자

0개의 댓글