JAVA

자바 와일드카드(Wildcards)

icedstone 2025. 3. 11. 11:34
반응형
In generic code, the question mark (?), called the wildcard, represents an unknown type. - Oracle Javadoc

 

type을 모를 때 쓰는 표현을 wildcard라고 한다는데! 그러면 generic하고는 뭐가 다를까?(제네릭 개념 공부하러가기)

 

일단 결론부터 이야기하면 제네릭(Generic)은 Java에서 타입을 파라미터화하는 기능이고, Wildcard는 제네릭에서 특정 타입을 유연하게 처리하기 위한 기법이다.

 

좀 더 이해해보자

 

public void method1(List<?> list)
public void method2(List<T> list)
public void method3(List<Object> list)

 

위 3개의 method가 있다고 생각해보자. 얼핏 봤을 때, 큰 차이가 없어보일 수도 있지만, 아래와 같이 조금 더 구현을 해보겠다.

 

public void method1(List<?> list, Object obj) {
  list.add(obj); //compile error
}
public void method2(List<T> list, T obj) {
  list.add(obj);
}
public void method3(List<Object> list, Object obj) {
  list.add(obj);
}

 

method1의 경우 type을 모르는데 list에 객체를 넣으려고 했기 때문에 compile 오류가 발생한다.

method2의 경우에는 동일한 type인 T 객체만 넣는게 가능하다.

method3의 경우에 Object이면 다 입력이 가능해진다.

 

다시 맨 위에 oracle javadoc에 있는 글을 떠올려보면

wildcard는 type을 모르고 동시에 몰라도 되는 상황에서 사용하는 type이라고 할 수 있다.

반응형

같이 알아두면 좋은 지식(사실 알아야하는 지식)

  • 공변성 (Covariance): 만약 ClassB가 ClassA의 서브클래스라면, Collection<B>은 Collection<A>의 서브클래스로 취급될 수 있습니다.
  • 반공변성 (Contravariance): 만약 ClassB가 ClassA의 서브클래스라면, Collection<A>은 Collection<B>의 서브클래스로 취급될 수 있습니다.
  • 불변성 (Invariance): Collection<A>와 Collection<B>는 ClassA와 ClassB의 관계와 상관없이 서로 서브타입 관계가 없습니다.

List<T>는 generic 을 이용한 객체이다.

Object는 String의 서브클래스이다. 이 때, List<Object> 는 List<String>의 서브클래스가 아니다.
즉, generic은 공변성을 지원하지 않는다.

 


참고

https://www.tutorialspoint.com/variance-in-java

 

 

 

반응형

'JAVA' 카테고리의 다른 글

JVM 초기화 과정(Loading, Linking, Initialization)  (0) 2025.03.13
String vs StringBuilder vs StringBuffer  (0) 2025.03.12
자바 POJO (Plain Old Java Object)  (1) 2025.03.11
자바 제네릭(Generics)  (0) 2025.03.11
자바 직렬화(Serialization)  (1) 2025.03.09