포스트

제네릭 공식문서 파해치기 (7)

안녕하세요 🐸 !

오늘은 드디어 제네릭 중 와일드카드 파트가 끝이 납니다!
와일드카드의 마지막 문서에서는 와일드카드 사용 지침에 대해 설명하고 있습니다.
이론적인 부분은 앞서 설명했으니 주의할 부분을 추가로 정리해주는 듯한 내용입니다.

다음에는 타입 소거만이 남았네요!

와일드카드 사용 지침

와일드카드 사용 시에 가장 했갈리는 부분을 얘기하자면

어떤 때 extends를 써야하고 어떤 때 super를 써야하는가?

입니다!

이 부분을 공식문서에서는 이 문제를 해결하기 위해 변수를 두 가지 유형으로 나눠 생각하기를 권장합니다.

  1. 입력 변수
    • 데이터를 제공하기 위한 변수 ex) copy(src,dest) 에서 srcdest에 저장할 값을 가지는 변수이므로 src는 입력 변수
  2. 출력 변수
    • 데이터를 받아오기 위한 변수 ex) copy(src,dest) 에서 destsrc의 값을 복사하여 가져오기 때문에 dest는 출력 변수
  3. 입출력 변수
    • 데이터를 읽고/쓰는 변수

이렇게 설명으로만 보면 했갈리니 설명의 예시로 사용하는 copy(src,dest) 의 코드 예제를 함께 보겠습니다.

1
2
3
4
5
public <T> void copy(List<? extends T> src, List<? super T> dest) {
    for (T element : src) {
        dest.add(element);
    }
}
  • src에서는 값을 추출하고 있습니다 -> 입력 변수
  • dest에는 값을 저장(add())하고 있습니다 -> 출력 변수

이제 변수의 종류를 이렇게 세 가지로 나눠서 생각해보고 마저 설명해보겠습니다.

아래의 기준으로 생각하면 정리가 됩니다!


와일드카드 사용 지침

  • 입력 변수는 extends 키워드 를 사용하여 상한 와일드카드로 정의됩니다 .
  • 출력 변수는 super 키워드 를 사용하여 하한 와일드카드로 정의됩니다 .
  • 입력 변수에 Object 클래스 에 정의된 메서드를 사용하여 접근할 수 있는 경우 , 무제한 와일드카드(<?>)를 사용합니다.
  • 입출력변수를 사용 하는 경우에는 와일드카드를 사용하지 마세요.

⚠️ 주의사항
와일드카드는 반환 타입으로 사용하는 것을 지양해야합니다.


상한 경계 와일드카드 사용 지침 요약

  • null 만 추가 가능
  • clear(), remove() 사용 가능
  • get()의 반환 타입은 상한 경계 T로만 가능

하한 경계 와일드카드 사용 지침 요약

  • 하한 경계 T의 자식 타입만 add() 가능
  • get()의 타입은 Object만 가능
  • clear(), remove() 사용 가능

+ 상한 경계 와일드카드는 읽기 전용은 아니지만, 읽기 전용과 같이 쓰거나 변경이 불가능하여 읽기 전용이라고도 생각할 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.