Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] ๊ธฐ์ดˆ ๋ฌธ๋ฒ• - ์˜ต์…”๋„, ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ (feat. if let๊ณผ guard let ์ฐจ์ด์  ๊ฐ„๋‹จํžˆ)

๊ฐ์ž ๐Ÿฅ” 2022. 1. 16. 12:07
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž…๋‹ˆ๋‹ค! ์˜ค๋Š˜์€ ์˜ต์…”๋„๊ณผ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๊ณต๋ถ€ํ–ˆ๋˜ swift ๊ณต์‹๋ฌธ์„œ The BasicํŽธ์—๋„ ์ž ๊น ๋‚˜์™”์—ˆ๋Š”๋ฐ, ๊ธฐ์กด์— ์ œ๊ฐ€ ๊ณต๋ถ€ํ–ˆ๋˜ python ์–ธ์–ด์—์„œ๋Š” ์—†์—ˆ๋˜ ๊ฐœ๋…์ด๋ผ ์ƒ์†Œํ–ˆ๋Š”๋ฐ์š”, ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ์‹œ์ž‘~

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ 30๊ฐœ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” iOS์•ฑ๊ฐœ๋ฐœ with Swift ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr


์˜ต์…”๋„ (optional)

์„ ํƒ์ ์ธ, ์ด๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„ ํƒ€์ž…์ด๋‹ค. ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ๋ง์ธ๊ฐ€?

var name: String = "potato"

์œ„์™€ ๊ฐ™์ด name์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ์ง€๊ธˆ potato๋ผ๋Š” sring์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿผ ๊ฐ’์ด ์—†๋‹ค๋ฉด?

var name: String = ""

์ด๋ ‡๊ฒŒ ์ •์˜ํ•˜๋ฉด ๋˜์ง€ ์•Š๋Š”๊ฐ€? ํ•˜์ง€๋งŒ , ์œ„ ์ฝ”๋“œ๋ฅผ ์ง์—ญ(?)ํ•ด๋ณด๋ฉด ๊ฒฐ๊ตญ name์€ String ํ˜•ํƒœ์˜ "" ๋นˆ๋ฌธ์ž์—ด์„ ์–ด์จ‹๋“  ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

์ฝ”๋“œ์—์„œ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€, null๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทผ๋ฐ, ์—ฌ๊ธฐ์„œ ์ž ๊น! Swift๋Š” null๊ฐ’์ด ์•„๋‹ˆ๋ผ nil ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค :)  ์ฆ‰, ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋˜์–ด์•ผํ•œ๋‹ค!!

var name: String? = nil
๋ฐ˜์‘ํ˜•

 

์˜ต์…”๋„ ๋ณ€์ˆ˜์˜ ํ˜•ํƒœ ๋ฐ ํŠน์ง•

๊ทธ๋ ‡๋‹ค๊ณ  nil์ด๋ผ๋Š” ๊ฐ’์„ ์•„๋ฌด๋ฐ๋‚˜ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ ๋ณด์•˜๋“ฏ์ด nil ์ฒ˜๋Ÿผ ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ๋•Œ์—๋Š” ? ๋ฌผ์Œํ‘œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜ต์…”๋„ ๋ณ€์ˆ˜์—๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด nil ๊ฐ’์„ ๋””ํดํŠธ๋กœ ๊ฐ€์ง„๋‹ค.

์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๊ฐ’์ด null ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋ฉด, ๋Ÿฐํƒ€์ž„์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ swift์—์„œ๋Š” ์•ˆ์ •์„ฑ์ด ์žฅ์ ์ธ ์–ธ์–ด์ด๋ฏ€๋กœ, ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฏ€๋กœ์จ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜์žˆ๋‹ค.

var name: String?

๋˜ํ•œ ์˜ต์…”๋„ ๋ณ€์ˆ˜์—๋„ ๊ฐ’์ด ์žˆ๋Š” ๋ณ€์ˆ˜๋กœ ์ดˆ๊ธฐ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

