Language/Java

โ˜• ๊ฐœ๋ฐœ์ž๋“ค์„ ๊ดด๋กญํžˆ๋Š” ์ž๋ฐ” NULL ํŒŒํ—ค์น˜๊ธฐ

์ธํŒŒ_ 2023. 2. 28. 11:39

java-null-npe

๊ฐœ๋ฐœ์ž์˜ ์˜์›ํ•œ ์ˆ™์ œ NULL

null ์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์›Œ๋ณด๋ฉด ๋น ๋ฅด๋‚˜ ๋Šฆ๋‚˜ ๋ฐ˜๋“œ์‹œ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ๋…€์„์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ“ ์ ‘ํ•œ ์‚ฌ๋žŒ๋“ค์€ null์„ ๊ทธ์ € '๊ฐ’์ด ์—†๋Š” ๊ฒƒ' ์œผ๋กœ ์™ธ์šฐ๊ณ  ๋„˜์–ด๊ฐ€๋ฒ„๋ฆฐ๋‹ค. ์‹ฌ์ง€์–ด null์„ ๋ถ€์ •์˜ ๋œป์œผ๋กœ 0 ์ด๋‚˜ ๊ณต๋ฐฑ ๊ทธ๋ฆฌ๊ณ  false ์™€ ๋™์ผ์„ ์ƒ์— ๋†“๊ณ  ์ƒ๊ฐํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋‹น์—ฐํžˆ ์ด๋Š” ์ž˜๋ชป๋œ ์ •์˜ ์ด๋‹ค.

๊ทธ์ € ๊ฐ’์ด ์—†๋‹ค๋Š” ํ‘œํ˜„์ผ ๋ฟ์ธ๋ฐ ๊ฐœ๋ฐœ์ž์˜ ์˜์›ํ•œ ์ˆ™์ œ ๋ผ๋‹ˆ ๋ญ๋‹ˆ ๋ผ๋Š” ํ‘œํ˜„์„ ์“ฐ๋Š” ์ด์œ ๋Š”, ๊ฐœ๋ฐœ์ž๋“ค์ด null์„ ๋งˆ์ฃผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์— ์—๋Ÿฌ ๋ฉ”์„ธ์ง€(NullPointerException) ๋กœ ์ธํ•ด ์ž˜๋™์ž‘ ํ•˜๋˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋ฒ„๋ ค ์›์ธ์„ ์ฐพ๋Š๋ผ ์‹ฌํ•œ ๊ณ ์ƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์šฐ์„  NULL ์ด๋ผ๋Š” ๊ฐœ๋…์€, ์˜๊ตญ์˜ ์ปดํ“จํ„ฐ ๊ณผํ•™์ž์ธ ํ† ๋‹ˆ ํ˜ธ์–ด(Tony Hoare)๊ฐ€ 1965๋…„์— ์•Œ๊ณจ(ALGOL W)์ด๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด์„œ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค. ๋‹น์‹œ์— ๊ทธ๋Š” '๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ' ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด null ์ด๋ผ๋Š” ๊ฐœ๋… ๊ณ ์•ˆํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์ปจํผ๋Ÿฐ์Šค์—์„œ ๊ทธ๋Š” ์ž์‹ ์ด ๊ณ ์•ˆํ•œ null ์ฐธ์กฐ๋ฅผ '10์–ต ๋‹ฌ๋Ÿฌ์งœ๋ฆฌ ์‹ค์ˆ˜' ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋ฉฐ null ์ฐธ์กฐ๋ฅผ ๋งŒ๋“  ๊ฒƒ์„ ํ›„ํšŒํ•œ๋‹ค๊ณ  ํ† ๋กœํ•˜์˜€๋‹ค. ๋‹จ์ˆœํžˆ ์—†๋Š” ๊ฐ’์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ null ์ฐธ์กฐ ๊ฐœ๋…์ด ์ด๋กœ ์ธํ•ด ์ˆ˜๋งŽ์€ ์˜ค๋ฅ˜, ์ทจ์•ฝ์„ฑ ๋ฐ ์‹œ์Šคํ…œ ์ถฉ๋Œ์ด ์ƒ๊ธฐ๊ณ  ํ”ผํ•ด๊ฐ€ ๋ง‰๋Œ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์ž๋ฐ”์˜ NULL ํŒŒํ—ค์น˜๊ธฐ

