๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ/Swift

[Swift] Optional(์˜ต์…”๋„) ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

by yeniful 2021. 11. 1.

 

 

 

 

 

์Šค์œ„ํ”„ํŠธ์˜ ์ค‘์š”ํ•œ ํŠน์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” "์•ˆ์ „์„ฑ"์ด์ฃ .

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Optional ํƒ€์ž…์„ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

์Šค์œ„ํ”„ํŠธ๋ฅผ ์ฒ˜์Œ ๊ณต๋ถ€ํ–ˆ์„ ๋•Œ Optional ํƒ€์ž…์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด

"?๋‚˜ !๋ฅผ ๋ถ™์ด๋Š” ํƒ€์ž…. ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ํƒ€์ž…." ์ •๋„๋กœ ์•Œ์•„๋’€๋Š”๋ฐ

Enum(์—ด๊ฑฐํ˜•), Associated Value(์—ฐ๊ด€๊ฐ’), Generic(์ œ๋„ค๋ฆญ) ๊ฐœ๋…์„ ๊ฐ€์ ธ์™€์„œ

์˜ต์…”๋„์„ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ์•Œ์•„๋ณผ๊นŒ ํ•ด์š”.

 

 

 

 

 

Optional์˜ ๊ตฌ์กฐ - Enum ํƒ€์ž…

์˜ต์…”๋„ ํƒ€์ž…์€ ์Šค์œ„ํ”„ํŠธ์— ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅ๋œ ํƒ€์ž…์ธ๋ฐ, Enumํƒ€์ž…์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด์š”.

๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ธ some๊ณผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ธ none, 2๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ ,

์šฐ๋ฆฌ๋Š” Optional.none์˜ ์ผ€์ด์Šค๋กœ ๊ฐ’์ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ nil๊ฐ’์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์š”.

 

 

 

 

 

Case none - ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ (nil ๊ฐ’)

nil์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

nil์€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ "๊ฐ’์ด ์—†์Œ"์„ ์˜๋ฏธํ•ด์š”.

 

nil์„ ํƒ€์ž…์œผ๋กœ ํ˜ผ๋™ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, nil์€ ๊ฐ’(Value)์ž…๋‹ˆ๋‹ค!

(is~ ๋ผ๋Š” ์ด๋ฆ„์€ ๋ณดํ†ต True, False ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” Bool ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์  ์–‘ํ•ด๋ถ€ํƒ๋“œ๋ฆด๊ฒŒ์š”...)

 

๋งจ ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ isNilType์˜ ํƒ€์ž…์„ Nil๋กœ ์ฃผ์—ˆ์„ ๋•Œ Nil์ด๋ผ๋Š” ํƒ€์ž…์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

nil์ด ๊ฐ’์ธ ๊ฒƒ์„ ์•Œ์•˜์œผ๋‹ˆ, ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ isNilValue1์ด๋ผ๋Š” ๊ฐ’์— nil์„ ํ• ๋‹นํ–ˆ์–ด์š”.

๊ทธ๋Ÿฐ๋ฐ Int์™€ String๊ณผ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐ’๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฐ”๋กœ ํ• ๋‹น์ด ๋˜์ง€ ์•Š๊ณ  type์„ ์•Œ๋ ค๋‹ฌ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋„ค์š”.  

 

๊ทธ๋ž˜์„œ ์„ธ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” Optional ํƒ€์ž…์„ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ์ œ๋„ค๋ฆญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์š”๊ตฌํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋œจ๋„ค์š”!

ํ˜น์‹œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ผ๋‹จ ๋„˜์–ด๊ฐ€๊ณ  ๋’ท ๋ถ€๋ถ„์—์„œ ๋‹ค์‹œ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

๊ทธ ๋•Œ ๊นŒ์ง€ ์ œ๋„ค๋ฆญ์ด "ํƒ€์ž…๊ณผ ๊ด€๋ จ๋œ ๊ฐœ๋…"์ด๋ผ๊ณ ๋งŒ ๊ธฐ์–ตํ•ด๋‘๊ธฐ๋กœ ํ•ด์š” ใ…Žใ…Ž

 

๋„ค ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” ์ œ๋„ค๋ฆญ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ Optional<Any>๋ผ๋Š” ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ฃผ๊ณ  ๋‚œ ํ›„์—์•ผ nil์„ ํ• ๋‹นํ•ด์ฃผ์—ˆ์–ด์š”.

 

