Nothing Type은 실행 흐름이 도달할 수 없는 구역을 나타내기 위한 특수 타입이라고 생각하면 된다.
다시 이야기 하자면, Nothing 으로 정의된 함수는 Return 처리 하지 않는 함수라는 것을 명시 하는 것이라고 보시면 될 것 같습니다.
예를 들어서, 아래의 예제 코드를 보자
fun throwing(): Nothing = throw Exception()
fun main(args: Array<String>)
{
val i: Int = throwing()
println(i)
}
위의 코드에서 보면 "throwing()" 함수 호출 후, Process가 멈추게 된다.
그러나 만약 아래와 같이 정의하게 된다면, compile error가 발생하게 된다.
fun test(a:Int, b:Int): Nothing = {return a + b}
fun main(args: Array<String>)
{
val i: Int = test(1, 30)
println(i)
}
참고 사이트 : https://readystory.tistory.com/143
Nullable Type과 null 에 대해서 알아보자
아래의 Kotlin 코드를 보면, Nullable type과 null간의 관계를 알 수 있다.
fun main(args: Array<String>)
{
var testCls: TestClass ? = TestClass()
testCls = null
var num: Int? = null
num = 10
}
위의 코드를 보면, 타입 뒤에 ? 를 붙이는 것을 볼 수 있는데, 이는 해당 타입을 nullable하게 만들 수 있다고 정의 하는 것이다.
다시 말하자면, null값을 지정할 수 있는 변수를 뜻한다.
위와 같이 변수에 null 값을 지정하도록 선언할 수 있다고 한다면, 안전한 호출 연산자(?.)를 통하여, null 예외 처리를 할 수 있다.
다음의 예제 코드를 보자
fun main(args: Array<String>)
{
var obj: Building? = null
obj?.print()
obj?.name = "Alice"
obj = Building()
obj?.name = "Tower"
obj?.date = "20200810"
obj?.area = 131_3212
obj?.print()
}
위의 코드를 보면, obj에 null을 지정하지만, compile error는 발생하지 않으며, 또한 정상적으로 실행이 된다.
이유는 안전한 호출 연산자(?.)를 호출하였기 때문이다.
안전한 호출 연산자(?.)를 호출하게 되면, 해당 객체가 Null이여도 Exception이 발생하지 않으며, 또한 프로퍼티 또는 참조 함수를 호출하지도 않는다.
또한 이 반대도 존재한다.
Not-null 단정 연산자(!!)로 해당 연산자를 선언하게 되면, 해당 객체가 null일시, 반드시 Exception이 발생하게 된다.
fun main(args: Array<String>)
{
var obj: Building? = Building()
obj!!.name = "City"
println(obj!!.name)
obj = null
obj!!.print()
}
위의 예제 코드에서는 결국 obj!!.print()에서 Exception이 발생하게 된다.
추가적으로 엘비스 연산자(?:)라 하여, 해당 객체가 널이면, 대신 다른 처리를 하도록 지정하는 것도 존재한다.
이는 다음과 같이 생각하면 된다.
[피연산자]?:[Null일 경우 표시할 값]왼쪽의 피 연산자가 null이 아니면, 그 값을 그대로 사용하고, 만약 null일 경우에는 [Null일 경우 표시할 값]으로 대체한다.
이에 대한 예제 코드는 다음과 같다.
fun main(args: Array<String>)
{
val number: Int? = null
println(number ?: 0)
val number2: Int? = 15
println(number2 ?: 0)
}
위의 코드를 실행하면, 결국은 다음과 같은 결과가 나오게 된다.
0
15
참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.
'Kotlin' 카테고리의 다른 글
[Kotlin] 확장함수 / 확장 프로퍼티 (0) | 2020.09.01 |
---|---|
[Kotlin] is 연산자 (0) | 2020.09.01 |
[Kotlin] Class (0) | 2020.08.29 |
[Kotlin] lateinit (0) | 2020.08.29 |
[Kotlin] const (0) | 2020.08.29 |