๐Ÿ”ฅTIL๐Ÿ”ฅ์ŠคํŒŒ๋ฅดํƒ€ | ๊ธฐ์ˆ ๋ฉด์ ‘์งˆ๋ฌธ - Null Safety(๋„ ์•ˆ์ •์„ฑ)

hyihyiยท2024๋…„ 3์›” 18์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
62/69
post-thumbnail

๐Ÿ“– ๋„ ์•ˆ์ •์„ฑ

๋„(null)์€ ๊ฐ์ฒด๊ฐ€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ ์ƒํƒœ์ธ๋ฐ ๋„์ธ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•  ๋•Œ ๋„ ํฌ์ธํŠธ ์˜ˆ์™ธ(NullPointException)์ด ๋ฐœ์ƒํ•œ๋‹ค.

null ๊ฐ’์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒŒ ๋„ ์•ˆ์ •์„ฑ์ด๋‹ค

NPE : ๋„์ธ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜

์ž๋ฐ”์—๋Š” ๋„ ์•ˆ์ „ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์–ด์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•  ๋•Œ if-else๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋„ ์•ˆ์ „ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ 1. ? (์„ธ์ดํ”„ ์ฝœ ์—ฐ์‚ฐ์ž)

์„ธ์ดํ”„ ์ฝœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

class Person(val name: String?)

fun main() {
    val person: Person? = null
    val name = person.name // ์—ฌ๊ธฐ์„œ NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
    println(name)
}

์œ„ ์ฝ”๋“œ์—์„œ person ๊ฐ์ฒด๊ฐ€ ๋„์ด๋ฏ€๋กœ person.name์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด NPE๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์„ธ์ดํ”„ ์ฝœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

class Person(val name: String?)

fun main() {
    val person: Person? = null
    val name = person?.name // ์„ธ์ดํ”„ ์ฝœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผ
    println(name) // ๊ฒฐ๊ณผ๋Š” null์ด ๋  ๊ฒƒ์ด๋ฉฐ, NullPointerException์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
}

person.name์— ์ ‘๊ทผํ•  ๋•Œ NPE๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“ 2. ?: (์—˜๋น„์Šค ์ฝœ ์—ฐ์‚ฐ์ž)

๋„์ด ์•„๋‹ ๋•Œ๋Š” ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋„์ผ ๋•Œ๋Š” ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

val length = text?.length ?: 0  // text๊ฐ€ ๋„์ด ์•„๋‹ˆ๋ฉด length์— ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ํ• ๋‹น, ๋„์ด๋ฉด 0์„ ํ• ๋‹น

๐Ÿ“ 3. !! (๋„ ์•„๋‹˜ ๋‹จ์–ธ ์—ฐ์‚ฐ์ž)

ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๋„์ด ์•„๋‹ˆ๋ผ๊ณ  ๋‹จ์–ธํ•œ๋‹ค.

๋ณ€์ˆ˜๊ฐ€ ๋„์ด ์•„๋‹ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋„์ผ ๊ฒฝ์šฐ NPE๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์‚ฌ์šฉ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์ž์ด๋‹ค.

val length = text!!.length  // text๊ฐ€ ๋„์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ, ๋„์ธ ๊ฒฝ์šฐ NullPointerException ๋ฐœ์ƒ

๐Ÿ“ 4. ?.let { ... } (์„ธ์ดํ”„ ์ฝœ๊ณผ ๋žŒ๋‹ค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉ)

๋„์ด ์•„๋‹ ๋•Œ๋งŒ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•œ๋‹ค.

๋„์ผ ๋•Œ๋Š” ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

text?.let {
    // text๊ฐ€ ๋„์ด ์•„๋‹ ๋•Œ๋งŒ ์ด ๋ธ”๋ก์˜ ์ฝ”๋“œ ์‹คํ–‰
    println(it.length)
}

๐Ÿค” ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋„ ์ฐธ์กฐ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด ๋„ ์ฒดํฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

public String getCityName(User user) {
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            String city = address.getCity();
            if (city != null) {
                return city;
            }
        }
    }
    return "Unknown";
}

๋„ ์•ˆ์ „ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋Š” ์ž๋ฐ”์—์„œ๋Š” if-else ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋„ ์•ˆ์ „ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

fun getCityName(user: User?): String {
    return user?.address?.city ?: "Unknown"
}

์™œ null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  NPE๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋˜๊ฒŒ ๋งŒ๋“ค๊นŒ?

profile
์ž์œ ๋กญ๊ฒŒ ์“ด ๋‚˜์˜ ์ž์œ ๋กœ์šด Development voyageโ›ต

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 3์›” 26์ผ

์™œ null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  NPE๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋˜๊ฒŒ ๋งŒ๋“ค๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด์„œ null์ด ์กด์žฌํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ๋“ค์ด ์กด์žฌํ•ด์š”
์•ฑ์—์„œ My ํŽ˜์ด์ง€์— ์ž์‹ ์˜ ์ด๋ฆ„์„ ๋ณด์—ฌ์ค€๋‹ค๊ณ  ํ•  ๋•Œ
์ด๋ฆ„์ด null์ธ ๊ฒฝ์šฐ๋Š” ์—†์ž–์•„์š”??
๋ถ„๋ช… null์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋””์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋˜ ๊ฒƒ์ด๊ณ  ์ด๊ฒƒ์„ ๊ฐœ๋ฐœ์ž๋Š” ๋น ๋ฅด๊ฒŒ ๋Œ€์‘์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
๊ทธ๋ ‡๊ธฐ์— Exception์„ ๋‚ด๋Š” ์ด์œ ์ด๋ฉฐ

๋˜ํ•œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋„ ํ•ด์š”

var db: DB? = ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค

if ( db != null ) {
if ( db.dao != null ) {
if (... != null) {
//... ๋Œ€์ถฉ ์–ด๋งˆ์–ด๋งˆํ•œ null ๋Œ€์‘
}
}
}

var db: DB? = ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

if (db == null) {
throw NPE
}

ํ™•์‹คํžˆ ํ›„์ž๊ฐ€ ๋” ๋‚ซ์ ธ??

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