๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Dev Blog
iOS/UIKit

[UIKit] Dicee ์•ฑ ๋งŒ๋“ค๊ธฐ

by ์œ ์ง„์˜ 2023. 5. 11.
iOS & Swift - The Complete iOS App Development Bootcamp ์— ๋Œ€ํ•œ TIL ์ž…๋‹ˆ๋‹ค.

 

ํ•™์Šต ์ฃผ์ œ

@IBOutlet, @IBAction์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์™€ ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šด๋‹ค.

 

@IBOutlet

@IBOutlet์€ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์˜ UI ์š”์†Œ๋ฅผ Xcode์˜ ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด UI ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฝ”๋“œ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์š”์†Œ์˜ ์†์„ฑ์„ ์ธ์ŠคํŽ™ํ„ฐ๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ฏธ๊ตญ์—์„œ๋Š” ์ฝ˜์„ผํŠธ๋ฅผ ์ฝ˜์„ผํŠธ๋ผ ํ•˜์ง€ ์•Š๊ณ  Outlet์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, IBOutlet์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ˜์„ผํŠธ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ฝ”๋“œ์™€ ์—ฐ๊ฒฐ์‹œํ‚ฌ UI ์š”์†Œ๋ฅผ control ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์ƒํƒœ๋กœ Assistant ์˜์—ญ์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์œ„ ํ™”๋ฉด๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋œจ๋Š”๋ฐ Name ๋ถ€๋ถ„์— ํ•ด๋‹น UI ์š”์†Œ์˜ ์ฝ”๋“œ ๋ณ€์ˆ˜๋ช…์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

@IBOutlet

@๋Š” Swift์—์„œ ํŠน์„ฑ(Attribute, ์†์„ฑ์œผ๋กœ๋„ ๋ฒˆ์—ญ์ด ๋˜๋Š”๋ฐ Property์™€ ๊ฒน์น˜๋ฏ€๋กœ ํŠน์„ฑ์ด๋ผ๊ณ  ํ•˜๊ฒ ์Œ)๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ „ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค. Swift์˜ ์†์„ฑ์—๋Š” ์„ ์–ธ ํŠน์„ฑ๊ณผ ํƒ€์ž… ํŠน์„ฑ์ด ์žˆ๋‹ค. ๋‘ ํŠน์„ฑ ๋ชจ๋‘ ์„ ์–ธ์„ ํ•  ๋•Œ ํ˜น์€ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํŠน์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ผ์ข…์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์—ญํ• ์„ ํ•œ๋‹ค.

 

@IBOutlet ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” diceImageViewOne ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์™€ ์—ฐ๊ฒฐ๋œ ํ”„๋กœํผํ‹ฐ๋ผ๋Š” ํŠน์„ฑ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ž„์œผ๋กœ ์„ ์–ธ ํŠน์„ฑ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

weak

Swift์—์„œ weak๊ณผ strong์€ Class์™€ ๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ธ ARC(Automatic Reference Count)์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” strong ์ฐธ์กฐ์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์ฐธ๊ณ ๋กœ Swift์—์„œ๋Š” ๊ธฐ๋ณธ์ด ๊ฐ•ํ•œ ์ฐธ์กฐ์ด๋ฏ€๋กœ ์•„๋ฌด๋Ÿฐ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ๋œ๋‹ค.

 

class Person {
    let name: String
    
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    
    deinit {
        print("\(name) is being deinitialized")
    }
}

var person1: Person?
var person2: Person?
var person3: Person?

person1 = Person(name: "Alice") // ๊ฐ•ํ•œ ์ฐธ์กฐ -> RC: 1
person2 = person1 // ๊ฐ•ํ•œ ์ฐธ์กฐ -> RC: 2
person3 = person1 // ๊ฐ•ํ•œ ์ฐธ์กฐ -> RC: 3

person1 = nil // RC: 2
person2 = nil // RC: 1
person3 = nil // RC: 0 -> ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œ

 

๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ RC(Referece Count)๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. RC๊ฐ€ 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ํž™ ์˜์—ญ์—์„œ ํ• ๋‹น ํ•ด์ œ๊ฐ€ ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐธ์กฐ ํƒ€์ž…์€ ํž™ ์˜์—ญ, ๊ฐ’ ํƒ€์ž…์€ ์Šคํƒ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.

 

๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ์ด ๋ถ€๋ถ„๊นŒ์ง€ ์„ค๋ช…ํ•˜๋ฉด ๊ธ€์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋‹ˆ ์ฐธ๊ณ  ๋งํฌ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

 

[Swift] ARC-Strong Reference Cycle(๊ฐ•ํ•œ์ฐธ์กฐ์‚ฌ์ดํด; ์ˆœํ™˜์ฐธ์กฐ)

์ €๋ฒˆ ARC ๊ธฐ๋ณธ ๋™์ž‘์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ฐ์ฒด๋“ค์˜ ์‚ฌ์šฉ์ด ๋๋‚ฌ์Œ์—๋„ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ด๋ค„์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์–˜๊ธฐํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋ช‡๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•๋„

velog.io

 

๋‹ค์Œ์€ weak ์ฐธ์กฐ์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด weak ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค. weak ์ฐธ์กฐ๋Š” RC ๊ฐ’์„ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š” ์ฐธ์กฐ ๋ฐฉ์‹์ด๋‹ค.

 

class Person {
    let name: String
    
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    
    deinit {
        print("\(name) is being deinitialized")
    }
}

var person1: Person?
weak var person2: Person?
weak var person3: Person?

person1 = Person(name: "Alice") // ๊ฐ•ํ•œ ์ฐธ์กฐ -> RC: 1
person2 = person1 // ์•ฝํ•œ ์ฐธ์กฐ -> RC: 1
person3 = person1 // ์•ฝํ•œ ์ฐธ์กฐ -> RC: 1

person1 = nil // RC: 0 -> ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œ
print(person2) // nil
print(person3) // nil

 

์ด๋ ‡๊ฒŒ weak๊ณผ strong ์ฐธ์กฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค๋Š”๋ฐ ๊ณผ์—ฐ IBOutlet๊ณผ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ์„๊นŒ? ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒจ ๋”ฐ๋กœ ๊ณต๋ถ€ํ•ด ๋ดค๋‹ค.

 

๋‹ค์Œ์€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ(UIView) ๊ทธ๋ฆฌ๊ณ  ๋ทฐ ์œ„์— ์˜ฌ๋ผ์˜ค๋Š” UI ์š”์†Œ๋“ค(๋ทฐ ๊ฐ์ฒด) ๊ฐ„์˜ ์ฐธ์กฐ ๊ตฌ์กฐ์ด๋‹ค.

 

 

์šฐ์„ , ๋ทฐ ์œ„์— UI ์š”์†Œ๋“ค์ด ์˜ฌ๋ผ์™€์„œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ด์•„์žˆ๋Š” ํ•œ ๋ทฐ๋Š” ์—†์–ด์ง€๋ฉด(RC ๊ฐ’์ด 0) ์•ˆ๋˜๋ฏ€๋กœ ๋ชจ๋“  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ทฐ์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ทฐ๋„ ์ž์‹ ์˜ ํ•˜์œ„ UI ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

 

์ด๋•Œ, IBOutlet์œผ๋กœ UI ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ strong ์ฐธ์กฐ์ด๋ƒ weak ์ฐธ์กฐ์ด๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ RC ๊ฐ’์ด ํ˜•์„ฑ๋œ๋‹ค.

IBOutlet ๊ฐ•ํ•œ ์ฐธ์กฐ

 

  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> ๋ทฐ์˜ RC: 1
  • ๋ทฐ๋Š” UI ์š”์†Œ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> UI ์š”์†Œ์˜ RC: 1
  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ UI ์š”์†Œ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> UI ์š”์†Œ์˜ RC: 2

 

IBOutlet ์•ฝํ•œ ์ฐธ์กฐ

 

  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> ๋ทฐ์˜ RC: 1
  • ๋ทฐ๋Š” UI ์š”์†Œ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> UI ์š”์†Œ์˜ RC: 1
  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ UI ์š”์†Œ๋ฅผ ์•ฝํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค -> UI ์š”์†Œ์˜ RC: 1(๋ณ€๋™ ์—†์Œ)

 

