코틀린을 다루는 기술 2장
Search
⌨️

코틀린을 다루는 기술 2장

생성일
2021/09/15 03:09
태그
2장에서는 다음과 같은 내용을 다룬다.
필드 및 변수 선언, 초기화
코틀린의 클래스와 인터페이스
두 종류의 코틀린 컬렉션(?)
함수
널 처리
생각보다 기본적인 내용들을 많이 다뤄 필요한 내용만 작성한다.

Use, 사용한 자원 자동으로 닫기

InputStream, OutputStream 등 close 처리를 해줘야하는 경우가 종종 있다. (AutoCloseable, Closeable 인터페이스를 상속받는 경우)
use를 사용해주면 자동으로 close 해준다.
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } var exception: Throwable? = null try { return block(this) } catch (e: Throwable) { exception = e throw e } finally { when { apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception) this == null -> {} exception == null -> close() else -> try { close() } catch (closeException: Throwable) { // cause.addSuppressed(closeException) // ignored here } } } }
Kotlin
RandomAccessFile(file.absolutePath, "rw").use { // 처리 후 자동으로 close }
Kotlin

타입 변환에 실패하면 null을 주자

val result : String = item.title as? String
Kotlin

변성, 공변성, 반공변성, 무공변성

변성(Variance)은 파라미터화한 타입이 서로 어떤 하위 타입 관계에 있는지 결정하는 방식을 말한다.
할아버지, 아버지, 나를 가지고 예제를 만들었다.
open class 할아버지 open class 아버지 : 할아버지() open class 아들 : 아버지() interface 할일<T> { fun 실행() } val grandFather = object : 할일<할아버지> { override fun 실행() { TODO("Not yet implemented") } } val father = object : 할일<아버지> { override fun 실행() { TODO("Not yet implemented") } } val son = object : 할일<아들> { override fun 실행() { TODO("Not yet implemented") } }
Kotlin

무공변성(Invariant)

상속 관계에 상관 없이 자기 타입만 허용한다.
fun check무공변성(value: 할일<아버지>) { // TODO } check무공변성(grandFather) check무공변성(father) check무공변성(son)
Kotlin

공변성(covariant)

자기 자신과 자식만 허용하고, 키워드는 out이다.
fun check공변성(value: 할일<out 아버지>){ // TODO } check공변성(grandFather) check공변성(father) check공변성(son)
Kotlin

반공변성(contravariant)

자기 자신과 부모만 허용한다. 키워드는 in 이다.
fun check반공변성(value: 할일<in 아버지>){ // TODO } check반공변성(grandFather) check반공변성(father) check반공변성(son)
Kotlin