728x90
null ์ํ ํ์ธ
- null์ํ๋ก ์์ฑ์ด๋ ํจ์๋ฅผ ์ฐ๋ ค๊ณ ํ๋ฉด null pointer exception์ด ๋ฐ์ํ๋ค.
- null pointer exception : null์ธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ฐ์ํ๋ ์ค๋ฅ
- ๊ทธ๋์ nullable ๋ณ์๋ฅผ ์ฌ์ฉํ ๋๋ nullํ์ธ ์์ด๋ ์ฝ๋๊ฐ ์ปดํ์ผ ๋์ง ์๋๋ค.
var sample: String? = null
// if๋ฌธ์ผ๋ก nullalbe ํ์ธ
if(sample != null)
println(sample.toUpperCase())
- null ์ฒดํฌ๋ฅผ ํ๊ธฐ ์ํด ์ผ์ผํ if๋ฌธ์ผ๋ก ์กฐ๊ฑด์ ํ์ธํ๋ ๋์ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ธ ์ ์๋ค.
- ?. (null safe operator)
- ?: (elvis operator)
- !!. (non-null assertion operator)
?. (null safe operator)
- ์ฐธ์กฐ์ฐ์ฐ์๋ฅผ ์คํํ๊ธฐ ์ ์ ๋จผ์ ๊ฐ์ฒด๊ฐ null์ธ์ง ํ์ธ๋ถํฐ ํ๋ค.
- ๊ฐ์ฒด๊ฐ null์ด๋ผ๋ฉด ๋ค๋ฐ๋ผ์ค๋ ๊ตฌ๋ฌธ์ ์คํํ์ง ์๋๋ค.
sample?.toUpperCase() //sample์ด null์ด๋ผ๋ฉด toUpperCase()๋ฅผ ์คํํ์ง ์๋๋ค.
- ์ค์ฝํ ํจ์์ ์ฌ์ฉํ๋ฉด ๋ ํธ๋ฆฌํ๋ค.
?: (elvis operator)
- ๊ฐ์ฒด๊ฐ null์ด ์๋๋ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- null ์ด๋ผ๋ฉด ์ฐ์ฐ์์ ์ฐ์ธก์ ๊ฐ์ฒด๋ก ๋์ฒด๋๋ค.
sample?:"default" // sample์ด null์ด๋ผ๋ฉด null๋์ "default"๋ฅผ ์ฌ์ฉํ๋ค.
!!. (non-null assertion operator)
- ์ฐธ์กฐ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ null์ฌ๋ถ๋ฅผ ์ปดํ์ผ์ ํ์ธํ์ง ์๋๋ก ํ์ฌ ๋ฐํ์์ ์๋์ ์ผ๋ก null pointer exception์ด ๋๋๋ก ํ๋ค.
null์ฒดํฌ ์ฐ์ฐ์ ์์
fun main(){
var a: String? = null
println(a?.toUpperCase()) // null safe ์ฐ์ฐ์ ์ฌ์ฉ
println(a?:"default".toUpperCase()) // elvis ์ฐ์ฐ์ ์ฌ์ฉ
println(a!!.toUpperCase()) // non-null assertion ์ฐ์ฐ์ ์ฌ์ฉ
}
์ถ๋ ฅ
Exception in thread "main" java.lang.NullPointerException
at MainKt.main(Main.kt:6)
at MainKt.main(Main.kt)
null
DEFAULT
์ค์ฝํ ํจ์์ ๊ฐ์ด ์ด์ฉํ null safe์ฐ์ฐ์ ์์
fun main(){
var a: String? = "Hey Kotlin"
a?.run {
println(toUpperCase())
println(toLowerCase())
}
}
์ถ๋ ฅ
HEY KOTLIN
hey kotlin
์ด์ฒ๋ผ if๋ฌธ์ด ์๋ safe-null ์ฐ์ฐ์์ ์ค์ฝํ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ํธ๋ฆฌํ๊ฒ null ์ฒดํฌ๋ฅผ ํ ์ ์๋ค.
๋์ผ์ฑ์ ๋๊ฐ์ง ๊ฐ๋
- ๋ด์ฉ์ ๋์ผ์ฑ
- ๋ฉ๋ชจ๋ฆฌ์์ ์๋ก ๋ค๋ฅธ๊ณณ์ ํ ๋น๋ ๊ฐ์ฒด๋ผ๊ณ ํด๋ ๊ทธ ๋ด์ฉ์ด ๊ฐ๋ค๋ฉด ๋์ผํ๋ค๊ณ ํ๋ค.
- ex) a์ ๋ด์ฉ์ 1๋ฒ์ง ๋ฉ๋ชจ๋ฆฌ์"๊ณฑ์ฐฝ"์ด๊ณ , b์ ๋ด์ฉ์ 4๋ฒ์ง ๋ฉ๋ชจ๋ฆฌ์ "๊ณฑ์ฐฝ"์ด๋ฉด a์ b๋ ๋ด์ฉ์ ๋์ผ์ฑ ๊ด์ ์์ ๋์ผํ๋ค๊ณ ํ ์ ์๋ค.
- ๋ด์ฉ์ ๋์ผ์ฑ์ ํ๋จํ๋ ์ฐ์ฐ์๋ == ์ด๋ค.
- ์๋์ผ๋ก ํ๋จ๋๋ ๊ฒ์ด ์๋ ์ฝํ๋ฆฐ์ ๋ชจ๋ ํด๋์ค๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์๋ฐ๋ 'Any'๋ผ๋ ์ต์์ ํด๋์ค equals() ํจ์๊ฐ ๋ฐํํ๋ Boolean๊ฐ์ด๋ค.
- ๊ธฐ๋ณธ ์๋ฃํ์๋ ์๋ฃํ์ ํน์ง์ ๋ฐ๋ผ equals() ํจ์๊ฐ ์ด๋ฏธ ๊ตฌํ๋์ด ์์ง๋ง ์ปค์คํ ํด๋์ค๋ฅผ ๋ง๋ค๋๋ equals()๋ฅผ ์์๋ฐ์ ๋์ผ์ฑ์ ํ์ธํด์ฃผ๋ ๊ตฌ๋ฌธ์ ์ง์ ๊ตฌํํด์ผํ๋ค.
- ๊ฐ์ฒด์ ๋์ผ์ฑ
- ์๋ก ๋ค๋ฅธ ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์๋๋ง ๋์ผํ๋ค๊ณ ํ๋ค.
- ex) a์ ๋ด์ฉ์ 3๋ฒ์ง ๋ฉ๋ชจ๋ฆฌ์ "์ผ๊ฒน์ด"์ด๊ณ , b์ ๋ด์ฉ๋ 3๋ฒ์ง ๋ฉ๋ชจ๋ฆฌ์ "์ผ๊ฒน์ด"์ด๋ฉด a์ b๋ ๊ฐ์ฒด์ ๋์ผ์ฑ ๊ด์ ์์ ๋์ผํ๋ค๊ณ ํ ์ ์๋ค.
- ๊ฐ์ฒด์ ๋์ผ์ฑ์ ํ๋จํ๋ ์ฐ์ฐ์๋ === ์ด๋ค.
๋ด์ฉ์ ๋์ผ์ฑ & ๊ฐ์ฒด์ ๋์ผ์ฑ ์์
fun main(){
var a = Product("๋ผ์ง", 1000)
var b = Product("๋ผ์ง", 1000)
var c = a
var d = Product("์", 1000)
println(a == b) // ๋ด์ฉ์ ๋์ผ์ฑ ํ์ธ
println(a === b) // ๊ฐ์ฒด์ ๋์ผ์ฑ ํ์ธ
println(a == c) // ๋ด์ฉ์ ๋์ผ์ฑ ํ์ธ
println(a === c) // ๊ฐ์ฒด์ ๋์ผ์ฑ ํ์ธ
println(a == d) // ๋ด์ฉ์ ๋์ผ์ฑ ํ์ธ
println(a === d) // ๊ฐ์ฒด์ ๋์ผ์ฑ ํ์ธ
}
class Product(val name: String, val price: Int){
override fun equals(other: Any?): Boolean {
if(other is Product){ // ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ๊ฐ์ฒด๊ฐ Product๋ผ๋ฉด
return other.name == name && other.price == price // ์ด๋ฆ๊ณผ ๊ฐ๊ฒฉ์ด ๋ชจ๋ ๊ฐ์์ง ๋น๊ตํ์ฌ boolean๊ฐ์ผ๋ก ๋ฐํ
}else{
return false
}
}
}
์ถ๋ ฅ
true
false
true
true
false
false
๐กnull ์ฒ๋ฆฌ์ ๋์ผ์ฑ์ ํ์ธ์ ํ๋ก๊ทธ๋จ ์์ฑ ๋์ค ๋น๋ฒํ๊ฒ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๋ค.
728x90
'์๋๋ก์ด๋๐ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝํ๋ฆฐ] ์ค์ฒฉ ํด๋์ค์ ๋ด๋ถ ํด๋์ค (0) | 2024.07.07 |
---|---|
[์ฝํ๋ฆฐ] ํจ์์ ๋ค์ํ ๊ธฐ๋ฅ (0) | 2024.07.07 |
[์ฝํ๋ฆฐ] ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2024.07.02 |
[์ฝํ๋ฆฐ] ์ ๋๋ฆญ (0) | 2024.07.02 |
[์ฝํ๋ฆฐ] ํด๋์ค ๋คํ์ฑ (0) | 2024.07.02 |