Kotlin - Generics (3) : Declaration-Site & Use-Site variance

WindSekirun (wind.seo)·2022년 4월 26일
0

이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.

작성 시점: 2017-09-06

그러면 코틀린의 out와 자바의 ? extends T, 코틀린의 in과 자바의 ? super T가 어떻게 다를까.

같은 인터페이스를 두 언어로 작성해보자. 이 인터페이스는 아래와 같은 기능을 가질 것이다.

  • 아이템 하나 추가
  • 아이템 리스트 추가

코틀린으로는 아래와 같을 것이다.

interface KtWriteOnly<in T> {
    fun addItem(item: T)
    fun addAll(list: List<T>)
}

자바로는 아래와 같을 것이다.

import java.util.List;

public interface JavaWriteOnly<T> {
    void addItem(JavaWriteOnly<? extends T> item);
    void addAll(List<JavaWriteOnly<? extends T>> list);
}

차이점이 있다면, 코틀린에서는 T에 대한 반변 선언을 클래스 선언시에 했다는 점과, 자바는 T를 사용하려고 할 때 반변 선언을 한다는 것이다. 코틀린에서는 이 방식을 Declaration-Site Variance (선언 위치 변환) 이라 부르고, 자바는 이 방식을 Use-Site Variance (사용 위치 변환) 이라 부른다.

더 자세한 설명은 Declaration-site and use-site variance explained 글을 참고하면 된다.

이 두 개는 어떻게 보면 큰 차이점을 보이고 있는데, 코틀린에서는 한 번만 선언하면 그 클래스 안에서는 두번 다시 선언할 필요가 없다. 하지만 자바는 한 번에 선언하지 못하고 사용할 때 마다 계속 선언해야 한다.

그럼 코틀린에서는 자바와 같은 방식을 사용하지 못하는가? 대답은 No 이지만 다음 글 (아마 마지막이 될 것이다)에서 알아보려고 한다.

profile
Android Developer @kakaobank

0개의 댓글