제네릭
- 자바에서 제네릭(Generics)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 객체별로 다른 타입의 자료가 저장될 수 있도록 한다.
제네릭 타입
- 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
- 사용법은 아래와 같다.
1
2
3
4
5
public class Box {
private Object o;
public Object get() {return o;}
public void set(Object o) {this.o = o;}
}
위와 같이 Object 타입으로 선언해서 모든 종류의 객체를 저장하는 Box 클래스가 있다고 가정한다.
1
2
3
Box box = new Box();
box.set("a");
String str = (String) box.get();
get 메서드를 통해 받아 온다고 가정했을때 get 은 Object 타입을 리턴하기 때문에 String 으로 다운캐스팅을 하는 과정을 거쳐야한다. 또한, 모든 객체를 받을수 있기 때문에 제대로 동작을 하지 못하는 경우가 생길수도 있다.
1
2
3
4
5
public class Box<T> {
private T t;
public T get() {return t;}
public void set(T t) {this.t = t;}
}
위처럼 제네릭 타입을 사용하는 클래스로 선언할 경우
1
2
3
Box box = new Box<String>();
box.set("a");
String str = box.get();
get 메서드를 통해 받아올때 제네릭 타입을 통해 String 으로 설정하였기 때문에 다운캐스팅 과정을 거치지 않아도 된다. 또한, String 타입 이외 String 를 상위 타입으로 가지고 있지 않는 타입은 set 메서드를 통해 설정하는 것도 불가능하다.
멀티 타입 파라미터
- 제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있다.
1
public class 클래스명<T,M>
위와 같이 2개의 멀티 타입을 통해 선언하여 사용할 수 있다.
제네릭 메서드
- 제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메서드를 말한다.
1
public <T> Box<T> boxing(T t){...}
위와 같이 선언하여 사용할 수 있다.
1
2
3
4
5
public static <T> Box<T> boxing(T t){
Box<T> box = new Box<>();
box.set(t);
return box;
}
이처럼 Box 객체를 리턴해주는 메서드를 생성할 수 있다. 매개 타입을 설정하지 않으면 컴파일 단계에서 오류가 발생한다.
제한된 타입 파라미터
- 타입 파라미터에 지정되는 구체적인 타입을 제한하여 사용할 수있다.
- 제네릭타입 <T extends 상위타입> : T 타입이나 T의 상위 타입만 올 수 있다.
- 제네릭타입 <T super 하위타입> : 하위 타입이나 하위 타입의 상위 타입 (T) 만 올 수 있다.
와일드카드 타입
- 코드에서 ?를 일반적으로 와일드카드라고 부른다. 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신에 와일드카드를 사용한다.
- 제네릭타입 <?>: 제한 없음
- 제네릭타입 <? extends 상위타입> : 와일드 카드의 상한 제한
- 상위 타입이나 상위 타입의 하위 타입만 올 수 있다.
- 제네릭타입 <? super 하위타입> : 와일드 카드의 하안 제한
- 하위 타입이나 하위 타입의 상위 타입만 올 수 있다.