์‚ฌ์‹ค ์ž๋ฐ”์—์„œ์˜ ์ด null ์ด๋ผ๋Š” ๋…€์„์€ ๊ต‰์žฅํžˆ ์‹ฌ์˜คํ•œ ๋…€์„์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฑธ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ์ธ๋ฐ, int ๋‚˜ char๊ฐ™์€ ๋ฒ”์šฉ์ ์ธ ํƒ€์ž…์— ๋Œ€์ž…ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋“ค ๊ฐ™์€ primitive ์ž๋ฃŒํ˜•์ผ ๊ฒฝ์šฐ ๊ฐœ๋ณ„์ ์œผ๋กœ 0์ด๋‚˜ ๊ณต๋ฐฑ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ„์ ‘์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— null์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด ์ž๋ฐ”์˜ reference ํƒ€์ž… ๊ฐ™์€ ๊ฒฝ์šฐ ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ null๋กœ ์ง€์ •ํ•œ๋‹ค.

java-null-npe

primitive๋Š” 0์ด๋‚˜ false ๊ทธ๋ฆฌ๊ณ  reference๋Š” null ์ด๋Ÿฐ์‹์œผ๋กœ ์ฃผ์ž…์‹ ์•”๊ธฐ ํ•˜๋Š”๊ฒƒ๋„ ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ, ์™œ reference๋Š” null๋กœ ๋˜๋Š”์ง€ ์ด์œ ๋ฅผ ์•ˆ๋‹ค๋ฉด ์ถ”ํ›„์— ์ž์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์ด null ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ํ„ฐ์กŒ์„๋•Œ ์ด๋ฅผ ์œ ์ถ”ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

 

null์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ

C์–ธ์–ด์—์„œ๋Š” ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ 'ํฌ์ธํ„ฐ'๋ผ๋Š” ๊ฒƒ์ด ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์–ด ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ์–ด๋Š ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์ผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋ฒˆ์— ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์„ ์–ธ๋งŒ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

int๋‚˜ double ํƒ€์ž… ๊ฐ™์€ ๊ฒฝ์šฐ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 0์ด ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋‘๋“ค ์•„๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์›์‹œ๊ฐ’์„ ์ž์ฒด์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค. ๋ฐ˜๋ฉด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ์›๋ž˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด์™€์•ผ ๋˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆํ•  ๊ฒฝ์šฐ 0์ด๋‚˜ false ๊ฐ™์€ ์ฃผ์†Œ์˜ ๋ฌด(็„ก)์˜ ๊ฐ’์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ํ‘œํ˜„ํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ฐ”๋กœ NULL ์ธ ๊ฒƒ์ด๋‹ค.

์ฆ‰, NULL์€ ์ฃผ์†Œ๊ฐ’์ด ์—†๋Š” ๊ฒƒ(์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ)์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

java-null-npe
null์€ ์ฃผ์†Œ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ์ด๋‹ค

๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด์„œ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ผ๋„, ๋“ค์„ ์ผ๋„ ์—†์—ˆ์„ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋Š” ์ž๋ฐ”์—์„œ ํฌ์ธํ„ฐ ๊ฐœ๋…์„ ์—†์• ์„œ ๊ทธ๋Ÿฐ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ์ฒ ์ €ํžˆ ์ˆจ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‚ฌ์‹ค ์ž๋ฐ”์˜ ๋ฐฐ์—ด, ๊ฐ์ฒด, ์ŠคํŠธ๋ง ๊ฐ™์€ reference ํƒ€์ž…์€ ๋ชจ๋‘ ์ฐธ์กฐ(ํฌ์ธํ„ฐ) ๋ณ€์ˆ˜์ธ ์…ˆ์ด๋‹ค.

์ž๋ฐ”์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜์™€ ํฌ์ธํ„ฐ์˜ ์ •ํ™•ํ•œ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์€ ๋‘˜๋‹ค ์ฃผ์†Œ ์•ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์€ ๊ฐ€์ง€์ง€๋งŒ, ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์—†์–ด ์ฃผ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝํ• ์ˆ˜ ์—†๋‹ค.
๋ฐ˜๋ฉด ํฌ์ธํ„ฐ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ ์œต์—ฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€์‹  ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
์ฆ‰, ์ž๋ฐ”์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํฌ์ธํ„ฐ๋ผ๊ณ  ๋ด๋„ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ๋‹ค์Œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ null ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด์ž.

 

