์ฝํ๋ฆฐ์ null ์ฒ๋ฆฌ
์ฝํ๋ฆฐ์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก null์ ํ์ฉํ์ง ์๋๋ค.
null ๊ฐ๋ฅํ ์ ์ธ (Nullable)
val a: Int? = null
val b: String? = null
๋จ์ ์ถ๋ ฅ์ ์๊ด์์ผ๋ null์ธ ์ํ์์ ์ฐ์ฐ๋๋ ๋ฉค๋ฒ์ ์ ๊ทผํ ๋ → NPE ๋ฐ์
NPE (Null Pointer Exception)
์ฌ์ฉํ ์ ์๋ null์ธ ๋ณ์์ ์ ๊ทผํ๋ฉด์ ๋ฐ์ํ๋ ์์ธ
์ธ์ดํ ์ฝ ?
fun main() {
var str1: String?
str1 = null
println("str1: $str1, length: ${str1?.length}") // str1์ด null์ด๋ฉด length๋ฅผ ์คํํ์ง ์๋๋ค.
}
? ์ ๋ถ์ด์ง ์์ผ๋ฉด NPE๊ฐ ๋ฐ์ํ๋ค.
non-null ๋จ์ ๊ธฐํธ !!
fun main() {
var str1: String?
str1 = null
println("str1: $str1, length: ${str1!!.length}")
}
null์ผ๋ฆฌ ์๋ค๋ ๋ป.
์์ ์ฝ๋์ฒ๋ผ ๊ฐ์ด null์ด๋ฉด NPE๊ฐ ๋ฐ์ํ๋ค. → ์ฌ๋งํ๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค..
์๋น์ค ์ฐ์ฐ์(elvise expression) ?:
fun main() {
var str1: String?
str1 = null
val len = if(str1 != null) str1.length else -1
println("str1: $str1, length: $len")
}
null๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌํด์ฃผ๋ ๋ณ์ len๊ณผ if๋ฌธ์ ์์ฑํ ์ฝ๋์ด๋ค.
(์ฐธ๊ณ ๋ก ์ฝํ๋ฆฐ์ if๋ฌธ์ ํ ์ค์ ์์ฑ ๊ฐ๋ฅํ๋ค.)
๋ ธ๋ ๋ถ๋ถ์์ Alt + Enter๋ฅผ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์๋น์ค ์ฐ์ฐ์๋ก ๋ฐ๊พธ๊ฒ ๋ค๋ ์๋ด ๋ฉ์์ง๊ฐ ๋ฌ๋ค.
์๋น์ค ์ฐ์ฐ์ ?:๋ null๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง๋ฅผ ๋์์ฃผ๋ ์ฐ์ฐ์์ด๋ค.
fun main() {
var str1: String?
str1 = null
val len = str1?.length ?: -1
println("str1: $str1, length: $len")
}
์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๋๋ค.
์๋ฏธ๋ ์์ ์ฝ๋์ ๋๊ฐ๋ค!
์๋ฃํ ๋ณํ
๋ณํ ๋ฉ์๋
val a: Int = 1
val b: Double = a.toDouble() // ๋ณํ ๋ฉ์๋์ ์ฌ์ฉ
- toByte
- toLong
- toShort
- toFloat
- toInt
- toDouble
- toChar
ํํ์์์ ์๋ฃํ์ ์๋์ ์๋ ๋ณํ
val result = 1L + 3 // Long + Int -> result๋ Longํ
์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๋ก
์ด์ค ๋ฑํธ(==)์ ์ผ์ค ๋ฑํธ(===)
- ==: ๊ฐ๋ง ๋น๊ต
- ===: ๊ฐ๊ณผ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๋น๊ต
fun main() {
val a: Int = 128
val b = a
println(a==b) // true
println(a===b) // true
val c: Int? = a
val d: Int? = a
val e: Int? = c
println(c==d) // true
println(c===d) // false
println(c===e) // true
}
a์ b๋ ์ปดํ์ผ ์ ์ฐธ์กฐํ์์ ๊ธฐ๋ณธํ ๋ณ์๊ฐ ๋๋ค. ๋ฐ๋ผ์ stack์ 128์ด๋ผ๋ ๊ฐ์ด ๊ฐ๊ฐ ์ ์ฅ๋๋ค.
c, d, e๋ nullable ๋ณ์์ด๋ฏ๋ก ์ฐธ์กฐํ ๋ณ์์ด๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ ์ ๊ฐ์ฒด๊ฐ ๋๊ณ , Heap์ด๋ผ๋ ๋์ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.
d๋ ๊ฐ๋ง ๋์ผํ ๋ฟ c์ ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ค.
e๋ c๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ด๋ฏ๋ก ์ฃผ์๋ ๊ฐ์ ธ์จ๋ค. ๋ฐ๋ผ์ A1์ ๊ฐ๋ฆฌํจ๋ค.
(+) ์ฐธ๊ณ
์ฝํ๋ฆฐ์์๋ ์ฐธ์กฐํ์ผ๋ก ์ ์ธํ ๋ณ์์ ๊ฐ์ด -128~127 ๋ฒ์์ ์์ผ๋ฉด,
Heap์ ํ ๋นํ์ง ์๊ณ ์บ์์ ๊ทธ ๊ฐ์ ์ ์ฅํ๋ค.
๋ฐ๋ผ์, ๊ทธ๋๋ ์ผ์ค ๋ฑํธ๊ฐ ๋จนํ์ง ์์ ์๋!
์ค๋งํธ ์บ์คํธ (Number)
๊ตฌ์ฒด์ ์ผ๋ก ๋ช ์๋์ง ์์ ์๋ฃํ์ ์๋ ๋ณํ
๊ฐ์ ๋ฐ๋ผ ์๋ฃํ ๊ฒฐ์
Numberํ์ ์ซ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ํน์ํ ์๋ฃํ์ผ๋ก ์ค๋งํธ ์บ์คํธ ๋จ
fun main() {
var test: Number = 12.2 // 12.2์ ์ํด Floatํ์ผ๋ก ์ค๋งํธ ์บ์คํธ
println("$test")
test = 12 // Intํ์ผ๋ก ์ค๋งํธ ์บ์คํธ
println("$test")
test = 120L // Longํ์ผ๋ก ์ค๋งํธ ์บ์คํธ
println("$test")
test += 12.0f // Floatํ์ผ๋ก ์ค๋งํธ ์บ์คํธ
println("$test")
}
test = "Hello"์ฒ๋ผ ์ซ์ํ์ ์์ ํ ๋ฒ์ด๋ ํ์ ์ ์ค๋งํธ ์บ์คํธ X
is ํค์๋
fun main() {
val num = 256
if(num is Int){ // num์ด Intํ์ผ ๋
print(num)
} else if (num !is Int){ // num์ด Intํ์ด ์๋ ๋, !(num is Int)์ ๋์ผํ ํํ
print("Not a Int")
}
}
Any
- ์๋ฃํ์ด ์ ํด์ง์ง ์์ ๊ฒฝ์ฐ
- ๋ชจ๋ ํด๋์ค์ ๋ฟ๋ฆฌ - Int๋ Stringํ์ Anyํ์ ์์ ํด๋์ค
- Any๋ ์ธ์ ๋ ํ์ํ ์๋ฃํ์ผ๋ก ์๋ ๋ณํ(์ค๋งํธ ์บ์คํธ)
fun main() {
var a: Any = 1 // Anyํ a๋ 1๋ก ์ด๊ธฐํ๋ ๋ Intํ
a = 20L // Intํ์ด์๋ a๋ ๋ณ๊ฒฝ๋ ๊ฐ 20L์ ์ํด Longํ
println("a: $a type: ${a.javaClass}") // a์ ์๋ฐ ๊ธฐ๋ณธํ์ ์ถ๋ ฅํ๋ฉด long์ด ๋์จ๋ค.
}
Anyํ์ ์ธ์๋ก ๋ฐ๋ ํจ์
fun main() {
checkArg("Hello") // String
checkArg(5) // Int
}
// ์ธ์๋ฅผ Anyํ์ผ๋ก ๋ฐ๋ ํจ์
fun checkArg(x: Any){
if(x is String){
println("x is String: $x")
}
if(x is Int){
println("x is Int: $x")
}
}
์ถ์ฒ
๋ณธ ํฌ์คํ ์ ๋ถ์คํธ์ฝ์ค ์ํฌํฐ์ฆ 3๊ธฐ ํ๋์ผ๋ก์
'์ฝํ๋ฆฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ณธ 1' ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑํ์์ต๋๋ค.
'๋์ธ ํ๋ > ๋ถ์คํธ์ฝ์ค ์ํฌํฐ์ฆ 3๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ถ์คํธ์ฝ์ค] 02. ์ฝํ๋ฆฐ ๋ณ์์ ์๋ฃํ (0) | 2021.02.15 |
---|---|
[๋ถ์คํธ์ฝ์ค] 01. ์ฝํ๋ฆฐ ์๊ฐ, ๊ฐ๋ฐ ํ๊ฒฝ ์ค์น (0) | 2021.01.29 |
[๋ถ์คํธ์ฝ์ค] 00. ๋ถ์คํธ์ฝ์ค ์๊ฐ, ์ฝํ๋ฆฐ ํ๋ก๊ทธ๋๋ฐ (2) | 2021.01.13 |