반응형
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 |