널 세이프티

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
24/36

널 세이프티(Null Safety)

  • 코틀린의 Null 안정성을 향상시킬 수 있는 방법
  • Null 예외는 프로그램의 가용성을 저하시키는 치명적인 오류
    • Null 예외가 발생하면 프로그램이 강제로 종료됨
  • 코틀린은 Null예외로부터 안전한 설계를 위해 자료형에 Null 여부를 명시할 수 있음
    • Null을 가질 수 있다, 없다를 명시
    • 자료형에 Null을 가질 수 있는지 없는지를 명시하기 때문에 Java보다 Null 예외로부터 안전하다.

null safety 방법

(1) ? 키워드 (null을 저장할 수 있는 자료형임을 명시하는 키워드)

  • 자료형 + ?로 선언함

  • null을 저장하기 않고 설계하려면 lateinit var로 대체 가능

fun main(){
    var s = Student()	// 클래스 객체 생성, 인스턴스화
    // s.displayInfo() // name 프로퍼티가 초기화되지 않았기 때문에 실행하면 오류가 발생함
    
    s.name = "참새"	// name 프로퍼티에 값 할당(초기화)
    s.address = "서울" //address 프로퍼티에 값 다시 할당
    s.displayInfo() // 클래스 프로퍼티 조회 메서드 실행
}

//명시적 생성자를 사용하지 않고 클래스 정의
class Student { // Student라는 이름 가진 클래스
    lateinit var name:String	//lateinit 붙어서 나중에 초기화 되는 변수
    var address:String? = null //null로 초기화할 수 있도록 String뒤에 ?를 붙임
    
    fun displayInfo() {
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
}

(2) !! 키워드 (절대로 null이 들어갈 수 없음을 명시하는 키워드)

  • 이 변수(혹은 상수)는 절대로 null이 아니라고 하는 키워드

  • 강제로 null이 아니라고 명시하는 거라서 사용 지양!!

fun main(){
//  var data = readLine()!!.toInt() 아래 코드를 축약한 형태

    var inputData = readLine()!! //입력받은 값이 null이 아니라고 지정함
    var data = inputData.toInt() //입력받은 값을 Int형 정수로 바꿈(기존 입력값은 아마 Spring 타입일듯)
    println("Null아닌 값: ${data}")
}

(3) ?. 키워드 (null인지 확인하고 null이 아닐 때만 참조)

  • null인지 확인하고 null이 아닐 때만 참조한다. (호출한다)

  • 안전 호출 연산자(safe-calls)라고 한다.

fun main(){
    var s = Student() // 클래스 객체 생성, 인스턴스화
    // s.displayInfo() // name 프로퍼티가 초기화되지 않았기 때문에 실행하면 오류가 발생함
    
    s.name = "참새" // name 프로퍼티에 값 할당(초기화)
    s.displayAddressLength() //클래스 프로퍼티 조회, 주소는 null로 초기화되어 있어서 length가 동작 안 함, 그냥 null 출력
    
    s.address = "서울" // address 프로퍼티에 값 다시 할당
    s.displayInfo() //클래스 프로퍼티 조회 메서드 실행
}


//명시적 생성자를 사용하지 않고 클래스 정의
class Student { // Student라는 이름 가진 클래스
    lateinit var name:String //lateinit 붙어서 나중에 초기화 가능
    var address:String? = null //null로 초기화할 수 있도록 String 뒤에 ?를 붙임

    fun displayInfo() { //프로퍼티 정보 출력
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
    
    fun displayAddressLength() { //주소 프로퍼티가 null이라면 null 출력, 아니라면 문자열 길이 출력
        println("주소의 길이는: ${address?.length} 입니다")
    }
}

(4) ?: 키워드 (null 대신 다른 문자열 출력)

  • null 대신에 다른 문자열을 출력하고 싶을 때 사용
  • 엘비스 연산자라고 한다.
fun main(){
    var s = Student() // 클래스 객체 생성, 인스턴스화
    // s.displayInfo() // name 프로퍼티가 초기화되지 않았기 때문에 실행하면 오류가 발생함
    
    s.name = "참새" // name 프로퍼티에 값 할당(초기화)
    s.displayAddressLength() //클래스 프로퍼티 조회, 주소는 null로 초기화되어 있어서 length가 동작 안 함, 초기화하세요가 출력됨

    s.address = "서울" // address 프로퍼티에 값 다시 할당
    s.displayInfo() //클래스 프로퍼티 조회 메서드 실행
}

//명시적 생성자를 사용하지 않고 클래스 정의
class Student { // Student라는 이름 가진 클래스
    lateinit var name:String //lateinit 붙어서 나중에 초기화 가능
    var address:String? = null //null로 초기화할 수 있도록 String 뒤에 ?를 붙임

    fun displayInfo() { //프로퍼티 정보 출력
        println("이름은: ${name} 입니다")
        println("주소는: ${address} 입니다")
    }
    
    fun displayAddressLength() { 
    	//주소 프로퍼티가 null이라면 "초기화하세요" 출력, 아니라면 문자열 길이 출력
        println("주소의 길이는: ${address?.length ?: "초기화하세요"} 입니다")
    }
}

참조문서

https://kotlinlang.org/docs/null-safety.html#nullable-types-and-non-nullable-types

0개의 댓글