์•„๊นŒ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋‹ค์Œ์€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ์˜ RC ๊ฐ’์ด๋‹ค.

 

  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด์„œ ๋ทฐ์™€ UI ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์žƒ๋Š”๋‹ค -> ๋ทฐ์˜ RC: 0, UI ์š”์†Œ์˜ RC: 1(1 ๊ฐ์†Œ)
  • ๋ทฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด์„œ UI ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์žƒ๋Š”๋‹ค -> UI ์š”์†Œ์˜ RC: 0 (๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ)

 

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ผ์–ด๋‚ ๊นŒ? ๊ทธ๋ฆฌ๊ณ  strong ์ฐธ์กฐ์™€ weak ์ฐธ์กฐ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ํŒ๋‹จ ๊ธฐ์ค€์ด ๋ฌด์—‡์ผ๊นŒ? ํ•ด๋‹น ๋‚ด์šฉ๋„ ์ผ์ผ์ด ๋‹ค ์„ค๋ช…ํ•˜๋ฉด ๊ธ€์ด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„ ์ฐธ๊ณ  ๋งํฌ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

 

 

iOS) IBOutlet์—ฐ๊ฒฐ Strong VS Weak

์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์ž‘์—…ํ•œ UI๊ฐ์ฒด๋ฅผ ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” IBOutlet ๋˜๋Š” IBAction์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. IB๋Š” Interface Builder์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ control + ๋“œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์—

co-dong.tistory.com

 

์ด ๋ชจ๋“  ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด ๋ณด์•˜์„ ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰์Œ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ  ์‹ถ๋‹ค๋ฉด weak ์ฐธ์กฐ๋ฅผ, ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ด์•„์žˆ๋Š” ํ•œ UI ์š”์†Œ๋“ค์ด ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋„๋ก ๋ณด์žฅํ•จ์œผ๋กœ์จ ์˜๋„์น˜ ์•Š์€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด strong ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

UIImageView!

@IBOutlet ํ”„๋กœํผํ‹ฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ธ๋ฐ ์–ด๋–ค UI ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋˜์—ˆ๋ƒ์— ๋”ฐ๋ผ ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋œ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ ์—ฐ๊ฒฐ๋œ UI ์š”์†Œ๋Š” UIImageView์ด๋ฏ€๋กœ ํƒ€์ž…์ด UIImageView๋กœ ์„ค์ •๋˜์—ˆ๋Š”๋ฐ ์ด๋•Œ, ์•”์‹œ์  ์–ธ๋ž˜ํ•‘ ์˜ต์…”๋„(IUO: Implicitly Unwrapped Optional)์ด ์ž๋™์œผ๋กœ ๋ถ™๋Š”๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒจ ๋”ฐ๋กœ ๊ณต๋ถ€ํ•ด ๋ดค๋‹ค.

 

์™œ ํ•˜ํ•„ ์˜ต์…”๋„ ํƒ€์ž…?

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

 

์™œ ํ•˜ํ•„ IUO๋กœ ์ž๋™ ์„ ์–ธ?

์ด ๋ถ€๋ถ„์€ ์˜ต์…”๋„๊ณผ IUO์˜ ์‚ฌ์šฉ ํŒ๋‹จ ๊ธฐ์ค€์— ๋Œ€ํ•œ ๊ฒƒ๊ณผ ์—ฐ๊ด€์ด ์žˆ๋‹ค. ์–ธ์ œ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๊ณ , ์–ธ์ œ IUO์„ ์‚ฌ์šฉํ• ๊นŒ? ๋ณดํ†ต Swift ๋ฌธ๋ฒ•์„ ๋ฐฐ์šธ ๋•Œ IUO๋Š” ์œ„ํ—˜ํ•˜๋‹ˆ ๋˜๋„๋ก์ด๋ฉด ์•ˆ์ „์„ฑ์ด ๋†’์€ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋งŽ์ด ๋“ค์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ์—๋„ IUO ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ช…ํ™•์„ฑ(Clarity)๊ณผ ํŽธ์˜์„ฑ(Convenience) ๋•Œ๋ฌธ์ด๋‹ค. IUO ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด๋‚˜ ์˜ต์…”๋„ ํŒจํ„ด ๊ฐ™์ด ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ’์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ  ํŽธ๋ฆฌํ•˜๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๊ฐ„๋‹จํ•œ IUO์˜ ํŠน์ง•์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