null ๊ณผ ์ฐธ์กฐํ˜• ํ•„๋“œ์˜ ๊ด€๊ณ„

๋‹ค์‹œ ๋ณต์Šตํ•˜์ž๋ฉด, ๋ชจ๋“  ์›์‹œํ˜• ํƒ€์ž…(Primitive type) ์€ ๋”ฐ๋กœ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” default ๊ฐ’์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธํ˜• ํƒ€์ž…์ธ boolean ํƒ€์ž…์€ false, ์ •์ˆ˜ํ˜• int๋Š” 0์„ ๊ฐ–๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์ฐธ์กฐํ˜• ํƒ€์ž…(Reference type)์€ default ๊ฐ’์œผ๋กœ null์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ๋˜๋Š”๋ฐ, ์„ ์–ธํ•  ๋•Œ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ๋กœ null์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

class Test {
    int i; // Primitive type
    Integer ii; // Reference type
}

Test t = new Test(); // ๋”ฐ๋กœ ์ดˆ๊ธฐํ™” ์—†์ด ๋ฐ”๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
System.out.println(t.i); // 0
System.out.println(t.ii); // null

๋ฐ”๋กœ ์œ„์—์„œ C ์–ธ์–ด์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ• ๋•Œ null์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์—์„œ ๋‹ค๋ค„์ง€๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๋Š” ํ‚ค์›Œ๋“œ๋ผ ๋งํ•œ๋ฐ”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์ธ์šฉํ•œ๋‹ค๋ฉด null์€ ์ž๋ฐ”์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜์—๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋ผ๋Š” ๋ง์ด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ null์„ ์›์‹œํ˜•(Primitive type) ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ(NullPointerException)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๊ดด๋กญ๊ฒŒ ๋งŒ๋“œ๋Š” ์›์ธ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

int i = null; // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

์ด๊ฒƒ์ด ์™œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ดด๋กญํ•˜๊ฒŒ ํ•˜๋ƒ๋ฉด, ์ž๋ฐ”์˜ ์˜คํ† ๋ฐ•์‹ฑ & ์˜คํ† ์–ธ๋ฐ•์‹ฑ ๊ณผ์ •์—์„œ ์—๋Ÿฌ๋ผ๋Š” ๊นœ์ง ์„ ๋ฌผ์„ ๋‚ด์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋™์œผ๋กœ ํ˜•๋ณ€ํ™˜์ด ์ง„ํ–‰๋˜๋Š” ๋งŒํผ ํŽธ์•ˆํ•จ์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณตํ•˜์ง€๋งŒ ๋Œ€์‹ ์— ๋ฒ„๊ทธ๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์–ด๋ ต๊ฒŒ ํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Integer๋‚˜ Double๊ณผ ๊ฐ™์€ ๋ž˜ํผ(Wrapper) ํด๋ž˜์Šค ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ null์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์„ ๋•Œ, ์ด๋ฅผ ๊ธฐ๋ณธํ˜• ํƒ€์ž…์œผ๋กœ ์–ธ๋ฐ•์‹ฑ(unboxing)ํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

// Integer ๋ž˜ํผ๋Ÿฐ์Šค ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  11 ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
Integer BoxedValue = new Integer(11);

// ... 

// ๋งŒ์ผ 1000์ค„์ด ๋„˜๋Š” ์ฝ”๋“œ์—์„œ BoxedValue ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋‹ค๊ฐ€ ์–ด๋– ํ•œ ์›์ธ์œผ๋กœ ์ธํ•ด BoxedValue์— null ๊ฐ’์ด ๋“ค์–ด๊ฐ”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
BoxedValue = null;

// Integer ๋ž˜ํผ ํƒ€์ž…์ธ BoxedValue๋ฅผ int ํƒ€์ž…์œผ๋กœ ์ž๋™ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ๊ณผ์ •์—์„œ null์€ primitive ํƒ€์ž…์— ๋„ฃ์„์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค
int intValue = boxedValue; // NullPointerException ๋ฐœ์ƒ

