반응형

7. Nullable / NonNull

자바와 다른 코틀린만의 가장 큰 특징이라고 할 수 있는 부분이다. 자바에서는 NPE 때문에 굉장히 고생을 한다.

NPE는 Null Pointer Exception 오류의 약자이다. 자바에서 컴파일 시점에서는 발견할 수 없고 런타임 시점에서만 발견할 수 있기 때문에 매우 불편하다. 하지만 코틀린에서는 이것을 컴파일 시험에서 잡을 수 있도록 ? 가 있다.

fun nullcheck(){
    
    var name : String = "joyce" // NonNull타입
    var nullname : String = null // NonNull타입에 null을 넣었기 때문에
    // 에러(Null can not be a value of a non-null type String)발생

    var nullname2 : String? = null // 변수타입뒤에 ?를 넣어주면 Nullable타입이 됩.
    // 따라서 널을 넣고싶으면 ?를 써줘야하기 때문에 변수타입을 생략하면 안된다.

    // 함수을 사용하기위해선 null이면 안되는데 이를 간단하게 체크할 수 있다.

    // 스트링 클래스에 기본적으로 포함되어있는, 모든 문자열을 대문자로 바꾸어주는 toUpperCase 함수를 예시로 사용
    var nameInUpperCase = name.toUpperCase()

    var nullNameInUpperCase = nullname2.toUpperCase() 
    // Nullalbe타입을 그냥 쓰면 에러 발생
    // Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 에러 발생
    
		var nullNameInUpperCase2 = nullname2?.toUpperCase()
		// 이와같이 Nullable타입 뒤에는 ?를 붙여주면된다.
		// Nullname2가 Null이 아니면 toUpperCase를 실행하고 Null이면 Null로 반환

    // ?: 엘비스 연산자라고 함.
    // 엘비스 연산자 ?앞의 변수가 널 값이라면 반환할 값을 :뒤에 지정해준다.
    val lastName : String? = null
    val fullName = name + (lastName?: "No LastName") 
    // lastname이 null이면 name + "No LastName" 출력
    // lastname이 null이아니면 정상적으로 출력( name + lastName )
    println(fullName) // joyce No LastName 출력

    var lastName2 = "Hong"
    val fullName2 = name + (lastName2?: "No LastName")
    println(fullName2) // joyce Hong 출력
    
}

 자바와 다르게 코틀린은 굊아히 편리하게 null관리를 할 수 있다. 

 아래의 코드는 !! 연산자의 사용 예시이다. !! 연산자 또한 ?:(엘비스연산자)와 ? 연산자 만큼 많이 쓰인다. 

!! 연산자는 Nuallable로 타입이 지정되어 있지만 null이 아닌 것을 보장할 때 사용한다.

fun ifnoreNulls(str : String?){
    val mNotNull : String = str // Type mismatch.Required: String Found: String? 에러발생
    val mNotNull2 : String = str!! // !! 연산자를 사용하여 컴파일러에게 null이 아니라고 명시해줌
    val upper = mNotNull2.toUpperCase() // !!연산자를 사용해주었기 때문에 ?연산자를 사용하지 않아도 된다.
    // 주의 사항으로는 정말 확실하게 null이 아닌이상 !!는 잘 안쓰는 것이 좋다. null값이 들어가면 NPE오류가 발생하기 때문

    val email : String? ="soopeachxxx@nana.com"
    // email이 null이 아니면 let함수를 실행하고 null이면 실행하지 않는다(안전)
    // let함수는 자신의 리시버 객체(email)를 람다식 내부로 옮겨서 실행하는 구문이다.
    email?.let{
        println("my email is ${email}")
        // my email is soopeachxxx@nana.com 출력
   }
}

위에 작성된 코드 및 설명들은

코틀린 3강으로 끝내기 - 1편 기본 문법

에서 코틀린 강의 영상을 보며 정리한 내용입니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기