๋Œ€์™ธ ํ™œ๋™/๋ถ€์ŠคํŠธ์ฝ”์Šค ์„œํฌํ„ฐ์ฆˆ 3๊ธฐ

[๋ถ€์ŠคํŠธ์ฝ”์Šค] 03. ์ฝ”ํ‹€๋ฆฐ null ์ฒ˜๋ฆฌ, ์ž๋ฃŒํ˜• ๋ณ€ํ™˜

๋…ธ๋ฃจ๋ฃฝ 2021. 2. 20. 23:38

์ฝ”ํ‹€๋ฆฐ์˜ 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' ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

www.boostcourse.org/mo132

 

์ฝ”ํ‹€๋ฆฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ 1

๋ถ€์ŠคํŠธ์ฝ”์Šค ๋ฌด๋ฃŒ ๊ฐ•์˜

www.boostcourse.org