JAVA(SPRINGBOOT)

[JAVA] GENERIC PROGRAMMING

본듀 2022. 12. 22. 15:47

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