
자바 중급 문법 – 제네릭 – 2 – 와일드카드
소제목: 와일드카드란 무엇인가요?
와일드카드는 자바 제네릭(Generic)에서 사용되는 문법 중 하나입니다. 와일드카드는 제네릭 타입을 유연하게 다룰 수 있도록 도와주는 기능이에요. 제네릭을 사용하면 타입 안정성을 높일 수 있지만, 때로는 다른 제네릭 타입 간의 호환성 문제로 인해 코드를 작성하기 어려울 때가 있어요. 와일드카드를 이용하면 이러한 호환성 문제를 극복할 수 있답니다.
와일드카드는 주로 제네릭 타입의 매개변수로 사용되며, 다음과 같은 세 가지 형태로 표현됩니다:
<?>
: 물음표는 알 수 없는 타입을 의미합니다. 모든 타입에 대해 매치될 수 있어요.<? extends 상위타입>
: 상위 타입을 상한으로 가지는 모든 타입에 대해 매치됩니다. 즉, 상위 타입 및 그 하위 타입들과 매치될 수 있어요.<? super 하위타입>
: 하위 타입을 하한으로 가지는 모든 타입에 대해 매치됩니다. 즉, 하위 타입 및 그 상위 타입들과 매치될 수 있어요.
와일드카드를 이용하면 타입 호환성을 유연하게 다룰 수 있으며, 제네릭 코드의 재사용성과 유연성을 높일 수 있어요.
소제목: 와일드카드 사용 예시
와일드카드를 사용하는 예시를 통해 더 자세히 알아보겠습니다.
예시 1: 와일드카드를 이용한 리스트 출력
아래의 예시 코드는 printList
메서드를 통해 리스트의 내용을 출력하는 메서드입니다. 이 메서드는 List<Object>
타입의 리스트를 받아와서 리스트의 각 요소를 출력합니다.
public static void printList(List<Object> list) {
for (Object element : list) {
System.out.println(element);
}
}
하지만 이 메서드는 List<Object>
타입만을 받아들일 수 있어요. 만약 List<String>
이나 List<Integer>
등의 다른 제네릭 타입의 리스트를 출력하려면 어떻게 해야 할까요? 이때 와일드카드를 사용하면 됩니다!
public static void printList(List<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
와일드카드를 사용한 printList
메서드는 모든 타입의 리스트를 받을 수 있습니다. 이제 printList
메서드를 호출할 때 List<Object>
뿐만 아니라 List<String>
, List<Integer>
등 모든 제네릭 타입의 리스트를 인자로 전달할 수 있어요.
예시 2: 상한 와일드카드를 이용한 제네릭 메서드
와일드카드는 제네릭 메서드에서도 유용하게 사용될 수 있습니다. 아래의 예시 코드를 통해 상한 와일드카드를 이용한 제네릭 메서드를 살펴보겠습니다.
public static <T extends Number> double sum(List<T> list) {
double total = 0.0;
for (T element : list) {
total += element.doubleValue();
}
return total;
}
위의 sum
메서드는 숫자 타입을 요소로 가지는 리스트를 받아와 해당 리스트의 모든 요소를 더한 결과를 반환하는 메서드입니다. 이 메서드는 List<T>
타입을 받는데, T
는 Number
클래스를 상속하는 타입으로 제한됩니다. 따라서 Integer
, Double
, Float
등 숫자 타입을 요소로 가지는 리스트를 인자로 전달할 수 있습니다.
예시 3: 하한 와일드카드를 이용한 제네릭 메서드
와일드카드는 하한 와일드카드로도 사용될 수 있습니다. 아래의 예시 코드를 통해 하한 와일드카드를 이용한 제네릭 메서드를 확인해보세요.
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 5; i++) {
list.add(i);
}
}
위의 addNumbers
메서드는 List<? super Integer>
타입의 리스트를 받아와서 1부터 5까지의 정수를 리스트에 추가하는 메서드입니다. 이 메서드는 Integer
의 상위 타입인 Number
나 Object
를 포함하는 리스트를 인자로 전달할 수 있습니다.
주의해야 할 점
- 와일드카드를 사용할 때 주의해야 할 점이 있어요. 와일드카드를 사용하면 타입의 일반적인 동작만 사용할 수 있기 때문에, 특정 타입의 메서드를 호출할 수 없거나, 제네릭 타입을 실제로 사용하는 경우에는 와일드카드를 사용할 수 없습니다. 이 점을 유의하며 와일드카드를 사용해야 합니다.
- 와일드카드를 사용하면 컴파일러가 타입 체크를 더 엄격하게 수행하지 않습니다. 따라서, 와일드카드를 사용할 때는 런타임 에러가 발생할 수 있는 상황에 대비해야 합니다.
- 와일드카드를 사용하면 코드가 복잡해질 수 있으므로, 필요한 경우에만 사용하는 것이 좋습니다. 와일드카드를 사용하지 않고 다른 방법으로 타입 호환성을 다룰 수 있는지 고려해보세요.
이상으로 자바 중급 문법인 제네릭의 와일드카드에 대해 알아보았습니다. 와일드카드는 제네릭 코드를 유연하게 작성하고 타입 호환성을 다루는 데에 큰 도움을 주는 기능입니다. 다양한 예시를 통해 와일드카드의 사용법을 익히고, 주의해야 할 점도 함께 알아두시기 바랍니다.
더 많은 자바 중급 문법과 제네릭에 대한 내용은 블로그 포스트를 통해 살펴보실 수 있습니다. 행운을 빕니다!