[Kotlin] 코틀린 타입 시스템(Type System) - ( ?/!!/.?/as?/let함수/lateinit)
반응형

타입 시스템(Type System)이란?

널 가능성, 코틀린에서의 null에 대한 접근 방법은 가능한 한 실행 시점에서 컴파일 시점으로 옮기는 것이다. 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지하여 실행 시점에 발생할 수 있는 예외 가능성을 줄일 수 있다.

따라서 타입 시스템이란 널이 될 수 있는 타입을 명시적으로 지원하는 것이다. 널이 될 수 있는 변수에 대해 메소드 호출을 하지 못하게 함으로써 많은 오류를 방지한다.

 

NULL이 될 수 있는 타입

- 코틀린의 모든 타입은 기본적으로 널이 될 수 없는 타입이다.

- 널이 될 수 있는 타입인 변수에 대해 메서드를 호출하면 NPE(NULL Point Exception)가 발생할 수 있어서 코틀린은 이러한 메서드 호출을 금지함으로써 NPE발생을 예방한다.

 

? - 널이 될 수 있는 타입을 명시적으로 지원

// var a:Int = null -> error
var a:Int? = null

 

!! - NULL이 될 수 있는 타입의 변수이지만, 현재 NULL이 아님을 주장

var b:Int? = 10
// var c:Int = b  -> error
var c:Int = b!!

 

?. - 안전한 호출 연산자

- 널 검사와 메서드 호출을 한 번의 연산으로 수행한다.

method?.bar()

-> method가 널이면 bar함수의 호출이 무시되고 널이 결과 값이 된다.

-> method가 널이 아니면  bar함수의 실행 결과 값을 반환한다.

 

?: - 엘비스 연산자

- 널 대신에 사용할 default 값을 지정할 때 편리한 연산자

fun method(s: String?) {
    val t: String = s ?: "대신할 문구입니다."
}

이런식으로 사용할 수도 있고 엘비스 연산자의 우항에 return, throw 등의 연산을 넣을 수도 있다.

 

as? - 안전한 캐스트

- 어떤 값을 지정한 타입으로 캐스트하고, 변환할 수 없다면 null을 반환하는 연산자

method as? Type

- method is Type이면 method는 Type으로 변환하고 아니라면 널을 반환한다.

 

let함수

- 안전한 호출 연산자와 함께 사용하면 원하는 식을 평가해서 결과가 널인지 아닌지 검사한 후 그 결과를 변수에 넣는 작업을 한줄로 처리할 수 있다.

- 람다식으로 중괄호를 채워 이용한다.

- 스스로의 객체를 인자로 받아 사용한다.

- 또한 중괄호 내부에서 해당 객체를 it키워드로 호출할 수 있다.

fun main() {
    val a:String = "a"
    a.plus("e").let { it. plus("1"); print(it) }
}

 

lateinit 변경자 - 프로퍼티를 나중에 초기화

- 나중에 초기화할 프로퍼티는 항상 var이여야 한다.

- val은 final필드이므로, 생성자 안에서 반드시 초기화해야 한다.

class MyTest {
    private lateinit var myService: MyService
    @Before
    fun setUp() {
        myService = MyService()
    }

    @Test
    fun testAction() {
        Assert.assertEquals("foo", myService.performAction())
    }
}

 

 

 

 

 

reference - https://hororolol.tistory.com/572, https://kotlinlang.org/docs/basic-syntax.html, https://meoru-tech.tistory.com/36

반응형