์ด์ฒ˜๋Ÿผ ์˜คํ†  ๋ฐ•์‹ฑ(Auto-boxing)์˜ ๋™์ž‘์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๊ฐœ๋ฐœ์ž ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์ทจ์•ฝ์ ์ด ์กด์žฌํ•œ๋‹ค. ์ด๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์—†๊ณ  ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๊ณผ์ •์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์—๋Ÿฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

null ๊ณผ static ํ‚ค์›Œ๋“œ

ํ˜•๋ณ€ํ™˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ null ์„ ์ฐธ์กฐํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ(NullPointerException)์ด ๋ฐœ์ƒํ•œ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ ๋ฉ”์„œ๋“œ๊ฐ€ static์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ ์‹คํ–‰๋œ๋‹ค.

class Hello {
    public void sayHello() {
        System.out.println("hello object");
    }

    public static void sayHelloStatic() {
        System.out.println("hello static");
    }
}

Hello h = null; // Hello ๊ฐ์ฒด ๋ณ€์ˆ˜์— null์„ ์ฐธ์กฐ

h.sayHello(); // ERROR !!!
h.sayHelloStatic(); // ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ null์ด์ง€๋งŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. (์‹คํ–‰์€ ๋˜๊ณ  ๊ฒฝ๊ณ ๋งŒ ๋œฌ๋‹ค)

์™œ๋ƒํ•˜๋ฉด ํด๋ž˜์Šค์˜ ์ •์ (static) ๋ฉค๋ฒ„๋Š” ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํƒ€์ž„์— JVM์˜ static area์— ์ตœ์ ํ™”๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ง๋ฐฉ์œผ๋กœ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋กœ ์‹๋ณ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๋ณ€์ˆ˜๊ฐ€ null์ด๋“  ์•„๋‹ˆ๋“  ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. (์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€์‹ ์— ๊ฒฝ๊ณ ๋ฅผ ๋‚ด์ค€๋‹ค)

๋ณดํ†ต ์ •์ (static) ๋ฉ”์„œ๋“œ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋„ ์•Œ๋‹ค์‹œํ”ผ ํด๋ž˜์Šค๋ช…์„ ํ†ตํ•ด ํ˜ธ์ถœ Hello.sayHelloStatic() ํ•ด์™”๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์ด์œ ๊ฐ€ ์œ„์˜ ํ˜ผ๋™์„ ์ค„์ผ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒƒ์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

null ๊ณผ instanceof ํ‚ค์›Œ๋“œ

null์˜ ๋˜๋‹ค๋ฅธ ๋…ํŠนํ•œ ํŠน์ง•์šด null ์„ ์ฐธ์กฐํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜์— instanceOf ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

instanceOf ํ‚ค์›Œ๋“œ๋Š” ์ฐธ์กฐ(reference) ๋ณ€์ˆ˜๊ฐ€ ์–ด๋Š ๊ฐ์ฒด ํƒ€์ž…์ธ์ง€ ๊ฒ€์‚ฌ ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ์ž์ธ๋ฐ, ์•„๋ฌด๋ฆฌ null ์ด๋ผ ํ•ด๋„ ์ฒ˜์Œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ํ• ๋•Œ String myReference = null ๋กœ ์ง์ ‘ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ String์œผ๋กœ ๋ช…์‹œ ํ•ด์คฌ์Œ ๋ถˆ๊ตฌํ•˜๊ณ  false๋ผ๊ณ  ํ•˜๋‹ˆ ๋ฌด์–ธ๊ฐ€ ์ด์ƒํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด instanceof ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ํƒ€๊ณ  ๊ฐ€์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ณด๊ณ  ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์ด ์—†๋Š” null ์ƒํƒœ์ด๋ผ์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง์ ‘ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” >, >=, <, <= ์™€ ๊ฐ™์ด ํฌ๊ณ  ์ž‘์Œ์„ ๋น„๊ตํ•˜๋Š” ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๋ฅผ null์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ(NullPointerException)์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค๋งŒ ์˜ˆ์™ธ๋กœ ==, != ๊ณผ ๊ฐ™์€ ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Main {
    public static void main(String[] args) {
    
        String o = null;
        
        if (o instanceof String) {
        } else {  
            System.out.println("instanceof returned false"); // ์กฐ๊ฑด๋ฌธ์—์„œ myReference๋Š” null์ด๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ์ด์ชฝ์ด ์‹คํ–‰๋œ๋‹ค
        }
        
        String o2 = "Hello World";
        
        if (o2 instanceof String) {
            System.out.println("myReference is a String"); // ์ถœ๋ ฅ
        } 
    }
}

