Kotlin의 Nothing 타입

아래의 예제를 통해 Kotlin 내에서 특별하게 취급되는 타입 중 하나인 Nothing 타입에 대해 살펴보도록 하자. 그 전에 알고가야할 것은 아래의 예제 코드 속에서 엘비스 연산자의 우항에 return 문이 대입되어 있다는 점이다.

1
2
3
4
5
6
7
8
9
fun equals(o: Any?): Boolean {
val otherPerson = o as? Person ?: return false

return otherPerson.firstName == firstName &&
otherPerson.lastName == lastName
}

val address = person.company?.address
?: throw IllegalArgumentException("No address")

이게 뭐야

지금까지 Javascript만 이용하여 개발을 해왔던 나로서는 제일 이해가 안되는 것 중 하나이기도 하다. 어떻게 문이 값처럼 취급 될 수 있는 것인가? 그러던 중 코틀린의 문서에서 코틀린 내에서는 throw 나 return 등의 연산도 식으로 판단한다. 라는 문구를 읽게 되었다. 그렇기 때문에 위의 코드처럼 엘비스 연산자의 우항에 return, throw 등의 연산을 넣을 수 있던 것이다. 위의 예제 코드와 같이 에러에 해당하는 throw의 경우 Nothing이라는 특별한 타입을 가진다.

Nothing 타입

nothing 타입은 “이 함수가 정상적으로 끝나지 않는다“ 라는 걸 명시적으로 표현하는 타입이다. Nothing 타입은 아무런 값도 포함하지 않으므로, 함수의 반환 타입 등에 사용한다.

그 외에는 변수에 아무 값도 저장할 수 없으므로 큰 의미가 없다.

1
2
3
4
5
6
// 6.1.4_3_Nothing_type.kt
var a: String? = null
a = "테스트"
val x: Nothing? = null // 'x' has type `Nothing?`
x = "" // => Type missmatch
val l: List<Nothing?> = listOf(null) // 'l' has type `List<Nothing?>

이러한 Nothing 타입은 Nothing 함수를 반환하는 함수가 “정상적으로 종료하지 않음”을 알고 그 함수를 호출하는 함수를 분석할 때 유용하게 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
// 6.1.4_3_Nothing_type.kt
fun fail(message: String?): Nothing {
throw IllegalAccessException(message);
}

fun main (args: Array<String>) {
// 아래와 같이 null 일 경우, 정상적으로 종료하지 않는다는 사실을 쉽게 알 수 있음
val address = company.address ?: fail("adress")
println(address.city)
}
현재 이커머스회사에서 frontend 개발자로 업무를 진행하고 있는 Martin 입니다. 글을 읽으시고 궁금한 점은 댓글 혹은 메일(hoons0131@gmail.com)로 연락해주시면 빠른 회신 드리도록 하겠습니다. 이 외에도 네트워킹에 대해서는 언제나 환영입니다.:Martin(https://github.com/martinYounghoonKim
React Hooks 톺아보기