하루에 0.01%라도 성장하자

Develop/Android

Kotlin ) 코틀린 기초 Part#5 - null? null!

뚠님 2019. 6. 12. 16:34
반응형

Kotlin

null

 

코틀린의 가장큰 변화이자 Swift와 많이 유사한 null에 대한 제어이다. ( Swift에서는 옵셔널이라고 불림 )

 

기본적으로 코틀린은 null을 허용하지 않는다. 따라서 모든 변수와 상수는 선언과 동시에 초기화를 해주어야 한다.

하지만 null값이 필요할 때도 있기 때문에 이를 이해하여 null을 사용할 수 있도록 했다.

 

val a : String // 에러 발생. 초기화 안함

val a : String = null // 에러 발생. null값을 넣어줄 수 없음.

val a : String? = null // 정상. ?를 이용하면 null을 허용한다는 의미가 됨.

 

기본적으로 int, long, double 같은 자료형은 null이 들어갈 수 없으나 클래스형 변수는 null이 가능하다.

 

lateinit

 

lateinit은 선언 후 바로 초기화하지 않을 경우에 사용한다. 

 

lateinit var a : String // 정상

println(a) // 에러. 초기화 안함.

a = "hihi"
println(a) // hihi

 

lateinit은 아래 조건을 만족할 때만 사용할 수 있다.

 

  • var 변수에서만 사용가능
  • null값으로 초기화할 수 없음.
  • 초기화 전에는 변수를 사용할 수 없음
  • Int, Long, Double, Float에서는 사용할 수 없음
lazy

 

lazy는 값을 변경할 수 없는 val를 늦은 초기화할 수 있다.

 

val a : String by lazy {
    "hihi"
}

println(a); // 초기화코드 실행 + println 실행
println(a); // println만 실행

앱이 시작될 때 연산을 분산하여 앱 실행을 조금이라도 빠르게 할 때 사용된다.

 

lazy는 아래와 같은 조건이 만족할 때 사용할 수 있다.

 

  • val에서만 사용 가능
null이 아닌것을 보증함.

 

변수뒤에 !!를 붙여주면 이 값이 null이 아니라는 것을 보증하는 기호이다.

자주 사용하면 좋지 않을것 같은 느낌적인 느낌 ( 항상 강제적으로 하는 연산자, 기호는 불안하다.ㅋㅋㅋ )

 

val name : String? = "뚠님"
val name2 : String = name // 에러. null일수도 있는 String?이기 때문에 name값에 null이 있을 수도 있기 때문
val name3 : String? = name // 정상
val name4 : String = name!! // null이 아님을 보증했기 때문에 가능. 만약 name이 null이면 런타임 에러 발생

 

null인지 확인하고 호출

 

?.를 이용하면 null인지 확인하고 null이 아니면 사용한다.

 

val a : String? = null

var upperCase = if(str !=null) str else null // null

//윗줄하고 같은 코드. 하지만 간결하다.
upperCase = a?.toUpperCase // ?.는 a가 null이 아니면 이라는 의미로, null이 아닐경우 대문자로 변환해서 넣는다.

?:를 사용하면 null일 경우에 대한 응답을 할 수 있다.

 

val a : String? = null

var upperCase = if(str !=null) str else null // null


upperCase = a?.toUpperCase ?: "초기화 ㄱㄱ" // null이 아니면 a를 대문자로, null이면 "초기화 ㄱㄱ"를 넣어준다.

 

반응형