본문 바로가기
코틀린 문법

14. null값을 처리하는 방법, 동일한지 확인하는 방법

by 농농씨 2023. 5. 14.

참조:유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

 

//nullable 변수에서 Null을 처리하는 법, 변수간 동일성 확인하는 법 알아보자
//복습
//:코틀린에서 nullable 변수 만들어 객체가 들어있지 않은 null 상태를
//만들 수 있다.
//  ex.var sample:String?=null
//하지만 null상태로 속성이나 함수를 쓰려고 하면 
//null pointer exception(null인 객체를 참조하면 발생하는 오류)가
//발생하기 때문에 nullable 변수를 사용할 때는 null check가 없이는
//코드가 컴파일 되지 않는다
//  ex.if(sample!=null)
//    println(sample.toUpperCase())
//하지만 null check위해 일일이 if문으로 조건을 체크하는 대신 좀더 편리하려면?
//?. :null safe operator(null safe 연산자)
//   참조연산자 앞에 물음표 붙여서 사용
//   참조연산자를 실행하기 전에 먼저 객체가 null인지부터 확인하고 
//   객체가 null이면 뒤따라오는 구문을 실행하지 않음
//   ex.sample?.toUpperCase()->실행x
//?: :elvis operator(elvis 연산자)
//    물음표 옆에 콜론
//    객체가 null이 아니라면 그대로 사용하지만,
//    null이라면 연산자 우측의 객체로 대체됨
//    ex.sample?:default->"sample이 null이니까 대신 "default"씀
//!!. :non-null assertion operator(non-null assertion 연산자)
//    느낌표 두개와 참조연산자
//    참조연산자를 사용할 때 null 여부를 컴파일시 확인하지 않도록 하여 
//    런타임시 null pointer exception이 나도록 '의도적으로'
//    방치하는 연산자

마지막 a!!. 연산자 때문에 exception 발생(의도적)


fun main(){
    var a: String?=null
    //nullable String변수 a를 만들어 null을 할당
    
    println(a?.toUpperCase())//a에 null safe연산자를 사용하여
    //지난시간에 배운 toUpperCase()함수로 모든 문자 대문자로 바꿔주고
    //결과출력, null 이니까 뒤에꺼 실행안함
    
    println(a?:"default".toUpperCase())
    //elvis 연산자 사용해서 null일 때 대체되는 문자열 객체로 "default" 사용
    //또 toUpperCase() 사용해서 출력
    
    println(a!!.toUpperCase())
    //non-null assertion 연산자 사용 
    
}

 

//null safe 연산자는 스코프 함수와 사용하면 더욱 편리함

 



//변수의 동일성 체크
//동일성은 두가지 개념:내용의 동일성, 객체의 동일성
//내용의동일성
//:메모리 상의 서로 다른 곳에 할당된 객체라고 해도 그 내용이 같다면 
// 동일하다고 판단하는 것
// ex."사이다"->변수a, "콜라", "환타", "사이다"->변수b
//    ->a와 b는 내용이 동일하군!
//객체의 동일성
//:서로 다른 변수가 메모리상의 같은 객체를 가리키고 있을 때만 동일하다고 판단
// ex."콜라"<-변수 a,변수 b
//    ->a와 b는 내용이 동일하군!
//내용의 동일성 판단하는 연산자:a==b
//객체의 동일성 판단하는 연산자:a===b
//이때, 내용의 동일성은 자동으로 판단되는 것이 아닌 
// 코틀린의 모든 클래스가 내부적으로 상속받는 'Any'라는 최상위 클래스의 
// equals()함수가 반환하는 Boolean값으로 판단!
//기본 자료형에는 자료형의 특징에 따라 equals()함수가 이미 구현되어 있지만
// 우리가 커스텀 class를 만들때는
// ex.open fun equals(other:Any?):Boolean
//  이러한 equals를 상속받아 동일성을 확인해주는 구문을 별도로 구현해야 함

fun main(){
   
    var a = Product("콜라",1000)
    var b = Product("콜라",1000)
    var c = a//변수 a를 그대로 할당받음
    var d = Product("사이다",1000)
    
    println(a==b) //a와 b의 내용의 동일성 출력
    println(a===b) //객체의 동일성 출력
    //출력해보면 내용은 같지만 객체는 별개
    
    println(a==c)
    println(a===c)
    //내용도 객체도 일치
    
    println(a==d)
    println(a===c)
    //내용도 객체도 불일치
    
}

class Product(val name: String, val price: Int){
    //새로운 클래스 만들어 이름과 가격 받음
    override fun equals(other: Any?): Boolean{
        if(other is Product)
        {
        return other.name == name&&other.price == price
             
        } else {
            return false
        }    
    //equals()함수 오버라이딩하여
    //패러미터로 넘어온 객체가 프로덕트라면 이름과 가격이 모두 같은지
    //비교하여 boolean값으로 반환하고 아니라면 false 반환하도록함
    
}
}

//null 처리와 동일성의 확인은 프로그램 작성도중 빈번하게 사용하는 기능이므로
//동작방식 잘 알고 사용하도록!







































'코틀린 문법' 카테고리의 다른 글

16. 중첩클래스와 내부클래스  (0) 2023.05.14
15. 함수의 argument를 다루는 방법과 infix 함수  (0) 2023.05.14
13. 문자열을 다루는 법  (0) 2023.05.11
12. 리스트  (0) 2023.05.11
11. 제너릭  (0) 2023.05.11