Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발여행일지~

널 세이프티 (null safety) 본문

코틀린 공부정리

널 세이프티 (null safety)

야생돌고래 2023. 7. 25. 21:03
코틀린의 Null 안정성을 향상시켜줄 수 있다
  • 설명
    • Null예외는 프로그램의 가용성을 저하시키는 치명적인 오류다.
    • 코틀린은 Null예외로부터 안전한 설계를 위해 자료형에 Null 여부를 명시할 수 있다.
  • Kotlin의 널 세이프티 방법
    • Null 예외로부터 안전한 설계를 위한 다양한 키워드들을 지원한다.
    • 코틀린은 ?, !!, ?., ?: 로 Null예외로부터 살아남으려고 한다.
    • 하지만 강제로 null이 아니라고하는 !!는 최대한 사용을 지양한다.

예시코드

주소를 저장하는 address변수는 null을 저장할 수 있다고 String?을 선언한다.

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

class Student {
    lateinit var name:String
    var address:String? = null
    
    fun displayInfo() {
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
}

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

readLine()의 결과값을 !!로 Null이 아님을 보장했다.

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

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

?.키워드로 Null인지 확인하고 Null이 아닐때만 참조하는 메소드를 실행하도록 작성한다.

  • 주소를 저장하는 address는 초기값이 null이기때문에 null위협에 놓여있다
  • Null이 아님을 보장해야하는데 강제로 !!를 사용하는것은 현상황에 바람직하지 않다.
  • ?. 는 **안전 호출연산자(safe-calls)**라고 한다.
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이 출력되는것을 막고싶다면?

  • ?: 키워드를 함께 사용해서 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 ?: "초기화하세요"} 입니다")
    }
}