var optionalValue: String? = "potato"

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์ดˆ๊ธฐ๊ฐ’์€ potato์ด์ง€๋งŒ, string์˜ต์…”๋„ ํƒ€์ž…์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์ถ”ํ›„ nil ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ฃผ์˜ํ• ์ ์ด ์žˆ๋‹ค. ์—„์—ฐํžˆ String? ๊ณผ Sring์€ ๋‹ค๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. (๋‹ค๋ฅธํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ)

var optionalValue: String? = "potato"
var newValue: String = optionalValue

// ERROR message : Value of optional type 'String?' must by unwrapped to a value of type 'String'.

/* ์˜ต์…”๋„ ๋ณ€์ˆ˜๋ฅผ wrapped๋ผ๊ณ  ํ•œ๋‹ค.
์™œ๋ƒํ•˜๋ฉด, ํ•ด๋‹น optionalValue๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด 
optional("potato")๋ผ๊ณ  ์ถœ๋ ฅ๋˜๋Š”๋ฐ, ์ด๋ฅผ optional๋กœ ํฌ์žฅ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. */

์œ„ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์™œ๋ƒ๋ฉด newValue๋Š” ์ผ๋ฐ˜ String๋ณ€์ˆ˜์ธ๋ฐ, ์—ฌ๊ธฐ์— ์˜ต์…”๋„ ๋ณ€์ˆ˜์ธ optionalValue๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ํฌ์žฅ๋˜์–ด์žˆ๋Š” ์˜ต์…”๋„ ๋ณ€์ˆ˜๋Š”, ์ผ๋ฐ˜ ํƒ€์ž… ๋ณ€์ˆ˜์™€ ๊ฒฐํ•ฉ๋„, ์—ฐ์‚ฐ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•˜๋‹ค. 

 

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ 

์˜ต์…”๋„์ด๋ผ๋Š” ํฌ์žฅ์ง€์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด์ž. ์˜ต์…”๋„ ํ•ด์ œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • ๋ช…์‹œ์  ํ•ด์ œ
    • ๊ฐ•์ œ ํ•ด์ œ
    • ๋น„๊ฐ•์ œ ํ•ด์ œ (์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ)
  • ๋ฌต์‹œ์  ํ•ด์ œ
    • ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ ์ž๋™ ํ•ด์ œ
    • ์˜ต์…”๋„์˜ ๋ฌต์‹œ์  ํ•ด์ œ

 

โ–ถ ๋ช…์‹œ์  ํ•ด์ œ

1) ๊ฐ•์ œ ํ•ด์ œ : ! (๋Š๋‚Œํ‘œ) ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•์ œ ํ•ด์ œ

์˜ต์…”๋„๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๋’ค์— ! ๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

var number: Int? = 3

print(number) // prints optional(3)
print(number!) // prints 3

!๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด, ์˜ต์…”๋„ ํฌ์žฅ์ง€๋ฅผ ๊ฐ•์ œ๋กœ ๋ฒ—๊ฒจ์„œ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค.  ๋งŒ์•ฝ ํ•ด๋‹น number๋ณ€์ˆ˜๊ฐ€ nil๊ฐ’์„ ๊ฐ€์ง„๋‹ค๋ฉด, nil์— ๋Š๋‚Œํ‘œ๋ฅผ ๋ถ™์ด๊ฒŒ ๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ์‹์€ ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ ๋น„๊ฐ•์ œํ•ด์ œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

2) ๋น„๊ฐ•์ œ ํ•ด์ œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ : if let / guard let

๊ฐ•์ œ ํ•ด์ œ๋ฐฉ์‹๋ณด๋‹ค ์•ˆ์ „ํ•œ ๋ฐฉ์‹์ด๋‹ค.

