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) { /* ... */ }
}
'두두의 IT' 카테고리의 다른 글
객체지향 프로그래밍이란? (0) | 2022.04.12 |
---|---|
[Kotlin] 개념, Java와의 호환, 장점, 활용 방법, 만든 이유 (0) | 2022.04.11 |
[Kotlin] operator (0) | 2022.04.11 |
[OOP] 추상클래스와 인터페이스 (0) | 2022.04.11 |
[Kotlin] annotation class (0) | 2022.04.11 |