제너릭 클래스
클래스 선언부에서 클래스 이름 다음에 <> 기호를 표시한다. 그리고 <> 안에는 타입 매개변수의 이름을 저근다. 제네릭 클래스의 인스턴스를 생설할 때 타입 매개변수는 인자로 전달받은 타입으로 대채된다.
제너릭 클래스 선언
public class Bag<T>{
T thing;
public Bag(T thing){
this.thing = thing;
}
}
제너릭 클래스 생성
new Bag<Book>(new Book());
new Bag<>(new Book());
제너릭 클래스를 사용하면 인스턴스 생성 시 타입을 지정할 수 있으므로 동적으로 코드를 재사용 할수 있는 장점이 있다.
제너릭 클래스 참조
제너릭 클래스의 인스턴스를 생성한 후 참조하는 변수가 있어야 계속 사용할 수 있다. 제너릭 인스턴스의 참조변수 타입을 선언하는 문법은 다음과 같다.
Bag<Book> bag = new Bag<>(new Book());
제너릭의 장점
- 불필요한 타입변경을 없애준다.
Object는모든 자바 클래스의 최상위 객체이므로 어떤 타입의 값도 저장할 수 있다. 따라서 제너릭의 역할도 할 수 있지만 메서드를 사용할때 다운캐스팅이 필요하다. - 엄격한 타입 검사를 통해 안정성을 높여준다.
컴파일러가 타입검사를 해 타입의 안정성을 보장 받을 수 있음
타입 매개변수
멀티 타입 매개변수
public class Bag<T,N>{
private T thing;
private N name;
public T getThing(){
return thing;
}
public N getName(){
return name;
}
public Bag(T t, N n){
this.thing = t;
this.name = n;
}
}
타입 제한
위와 같이 선언하면 T를 대체할 수 있는 타입은 슈퍼클래스나 슈퍼클래스를 상속받는 하위 객체들만 가능하다.
와일드 카드 제한
와일드 카드 제한 방법은 상위 제한, 하위 제한 두 가지가 있다.
상위 제한(하위 객체만 가능)
<? extends 슈퍼클래스>
하위 제한(상위 객체만 가능)
<? super 서브클래스>
다양한 적용
제너릭 메서드
public class GenMEthodTest{
static<T extends Number, V extends T> boolean isInclude(T num, V\[\] array){
for(int i=0;i<array.length;i++){
if(array\[i\] == num)
return true;
}
return false;
}
public static void main(String\[\] args){
Integer\[\] inum = {1,2,3,4,5};
Double\[\] dnum = {1.0, 2.0, 3.0, 4.0, 5.0};
String\[\] snum = {"one","two","three", "four", "five"};
System.out.println("결과 : "+isInclude(3, inum);
System.out.println("결과 : "+isInclude(4.0, dnum);
System.out.println("결과 : "+isInclude("two", snum);
}
}
```