NPE (NullPointerException)

์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋˜ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ NullPointerException(์ดํ•˜ NPE)๋Š” null ์ฐธ์กฐ๋กœ ์ธํ•ด ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ๊ณจ์น˜์•„ํ”„๊ฒŒ ๊ฒช๋Š” 1๋“ฑ ๊ณต์‹ ์ด๋‹ค.

์•ž์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์ž๋ฐ”์—์„œ null์€ ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๋œปํ•˜๋Š”๋ฐ, ๋งŒ์ผ null์„ ์ฐธ์กฐํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ์˜ ๊ฐ์ฒด ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋•Œ NullPointerException๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํŠนํžˆ๋‚˜ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ณ ํ†ต๋ฐ›๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” NullPointerException๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์ธ ๋Ÿฐํƒ€์ž„(Runtime) ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ง„์ž‘์— ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๋ฏธ๋ฆฌ ์•Œ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์„ ํ…๋ฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋‹ˆ, ์ž๋ฐ” ๊ฐœ๋ฐœ์ž์—๊ฒŒ NPE๋Š” ์ฝ”๋“œ ๋ฒ ์ด์Šค ๊ณณ๊ณณ์— ๊น”๋ ค์žˆ๋Š” ์ง€๋ขฐ๊ฐ™์€ ๋…€์„์ธ ๊ฒƒ์ด๋‹ค.

java.lang.NullPointerException
	at seo.dale.java.practice(OptionalTest.java:26)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)

 

NPE ๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค

๊ทธ๋Ÿผ ์ •ํ™•ํžˆ ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ•˜๊ธฐ์— ์ง€๋ขฐ๊ฐ€ ํŽ‘์ฒญ ํ„ฐ์ง€๋Š” ๊ฒƒ์ผ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์ด Person , Phone, OS ๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ตœ์ข… ๋ชฉํ‘œ๋Š” ๊ฐ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ํ†ตํ•ด OS์˜ ์ŠคํŠธ๋ง ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

class Person {
    private Phone phone;
    private String name; // ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ

    Person(String name) {
        this.name = name;
    }

    public Phone getPhone() {
        return this.phone;
    }
}

class Phone {
    private OS os; // ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆํ•จ

    public OS getOS() {
        return this.os;
    }
}

class OS {
    public String printOS() {
        return "Android";
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("ํ™๊ธธ๋™");
        
        p.getPhone().getOS().printOS(); // person์˜ Phone์„ ์–ป๊ณ  ๊ทธ Phone์˜ OS๋ฅผ ์–ป๊ณ  OS๋ช…์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ ์ฒด์ด๋‹
    }
}

java-null-npe

ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด NPE(NullPointException)์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด p.getPhone().getOS().printOS() ์ฝ”๋“œ์—์„œ p.getPhone() ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด null ์ด๊ธฐ ๋•Œ๋ฌธ์— null.getOS() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์™œ Phone ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ getPhone() ์ด null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋ฅผ ์ถ”์ ํ•ด๋ณด๋ฉด, new Person() ์ด ์ดˆ๊ธฐํ™”๋ ๋•Œ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด์ธ private Phone phone ์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€์•Š์•„ null๋กœ ๊ฐ’์ด ๋ฐฐ์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  getPhone() ์—์„œ Phone ํƒ€์ž…์˜ ๊ฐ์ฒด this.phone์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ์•ˆ์— ๋“ค์–ด์žˆ๋˜ ๊ฐ’์ธ null์ด ๊ทธ๋Œ€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , null ๊ฐ์ฒด ์•ˆ์— ์žˆ์ง€๋„ ์•Š์€ getOS() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋‹ˆ ๋‹น์—ฐํžˆ NPE์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋œ ๊ฒƒ์ด๋‹ค.

 

๋ณดํ†ต ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ์ง„์˜์—์„œ๋Š” ?. ์—ฐ์‚ฐ์ž๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•œ๋‹ค. (์ฝ”ํ‹€๋ฆฐ๋„ ?: ์„ ์‚ฌ์šฉํ•œ๋‹ค)