let a: Int!
print(a) // ๋”ฐ๋กœ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์œผ๋ฉด nil

let b: Int! = 1

let c: Int = b // Optional๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์–ธ๋ž˜ํ•‘๋œ๋‹ค.

let d: Int = b! // ์œ„ ๊ฒฐ๊ณผ์™€ ๊ฐ™๋‹ค.

let e = b // ํƒ€์ž…์„ ๋”ฐ๋กœ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด Optional ํƒ€์ž…์ด๋‹ค.

let f = b + 1 // ์ž๋™์œผ๋กœ ์–ธ๋ž˜ํ•‘๋˜์–ด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
print(f) // 2

let g: Int? = nil
print(a!) // nil ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘์€ ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฏ€๋กœ ์ฃผ์˜!!!!!!

 

์œ„ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜ c์™€ f๋ฅผ ์ฃผ๋ชฉํ•ด์„œ ๋ณด์ž. ์˜ต์…”๋„ ํƒ€์ž… ๋ณ€์ˆ˜์™€๋Š” ๋‹ค๋ฅด๊ฒŒ IUO ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ์ž๋™์œผ๋กœ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘๋˜์–ด ์›์‹œ ํƒ€์ž… ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ํ–‰๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŽธ๋ฆฌํ•˜๋‹ค.

 

์ด๋ฒˆ์—” ๋ณ€์ˆ˜ a์™€ g์— ์ฃผ๋ชฉํ•ด ๋ณด์ž. ๋จผ์ €, ๋ณ€์ˆ˜ a์—์„œ ๋ณด๋“ฏ IUO ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด nil ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋‹ค์Œ, ๋ณ€์ˆ˜ g์—์„œ ๋ณด๋“ฏ nil ๊ฐ’์„ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์— ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ํŠน์ง•์„ ๊ธฐ์–ตํ•˜๊ณ  ์•„๋ž˜ ๊ธ€์„ ์ฝ์–ด๋ณด์ž.

 

์ด๋ ‡๊ฒŒ ํŽธ๋ฆฌํ•œ IUO ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ์œ„ํ—˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class Person {
    var age: Int!
}

let p: Person = Person()
print(p.age + 1)

 

์œ„ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์•„์ง IUO ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์›์‹œ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๊ฒŒ ํ–ˆ๋‹ค. ๋ณ€์ˆ˜ a, g์—์„œ์˜ ํŠน์ง•์„ ๊ธฐ์–ตํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ถ„๋ช… ์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์˜ IBOutlet ํ”„๋กœํผํ‹ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„์ง ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ viewDidLoad() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถˆ๋ฆฌ์ง€ ์•Š๋Š” ์‹œ์ ์—์„œ IBOutlet ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. ์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๊ณ ์น˜๋ฉด ๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ์‹ค์ œ ์„œ๋น„์Šค ์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฏ€๋กœ ๊ต‰์žฅํžˆ ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ, IUO ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ด ์ ์„ ํ•ญ์ƒ ์ƒ๊ฐํ•˜๋ฉด์„œ ๊ทธ์— ๋Œ€ํ•œ ๋Œ€์‘ ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜๊ฒŒ IUO ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์˜ต์…”๋„ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด๋‚˜ ์˜ต์…”๋„ ํŒจํ„ด ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ๋ช…ํ™•์„ฑ๊ณผ ํŽธ๋ฆฌ์„ฑ์„ ๋ฒ„๋ฆฌ๊ณ  ์•ˆ์ „์„ฑ์„ ํƒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋œ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹์€ ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

diceImageViewOne?.image๋Š” diceImageViewOne์˜ ๊ฐ’์ด nil์ด ์•„๋‹ ๋•Œ image ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ ์–ด๋„ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค.

'iOS > UIKit' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[UIKit] I Am Rich ์•ฑ ๋งŒ๋“ค๊ธฐ  (0) 2023.05.09

๋Œ“๊ธ€