코틀린에서는 자바와 달리 null을 컴파일 시점에 관리할 수 있습니다. 또한 최상위 프로퍼티, get(), set() 등 자바에서 지원하지 않는 다양항 기능들을 제공합니다. 이번 포스팅에서는 null 관리와, 프로퍼티에 대해 상세히 알아보겠습니다.
코틀린 null
null: 아무 것도 참조하지 않는 참조 값의 특별한 상태입니다. null에 대해 멤버 접근을 시도하면 NullPointerException이 발생하는데 이는 최악의 에러 중 하나입니다. 그런데 코틀린에서는 일반 참조형에서는 null을 담을 수 없게 하여 NPE를 예방합니다.
예제 코드
fun isLetterString(s: String) : Boolean {
if(s.isEmpty()) return false
for(ch in s) {
if (!ch.isLetter()) return false
}
return true
}
fun main () {
println(isLetterString("abc"))
println(isLetterString(null))
}
위와 같이 코드를 작성하면 isLetterString() 함수의 인자로 null이 들어오지 못하게 됩니다.
그렇다고 코틀린에서 아예 null을 넣을 수 없는 것은 아닙니다. 코틀린에서 null이 가능하도록 하려면 ?를 입력해 표시를 해주어야 합니다.
fun isBooleanString(s: String?) = s == "false" || s == "true"
참고로 null이 가능한 변수와 null이 불가능한 변수를 서로 대입하려고 하면 type mismatch 에러가 발생합니다. 그러나 이러한 경우에도 문맥 상 null이 아니라는 것이 확실해지면 입력이 가능해집니다.
이렇게만 진행되면 좋겠지만, 객체의 가변 프로퍼티에서는 null이 아니라는 것이 확실하지 않으므로, 위와 같이 수정해줄 수 없습니다. 다른 프로그램에서 str을 수정해버릴 수 있기 때문입니다. 따라서 이러한 경우 지역변수로 변경하면 해결할 수 있습니다. 지역변수는 다른 프로그램에서 수정할 수 없기 때문입니다.
코틀린 null 관련 연산자
1. 널 아님 단언 연산자(!!)
널이 될 수 있는 타입에 대해 프로그래머가 널이 아니라고 확언해주는 연산자입니다.
fun readInt() = readLine()!!.toInt()
프로그램을 짜다보면 null이 들어갈 수 있는 경우가 생길 수도 있는데, 이는 그 가능성 자체를 막아버립니다. 만약 null이 들어오는경우 KolinNullPointerException이 발생하게 됩니다. 따라서 사용하지 않는 것이 좋습니다.
2. 안전한 호출 연산자
fun readInt() = readLine()?.toInt()
받은 값이 null이 아닌 경우에는 의미 있는 일을 하고, null인 경우에는 null을 반환해줍니다.
3. 엘비스 연산자
연산자의 왼쪽 값이 null인 경우 연산자의 오른쪽 값으로 치환헤주는 연산자입니다. return/throw도 사용할 수 있습니다.
fun readInt() = readLine()?.toInt() ?:0
fun readInt() = readLine()?.toInt() ?:return "Unknown"
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[Kotlin] 객체 (0) | 2022.10.13 |
---|---|
[Kotlin] 프로퍼티 (0) | 2022.10.11 |
[Kotlin] 코틀린 클래스, 생성자 (0) | 2022.10.09 |
[Kotlin] 코틀린 함수 (1) | 2022.10.08 |
[Kotlin] 코틀린 문자열과 배열 (1) | 2022.10.08 |