코틀린을 사용하다보면 ? 와 !! 그리고 null과 nullable이라는 키워드를 한번씩은 들어 봤을 것이다. 코틀린은 JAVA와 100% 호환된다. 그러면서 자바의 여러 단점들을 보완하고자 하는데, 먼저 자바에서는 null을 허용하지 않는다는 것이다. 프로그램을 기획하면서 당연히 유저의 입력을 받게 되는데 유저가 입력하지 하지 않는경우도 존재한다는 것이다. 코틀린은 이러한점에대해서 null을 유연하게 대처하게 해주고 있다. 그렇다면 어떤 방식으로 ?와 !!이 사용되는지 정리해보도록 하겠다.
# 예제
fun main() {
val number1 = readLine()
val number2 = readLine()
val result = number1.toInt() + number2.toInt()
println(result)
}
사용자(터미널)에서 두개의 숫자를 입력받고 두 숫자를 더하도록 코드를 작성했다. 터미널에 입력하는 숫자는 당연히 문자열(string)타입이다. 그렇기 때문에 toInt()메서드를 통해서 정수로 바꾸어 주어야 한다. 논리의 흐름으로 봤을때는 전혀 문제가 없어 보이지만, IDE에서 보면 error를 나타내는 빨간줄이 나타난다.
## "?"이란 무엇일까?
코틀린은 고맙게도 auto로 type을 지정해준다. 즉 변수를 지정할 수 있는 방법이 두가지가 있다는 뜻이다.
fun main() {
val num = 10
val num2:Int = 100
val string = "HELLO"
val string2:String = "WORLD"
val temp = null
}
그렇다면 num2:Int에 null을 담을 수는 있을까?
당연히 담을 수 없다. 여기서 "?"키워드가 존재하는 것이다.
이렇게 ?를 사용한다면 null도 담을 수 있게 된다.
## 문제점 1
number1과 number2는 null일수도 있기 때문이다. 그 이유는 readLine() 메서드 자체가 String? 즉 "문자열 또는 null"을 담을 수 있도록 코틀린이 자체적으로 지정한 것이다. 아래 그림을 보면 알 수 있다.
val number1: String? = readLine()
val number2: String? = readLine()
즉 number1와 number2의 타입을 굳이 적어준다면 위와 같이 적을 수 있겠다.
그렇다면 아래와 같이 작성하여 각 number가 null이 될수도 있다는것을 지정해주면 될까?
fun main() {
val number1 = readLine()
val number2 = readLine()
val result = number1?.toInt() + number2?.toInt()
println(result)
}
정답은 아니다. 조금만 더 생각해보면 알 수 있는데, null이라면 즉 number1 의 값이 null인 상태이다. 그렇다면 코틀린 컴파일러는 null를 integer로 바꾸기 위해서 무슨 행동을 할 수 있을까? 당연히 불가능하다. 그렇기때문에 여기서 등장하는 키워드가 " !! " 이다.
## "!!"
!!은 null이 아니라는 뜻이다. 즉 이 변수는 null이 아닌 것을 내가(프로그래머)가 보증할게 정도로 생각하면 된다.
fun main() {
val number1 = readLine()
val number2 = readLine()
val result = number1!!.toInt() + number2!!.toInt()
println(result)
}
이제 위와같이 !! 키워드를 앞에다가 넣어주게 되면, 정상적으로 작동을 한다. 즉 null이 들어올 일은 없으니까 toInt()로 Integer로 변환시키라고 명령 하는 것이다.
이제 정상 작동하는 것을 알 수 있다.
## 문제점2
그렇다면 위와같이 "!!"키워드를 사용하여 null을 사용하지 않을 것이라고 보증하는 것이 맞는 방법일까? 정답은 그렇지만은 않다는 것이다. 사용자가 null을 입력할지 입력단계에서 막으면 되겠지만 혹여나 null이 들어오면 프로세서가 죽어버린다.
fun main() {
val number1 = readLine() ?: "0"
val number2 = readLine() ?: "0"
val result = number1.toInt() + number2.toInt()
println(result)
}
그렇기 때문에 ?: "0"을 사용한다. null이면 "0"으로 지정한다는 뜻이다. 즉 default값을 설정해주는 것이다.
매우매우 헷갈렸는데 확실히 짚고 넘어가니까 이제는 null에서 해방된것 같다. 키워드 자체도 ? 물음표여서 항상 뭔가 했는데.. 그리고 외국 유튜버가 올린 코틀린 설명을 참고 했다. 다 영어이긴 한데 듣다 보면 들린다 영어공부도 되고 코딩공부도 하고 1석2조가 아닐까
'•App > 코틀린(Kotiln)' 카테고리의 다른 글
[코루틴#2] 코루틴 스코프(Coroutine Scope)와 잡(Job)을 이용한 join (0) | 2022.08.05 |
---|---|
[코루틴#1] 코루틴 시작하기, runBlocking, launch, delay, suspend (0) | 2022.08.04 |
[코틀린 문법] 코틀린에서 for문과 when문 사용방법, 코틀린 반복문 (0) | 2022.03.12 |