Generic Class (제네릭 클래스)
타입 파라미터를 한 개 이상 받는 클래스
public class Entry<K, V> {
private K key;
private V value;
public Entry(K key, V value) {
this.key = key;
this.value = value;
}
//Getter
}
// 제네릭 클래스 객체 생성시 생성자에서 타입 파라미터 생략 가능
// 타입 파라미터에 기본형 타입은 쓸 수 없다. ex) int
Enrty<String, Integer> enrty = new Enrty<>("A",3);
Genegic Method (제네릭 메서드)
타입 파라미터를 받는 메서드
제네릭 메서드를 선언할 때는 타입 파라미터를 제어자와 반환 타입 사이에 둔다.
public class Arrays {
public static <T> voidswap(T[] array, int i, int j){
T temp = array[i];
array[i]= array[j];
array[j] = temp;
}
}
Wild Card (와일드카드)
공변(covariant) : A가 B의 하위 타입일 때, T <A> 가 T<B>의 하위 타입이면 T는 공변
불공변 (invariant) : A가 B의 하위 타입일 때, T <A> 가 T<B>의 하위 타입이 아니면 T는 불공변
Object[] arr == new Integer[]{1, 2, 3}; //True
ArrayList<Object> arrayList = new ArrayList<Integer>(Arrays.asList(1,2,3)); //False
배열의 경우 공변이기 때문에 Integer가 Object의 하위 타입이므로 Integer[]는 Object[]의 하위 타입이다.
배열리스트의 경우 불공변이기 때문 ArrayList<Integer>는 ArrayList<Object>의 하위 타입이 아니다.
이런 불공변때문에 제네릭의 한계가 나타났고 알 수 없는 타입의 "?"(와일드카드)가 등장했다.
서브타입 와일드카드 (상한 경계)
public void print(Collection<? extends Parent> c) {
for (FirstChild e : c) { //에러
System.out.println(e);
}
for (Parent e : c) {
System.out.println(e);
}
for (GrandParent e : c) {
System.out.println(e);
}
}
print 메서드의 경우 Parent 클래스 혹은 Parent 클래스를 상속한 클래스의 객체를 갖는 Collection을 인자로 받는다.
그래서 FirstChild 클래스 객체를 출력하면 Collection내에 SecondChild 객체가 있을 수 있기때문에 에러가 발생한다.
이렇게 와일드카드의 경계를 제한해 주는 것을 상한 경계라고 한다.
슈퍼타입 와일드카드 (하한 경계)
public void print(Collection<? super Parent> c) {
for (FirstChild e : c) {
System.out.println(e);
}
for (Parent e : c) {
System.out.println(e);
}
for (GrandParent e : c) { //에러
System.out.println(e);
}
}
하한 경계의 경우 상한 경계와 반대로 Parent 클래스의 상위 클래스를 가르킨다.
FirstChild 클래스의 객체는 GrandParent를 상속한 Parent를 상속했기 때문에 어떤 것이든 나타낼 수 있지만
GrandParent 끼리는 서로 나타낼 수 없을 수 있기 때문에 에러가 발생한다.
'JAVA(SPRINGBOOT)' 카테고리의 다른 글
[SPRINGBOOT] 좋아요 수 표현 (0) | 2023.03.09 |
---|---|
[JAVA] VECTOR (0) | 2023.01.26 |
[JAVA] 비교연산자 (==, equals) (0) | 2022.12.16 |
[JAVA] REQULAR EXPRESSION(정규 표현식) (0) | 2022.12.16 |
[JAVA] EXCEPTION(예외처리) (0) | 2022.12.16 |