[Kotlin ๊ธฐ์ดˆ] ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• - Null Safety
๋ฐ˜์‘ํ˜•

 

 

 

8 null ๊ฐ’์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ์ฒ˜๋ฆฌ: Null Safety

 

 

  • Kotlin์€ null ๊ฐ’์˜ ์ฒ˜๋ฆฌ์— ๋งŽ์€ ๊ณต์„ ๋“ค์ธ ์–ธ์–ด
  • null๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด, ํ˜น์€ ์•ฑ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Œ
// ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ

class One {
    fun print() {
        Log.d("null_safety", "can you call me?")
    }
}

var one: One
if (1 > 2){
    one = One()
}
one.print()
  • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” 1 > 2๊ฐ€ false์ด๊ธฐ ๋•Œ๋ฌธ์— one ๋ณ€์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” null ์ƒํƒœ
  • ์ด ๋•Œ print ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด null ํฌ์ธํ„ฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค์šด๋จ
  • ๋ฌผ๋ก  ์œ„ ์ฝ”๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ ์‹œ์ผœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋„๋ก ๋ง‰์•„์ฃผ์ง€๋งŒ,
    ์ฝ”๋“œ์˜ ์–‘์ด ๋งŽ์•„์ง€๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์–ธ์ œ๋“ ์ง€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Kotlin์€ ์ด๋Ÿฐ ์ƒํ™ฉ์— ๋‹ค์–‘ํ•œ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋งŒ๋“ฆ
  • ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด Null Safety

 

 

null ๊ฐ’ ํ—ˆ์šฉํ•˜๊ธฐ: ? (Nullable, ๋ฌผ์Œํ‘œ)

var variable: String?
  • Kotlin์—์„œ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋ณธ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ null์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์Œ
  • null ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ํƒ€์ž… ๋’ค์— ?(Nullable,  ๋ฌผ์Œํ‘œ)๋ฅผ ์ž…๋ ฅ

 

 

๋ณ€์ˆ˜์— null ํ—ˆ์šฉ ์„ค์ •ํ•˜๊ธฐ

var nullable: String? // ํƒ€์ž… ๋‹ค์Œ์— ๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์—ฌ์„œ null ๊ฐ’์„ ์ž…๋ ฅ ๊ฐ€๋Šฅ
nullable = null
โ€‹
var notNullable: String
notNullable = null // ์ผ๋ฐ˜ ๋ณ€์ˆ˜์—๋Š” null์„ ์ž…๋ ฅ ๋ถˆ๊ฐ€
  • ๋ณ€์ˆ˜์˜ ํƒ€์ž… ๋’ค์— ๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด null ๊ฐ’์„ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Œ
  • null ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ธฐ๋ณธํ˜•์œผ๋กœ ์„ ์–ธ

 

 

ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— null ํ—ˆ์šฉ ์„ค์ •ํ•˜๊ธฐ

fun nullParameter(str: String?){ // ํŒŒ๋ผ๋ฏธํ„ฐ str์— null์ด ํ—ˆ์šฉ๋จ
    if (str != null) {    // null ์ฒดํฌ๋ฅผ ํ•ด์•ผ str ์‚ฌ์šฉ๊ฐ€๋Šฅ
        var length2 = str.length
    }
}
  • ์•ˆ๋“œ๋กœ์ด๋“œ์˜ onCreate() ๋ฉ”์„œ๋“œ์˜ Bundle ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋„ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ null์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด์„œ null ์ฒดํฌ(?)๋ฅผ ๋จผ์ € ํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

 

ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์— null ํ—ˆ์šฉ ์„ค์ •ํ•˜๊ธฐ

fun nullReturn(): String? {
    return null
}
  • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์—๋„ ๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์—ฌ์„œ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์— Nullable์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด null ๊ฐ’์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์—†์Œ

 

 

์•ˆ์ „ํ•œ ํ˜ธ์ถœ: ?. (Safe Call, ๋ฌผ์Œํ‘œ์™€ ์˜จ์ )

fun testSafeCall(str: String?): Int? {
    var resultNull: Int? = str?.length
    // ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” length ํ”„๋กœํผํ‹ฐ๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ
    // str ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ null์ผ ๊ฒฝ์šฐ length ํ”„๋กœํผํ‹ฐ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ null์„ ๋ฐ˜ํ™˜
    return resultNull
}
  • ์ข€ ๋” ๊ฐ„๊ฒฐํ•œ null ์ฒดํฌ
  • Nullable์ธ ๋ณ€์ˆ˜ ๋‹ค์Œ์— ?.์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ null์ผ ๊ฒฝ์šฐ ?. ๋‹ค์Œ์˜ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ
  • ์˜ˆ์‹œ์—์„œ ๋งŒ์•ฝ Safe Call์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ str ๋ณ€์ˆ˜๊ฐ€ null์ด๋ผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์šด๋จ

 

 

Null ๊ฐ’ ๋Œ€์ฒดํ•˜๊ธฐ: ?: (Elvis Operator, ๋ฌผ์Œํ‘œ์™€ ์ฝœ๋ก )

fun testElvis(str: String?): Int {
    var resultNonNull: Int = str?.length ?: 0
    //Safe Call ๋‹ค์Œ์— ํ˜ธ์ถœ๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๋’ค์— ๋‹ค์‹œ ?:์„ ๋ถ™์ด๊ณ , 0์ด๋ผ๋Š” ๊ฐ’์„ ํ‘œ์‹œ
    //length ์˜ค๋ฅธ์ชฝ์— ?:์„ ์‚ฌ์šฉํ•˜๋ฉด null์ผ ๊ฒฝ์šฐ ?: ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์ด ๋ฐ˜ํ™˜
    //str ๋ณ€์ˆ˜๊ฐ€ null์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋’ค์— ํ‘œ์‹œํ•œ 0์„ ๋ฐ˜ํ™˜
    return resultNonNull
}
  • ์›๋ณธ ๋ณ€์ˆ˜๊ฐ€ null์ผ ๋•Œ ๋„˜๊ฒจ์ค„ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •

 

 

๐Ÿ’ก Nullable(?), Safe Call(?.), Elvis Operator(?:) ์š”์•ฝ ์ •๋ฆฌ

Nullable

  • ํ‘œ๊ธฐ๋ฒ•: ์„ ์–ธํ•˜๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž… ๋‹ค์Œ์— ? ํ‘œ๊ธฐ
  • ์‚ฌ์šฉ ๋ชฉ์ : null์„ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ์˜ˆ: var nullable: ํƒ€์ž…?

Safe Call

  • ํ‘œ๊ธฐ๋ฒ•: ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„ ๋‹ค์Œ์— ?. ํ‘œ๊ธฐ
  • ์‚ฌ์šฉ ๋ชฉ์ : null์ผ ๋•Œ ?. ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ์†์„ฑ์ด๋‚˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ์˜ˆ: var result = ๋ณ€์ˆ˜?.length ๋˜๋Š” ๋ณ€์ˆ˜?.ํ”„๋กœํผํ‹ฐ?.something

Elvis Operator

  • ํ‘œ๊ธฐ๋ฒ•: ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„ ๋‹ค์Œ์— ?: ํ‘œ๊ธฐ
  • ์‚ฌ์šฉ ๋ชฉ์ : null์ผ ๋•Œ ?: ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ์˜ˆ: var result = ๋ณ€์ˆ˜?:0 ๋˜๋Š” ๋ณ€์ˆ˜?.ํ”„๋กœํผํ‹ฐ?:0

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T