// ๋งŒ์•ฝ p๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด getPhone() ์‹คํ–‰
// ๋งŒ์•ฝ getPhone() ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด null์ด ์•„๋‹๊ฒฝ์šฐ getOS() ์‹คํ–‰ ...
p?.getPhone()?.getOS()?.printOS();

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”(Java)์—์„œ๋Š” ์œ„์˜ ๋ฌผ์Œํ‘œ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ง์ ‘ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด ๋ณ€์ˆ˜๊ฐ€ null ์ธ์ง€ ์•„๋‹Œ์ง€ ์ง์ ‘ ์กฐ๊ฑด์„ ๋”ฐ์ ธ์„œ NPE ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค null ์ฒ˜๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์€ ์ž๋ฐ”7 ์—์„œ ๋ถ€ํ„ฐ ์–ธ๊ธ‰์ด ์žˆ์—ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ?. ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์ด ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž(elvis operator)๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์œผ๋‚˜ ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์Šน์ธ๋˜์ง€ ์•Š์•˜๋‹ค.

 

NPE ๊ฐ€๋“œํ•˜๋Š” ๊ณ ์ „์ ์ธ ๋ฐฉ๋ฒ•

Java8 ์ด์ „์—๋Š” ์ด๋ ‡๊ฒŒ NPE์˜ ์œ„ํ—˜์— ๋…ธ์ถœ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ ์ค‘์ฒฉ ์ฝ”๋”ฉ ์Šคํƒ€์ผ๋กœ ํšŒํ”ผํ•˜์˜€๋‹ค.

Person p = new Person("ํ™๊ธธ๋™");
// p.getPhone().getOS().printOS();

Phone ph = p.getPhone();
if (ph != null) {
    OS o = ph.getOS();
    if(o != null) {
        String n = o.printOS();
    }
}

์ง€๊ธˆ์ด์•ผ ๋ฉ”์„œ๋“œ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์•„ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ, ๋งŒ์ผ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„ ์ˆ˜๋ก ์ผ์ผํžˆ ๋”ฐ์ ธ์•ผ ํ•˜๋Š” if๋ฌธ ์—ญ์‹œ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€๋˜์–ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ์•ˆ์ข‹์•„ ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋„ ๊ฐ์ฒด ํŒจํ„ด(Null Object Pattern) ์ด๋ผ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ(oop)๋ฅผ ์‘์šฉํ•œ ํŒจํ„ด๋„ ์žˆ์ง€๋งŒ, ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ์˜คํžˆ๋ ค ๋” ๋ณต์žกํ•ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•๋„ ์ถ”์ฒœ๋˜์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

NPE ๊ฐ€๋“œํ•˜๋Š” ์ตœ์‹  ๋ฐฉ๋ฒ• (Optional ํด๋ž˜์Šค)

์ž๋ฐ”์˜ ํ˜์‹ ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šฐ๋Š” Java8์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ null์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ •์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” java.util.Optional ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. Optional ํด๋ž˜์Šค๋Š” '์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•ˆ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด', ์ฆ‰, 'null์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด'์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ผ์ข…์˜ ๋ž˜ํผ ํด๋ž˜์Šค ์ด๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ์— ๊นŒ๋‹ค๋กœ์šด null์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๊ทธ๋ฆ‡ ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Optional ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ NullPointerException ์˜ˆ์™ธ๋ฅผ ์ œ๊ณต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ„๋‹จํžˆ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

import java.util.Optional; // Optional ํด๋ž˜์Šค ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด import

class Person { ... }

class Phone { ... }

class OS { ... }

public class Main {
    public static void main(String[] args) {
        Person p = new Person("ํ™๊ธธ๋™");
        
        Optional.ofNullable(p)
                .map(Person::getPhone)
                .map(Phone::getOS)
                .map(OS::printOS);
    }
}

# ์ฐธ๊ณ  ์ž๋ฃŒ

https://gocoder.tistory.com/1856

https://madplay.github.io/post/what-is-null-in-java

https://www.daleseo.com/java8-optional-before/

https://programmerbay.com/how-to-make-an-object-eligible-for-garbage-collection-in-java/