본문 바로가기

두두의 IT

[Kotlin] in/out

728x90

kotlin에서는 명시적으로 super/extends 대신 in/out 키워드를 제공하는데, 각각의 정의와 매칭은 아래와 같습니다.

  • T : 별도의 Wildcard 정의가 없이 read/write 모두 가능
  • in T : Java의 ? super T와 같음. input의 약자이며 write 만 가능
  • out T : Java의 ? extends T와 같음. output의 약자이며 read 만 가능

 

Kotlin - out : ? extends T (java)

private fun printAll(items: ArrayList<out Output<String>>) {
    items.indices
            .filter { items[it].isArgument("") }
            .forEach { println("item : " + items[it]) }
}

위의 예제의 결과는 아래와 같습니다.

items.get(0) // Success - print
items.get(1) // Success - not print

 

Kotlin - in : ? super T (java)

private fun addItem(items: ArrayList<in Output<String>>) {
     items.add(object : Output<String> {
        override fun isArgument(argument: String) = false
     })
}

위의 실행 결과는 아래와 같습니다.

// printAll
items.add(object : Output<String> ...) // add success

 

in/out을 모두 사용하지 않는 경우

in/out은 코틀린에서는 명시적으로 적용하게 됩니다. 하지만 아래의 경우는 read/write을 모두 하기 때문에 Generic 정의시에 별도로 처리하지 않습니다.

class Array<T>(val size: Int) {
  fun get(index: Int): T { /* ... */ }
  fun set(index: Int, value: T) { /* ... */ }
}