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"

 

 

μ΄λ ‡κ²Œ νŒŒμ΄μ¬μ΄λ‚˜ λ‹€λ₯Έ μ–Έμ–΄λ§Œ λ°°μ› λ˜ μ €μ—κ²ŒλŠ” 쑰금 μƒμ†Œν–ˆλ˜ κ°œλ…μΈ μ˜΅μ…”λ„μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ ꡬ쑰체와 κ΄€λ ¨ν•œ 기초 문법을 ν¬μŠ€νŒ…ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

λ°˜μ‘ν˜•