제네릭(Generic) - 2
제네릭 타입 < ? >
1
Collection<Object> Collection;
이 코드는 <Object>라는 타입을 지정하고 있다.
이전글에서 언급한 것처럼 <Object>로 타입을 지정하는 것을 제너릭이라고 하였는데 혹시 해당 코드를 모든 Collection 타입을 받기 위해 만든 거라면 오류가 발생할 것이다.
제너릭(generic)은 지정한 타입만 받기 때문에 Object가 최상위 클래스이기에 다 받을 수 있다고 잘못 이해한 지식이다.
모든 Collection 타입 모두를 허용할 수 있는 방법은 <Object>를 지정하는 것이 아니라 와일드카드 <?>를 지정한다.
여기서 와일드카드는 물음표 ?로 표시하며 Java에서 unknown type이다. 와일드카드는 매개변수, 필드 또는 지역 변수의 유형 때론 반환 유형으로 다양한 상황에서 사용할 수 있다.
그래서 아직 알려지지 않은 혹은 미정의 된 Collection 타입이라는 의미에서 Collection<?>를 사용하면 해결된다.
위의 방법대로 지정한다면 Collection의 다양한 타입을 사용할 수 있게 되나 또 다른 문제가 있다.
Collection<?>로 지정하면 Collection 타입은 안전하게 사용할 수 있지만 임의의 객체를 다 받을 수는 없다.
1
2
Collection<?> list = new ArrayList<String>();
list.add(new Object());
첫 번째 코드처럼 Collection<?>를 선언하고 인스턴스화 하는 부분은 ArrayList<String>으로 지정하였다.
그럼 ArrayList가 아니거나 또는 ArrayList라도 String 타입이 아니면 오류가 난다.
두번째 코드에서 막상 Collection<?>로 지정하여 new Object() 객체를 추가하면 받을 수 있는 것처럼 보이지만 오류가 발생하여 String 타입을 추가하고 출력될 것이니 주의해서 사용해야 할 것이다.