참조:유튜브 디모의 코틀린
코드테스트사이트: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이 나도록 '의도적으로'
// 방치하는 연산자
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 |