티스토리 뷰

반응형

제네릭 클래스 선언 방법에 대해 알고 싶다면 이전 포스팅을 참고  ☞ 제네릭스(Generics) - 2. 제네릭 클래스 선언하기

와일드 카드 <?>

와일드카드란, 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것을 말한다. 역시나 정의로는 이해가 어렵다. 아래 설명된 예제를 보자.


참고로 와일드 카드를 생각할때는 제네릭 클래스 타입과 '관점'에 대한 분리가 되어야한다. '제한된 제네릭 클래스'는 제네릭 클래스를 선언하는 개발자의 관점에서 객체 생성시 사용 될 객체를 제한하는 것이고, 와일드카드는 메소드를 만드는 개발자의 관점에서 메소드에 사용 될 매개변수가 제네릭 클래스를 구현한 객체일때, 그 제네릭 클래스 '타입 변수'를 제한 하는 것이다. (여기서 말하는 메소드는 '제네릭 메소드'가 아닌, 일반적인 모든 메소드를 말한다.)

 

와일드 카드 <?> 는 언제 사용될까?

하나의 메소드를 만드는 과정중에 제네릭 클래스의 객체를 매개변수로 받는 경우가 있다고 하자. (이번에도 예제로는 ArrayList로 해보겠습니다.)

public void myMethod(ArrayList list) { . . . }

이 메소드는 ArrayList를 매개변수로 받고 있지만, ArrayList가 담고 있는 '타입 변수'는 Number를 상속받은 객체들이어야 정상적으로 작동 하도록 설계되었다. 하지만 ArrayList가 어떤 타입 변수를 가지고 있던지 간에 모두 받아 들일 가능성이 있다. 


이런 경우에 와일드카드를 이용하여서 ArrayList의 '타입 변수'를 지정 할 수있다.

public void myMethod(ArrayList<? extends Number> list) { . . . }

"메소드가 받아들일 매개변수 ArrayList의 타입 변수는 Number클래스와 Number클래스를 상속받은 클래스들의 객체들만 받는다!"라고 명시한 것이다.


와일드 카드<?>의 제한 종류

  • <? extends T> 와일드 카드의 상한 제한(upper bound) - T와 그 자손들을 구현한 객체들만 매개변수로 가능
  • <? super T> 와일드 카드의 하한 제한(lower bound) -T와 그 조상들을 구현한 객체들만 매개변수로 가능
  • <?> 제한 없음




제네릭 메소드에 대해서는 다음 포스팅 참고  ☞ 제네릭스(Generics) - 4. 제네릭 메소드

 

반응형
댓글