if let result = number {
	print(result)
} else {
	// number๊ฐ€ nil์ด๋ผ์„œ ๊ฐ’์ถ”์ถœ์— ์‹คํŒจํ•˜๋ฉด ์—ฌ๊ธฐ ์‹คํ–‰
}

// prints 3

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์€ if๋ฌธ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์‹๋Œ€์‹  ์˜ต์…”๋„ ํƒ€์ž…์˜ ๊ฐ’์„ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. if let ๋ง๊ณ  guard let๋„ ์กด์žฌํ•œ๋‹ค.

func test() {
	let number: Int? = 5
    guard let result = number else { return }
    print(result)
}

test()
// prints "5"

+ ๊ทธ๋Ÿผ, if let ๊ณผ guard let์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? ์–ธ์ œ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

if๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ต์…”๋„์ด ์ถ”์ถœ๋œ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ if ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ guard ๋ฌธ์„ ํ™œ์šฉํ•˜๋ฉด, guard๋ฌธ ๋‹ค์Œ ํ•จ์ˆ˜ ์ „์ฒด ๊ตฌ๋ฌธ์—์„œ ์˜ต์…”๋„์ด ์ถ”์ถœ๋œ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
(guard๋ฌธ์€ ์กฐ๊ฑด์ด ํŠธ๋ฃจ์ผ๋•Œ guard๋ฌธ์„ ํ†ต๊ณผ์‹œํ‚ค๊ณ  false์ด๋ฉด else๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•œ ๋’ค ํ๋ฆ„์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค. ์ž์„ธํžˆ ํด๋ฆญ)

 

โ–ถ ๋ฌต์‹œ์  ํ•ด์ œ

1) ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ ์ž๋™ํ•ด์ œ : ๋น„๊ต์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์‹œ ์˜ต์…”๋„ ์ž๋™ ํ•ด์ œ

์˜ต์…”๋„๊ฐ’์„ ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์˜ต์…”๋„์„ ํ•ด์ œ์‹œ์ผœ์ค€๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

let value: Int? = 6
if value == 6 {
	print("value๊ฐ€ 6์ž…๋‹ˆ๋‹ค.")
} else {
	print("value๊ฐ€ 6์ด ์•„๋‹™๋‹ˆ๋‹ค.")
}

// prints "value๊ฐ€ 6์ž…๋‹ˆ๋‹ค."

์ด๋ ‡๊ฒŒ, ์˜ต์…”๋„๊ฐ’์€ ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์˜ต์…”๋„์ด ํ•ด์ œ๋œ๋‹ค.

2) ์˜ต์…”๋„์˜ ๋ฌต์‹œ์  ํ•ด์ œ : ! (๋Š๋‚Œํ‘œ) ์‚ฌ์šฉํ•˜์—ฌ ๋ฌต์‹œ์  ์˜ต์…”๋„ ํƒ€์ž… ์ง€์ •

์ด๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋–„ ์ž๋™์œผ๋กœ ์˜ต์…”๋„์ด ํ•ด์ œ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

let string = "12"
var stringToInt: Int! = Int(string)
// ๊ธฐ์กด์— ๋ฐฐ์› ๋˜ ์˜ต์…”๋„์€ ? ์ด๋‹ค. ํ•˜์ง€๋งŒ !๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌต์‹œ์  ์˜ต์…”๋„ ํƒ€์ž…์ด ๋œ๋‹ค.
print(stringToInt + 1)

// prints "13"

 

 

์ด๋ ‡๊ฒŒ ํŒŒ์ด์ฌ์ด๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋งŒ ๋ฐฐ์› ๋˜ ์ €์—๊ฒŒ๋Š” ์กฐ๊ธˆ ์ƒ์†Œํ–ˆ๋˜ ๊ฐœ๋…์ธ ์˜ต์…”๋„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ตฌ์กฐ์ฒด์™€ ๊ด€๋ จํ•œ ๊ธฐ์ดˆ ๋ฌธ๋ฒ•์„ ํฌ์ŠคํŒ…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•