Kotlin 기본 문법 - 널 세이프티

2024. 6. 10. 13:20[Android] Kotlin 기본 문법

# 널 세이프티의 개념

- 코틀린에서 Null 예외는 가용성을 치명적으로 저하시킬 수 있음

- 따라서 Null 예외로부터 안전한 설계를 위해 자료형에 Null 여부를 명시할 수 있음

- Null 예외로부터 안전한 설계를 위해 ?, !!, ?., ?: 의 키워드를 지원함

  (!! 키워드는 최대한 자제 필요)

 

# 널 세이프티 키워드

 

1) ? : null값을 저장할 수 있음을 명시

fun main(){
    var s = Student()
    s.name = "참새"
    s.address = "서울"
    s.displayInfo()
}

class Student {
	// null을 저장하지 않고 설계하려면 lateinit var로 대체 가능
    lateinit var name:String
    // null을 저장할 수 있음을 물음표를 붙여서 선언함으로써 명시
    var address:String? = null
    
    fun displayInfo() {
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
}

 

2) !!: 메소드를 호출하고 전달받은 리턴값이 null이 아님을 !! 키워드로 보증

fun main(){
//  var data = readLine()!!.toInt()

    var inputData = readLine()!!
    var data = inputData.toInt()
    println("Null아닌 값: ${data}")
}

 

3) ?. : 안전 호출 연산자(safe-calls) / null인지 아닌지 확인하고 null이 아닐 때만 참조하는 메소드를 실행하도록 작성

fun main(){
    var s = Student()
    s.name = "참새"
    s.displayAddressLength()
    
    s.address = "서울"
    s.displayInfo()
}

class Student {
    lateinit var name:String
    var address:String? = null

    fun displayInfo() {
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
    
    fun displayAddressLength() {
        println("주소의 길이는: ${address?.length} 입니다")
    }
}

- address에 값을 할당하지 않은 상태로 displayAddressLength() 함수 호출 => 주소의 길이를 null로 출력

- address에 값을 할당하고 다시 실행 => 정상적으로 출력

 

4) ?: = 엘비스 연산자 / ?. 키워드로 안전하게 실행했지만 null 대신 다른 문자열을 출력하고 싶을 때 사용

fun main(){
    var s = Student()
    s.name = "참새"
    s.displayAddressLength()

    s.address = "서울"
    s.displayInfo()
}

class Student {
    lateinit var name:String
    var address:String? = null

    fun displayInfo() {
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
    
    fun displayAddressLength() {
        println("주소의 길이는: ${address?.length ?: "초기화하세요"} 입니다")
    }
}

- 실행 결과) null값 대신 "초기화하세요"라는 문자열이 출력