Optional<Any>์—์„œ Any๋กœ ๊ฐ•์ œ๋กœ ๋ฐ”๋€ ๊ฒƒ์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ, nil์ด ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ ์˜ต์…”๋„ ํ‘œํ˜„์ธ "?"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Any?๋กœ ๋ฐ”๊ฟ”์„œ ์“ธ ์ˆ˜ ์žˆ์ฃ .

 

 

์ฆ‰, ์˜ต์…”๋„ ํƒ€์ž…์€ Enum์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์˜ต์…”๋„ ํƒ€์ž…์— ํ• ๋‹น๋œ ๊ฐ’์ด ์—†์„ ๋•Œ(๊ฐ’์ด nil์ผ ๋•Œ)๋Š”

์˜ต์…”๋„์˜ .none ์ผ€์ด์Šค์ธ ๊ฒƒ์ด์ฃ . 

 

 

 

 

 

Case some - ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์—ฐ๊ด€๊ฐ’)

 

์•ž์—์„œ๋Š” ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ–ˆ์œผ๋‹ˆ, ์ด๋ฒˆ์—๋Š” ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

์„ธ ๊ฐ€์ง€ Optional ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ดค์–ด์š”.

 

์ฒซ ๋ฒˆ์งธ ์˜ต์…”๋„์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ Int ํƒ€์ž…์ด๋ผ๋Š” Optional,

๋‘ ๋ฒˆ์งธ ์˜ต์…”๋„์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ String ํƒ€์ž…์ด๋ผ๋Š” Optional,

์„ธ ๋ฒˆ์งธ๋Š” ์˜ต์…”๋„ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ์–ด๋–ค ํƒ€์ž…์ด๋“  ์ƒ๊ด€ ์—†๋‹ค๋Š” Optional (์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Optional) ์ž…๋‹ˆ๋‹ค.

 

์˜ต์…”๋„ case some ์˜†์— ๊ด„ํ˜ธ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ํƒ€์ž…์ธ์ง€๋ฅผ ๋ช…์‹œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

case ์˜†์˜ ๊ด„ํ˜ธ๋ฅผ ์—ฐ๊ด€๊ฐ’(Associated Value)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ,

์—ฐ๊ด€๊ฐ’์€ enumํƒ€์ž…์—์„œ ํ•ด๋‹น ์ผ€์ด์Šค๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

case some์—์„œ ์–ด๋–ค ๊ฐ’์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ด€๊ฐ’์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๊ณ ,

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์–ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์™€์•ผ ํ•˜๋Š”์ง€ ํƒ€์ž…๋งŒ ๋ช…์‹œํ•ด์ค€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ด€ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

 

 

์œ„์—์„œ ์„ ์–ธํ–ˆ๋˜ ๊ฐ ์˜ต์…”๋„ ํƒ€์ž…๋“ค์„ ์ด์šฉํ•ด์„œ 4๊ฐœ์˜ ๊ฐ’์„ ๋งŒ๋“ค์–ด๋ดค์–ด์š”.

์ •์ˆ˜ ๊ฐ’์ด ์žˆ๋Š” Int ์˜ต์…”๋„, ๋ฌธ์ž์—ด ๊ฐ’์ด ์žˆ๋Š” String ์˜ต์…”๋„, double ๊ฐ’์ด ์žˆ๋Š” ์ผ๋ฐ˜ Optional(Any ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฐ’์ด ์˜ค๋“  ์ƒ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ Optional์—์„œ nil ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ(๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ)์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

 

๊ฐ ๋„ค ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณ€์ˆ˜์˜ ๊ฐ’๊ณผ ํƒ€์ž…์„ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

nilValue๋ฅผ ์ œ์™ธํ•˜๊ณ  some(๊ฐ’)ํ˜•ํƒœ๋กœ ๋‚˜์™€์žˆ๋Š”๊ฒŒ ๋ณด์ด์‹œ์ฃ ?

์ฆ‰, ๊ฐ’์ด ์žˆ์Œ๊ณผ ๋™์‹œ์— ์—ฐ๊ด€๊ฐ’์„ ์ด์šฉํ•ด์„œ ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

type(of:)๋ฅผ ํ†ตํ•ด ๊ฐ ๋ณ€์ˆ˜๋“ค์˜ ํƒ€์ž…์„ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ์—๋Š” ๊ฐ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋‚˜์˜ค๋„ค์š”.

๊ทธ๋Ÿฐ๋ฐ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? ์™œ Int, String๊ณผ ๊ฐ™์€ ํƒ€์ž…์ด ์•„๋‹Œ๊ฑธ๊นŒ์š”? 

 

 

 

Generic(์ œ๋„ค๋ฆญ)

๋Œ“๊ธ€