Swift

0. ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜

1.๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ์ดํ›„์—๋„ ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์ˆ˜๋Š” ์„ ์–ธ ์ดํ›„์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

  2. Swift์—์„œ ๋ณ€์ˆ˜๋Š” var ์ƒ์ˆ˜๋Š” let์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค

  3. var๋Š” ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, let์€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค

1+. ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋Š”๊ฒŒ ์ •ํ™•ํžˆ ์–ด๋–ค ์˜๋ฏธ์ธ๊ฐ€์š”?

class Some {
    var num : Int
    
    init(num: Int) {
        self.num = num
    }
}

let a = Some(num: 10)
let b = Some(num: 20)
var c = Some(num: 30)

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๋•Œ ์ƒ์ˆ˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

a = b
a = c
b = a
b = c

class๋Š” ์ฐธ์กฐํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜์—๋Š” ์ฃผ์†Œ๊ฐ’(==ํฌ์ธํ„ฐ)์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ƒ์ˆ˜๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์ฃผ์†Œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค

์•„๋ž˜์™€ ๊ฐ™์€ ํ–‰์œ„๋Š” ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

a.num = b.num
b.num = c.num

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ํ–‰์œ„๋Š” c๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” a๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค

c = a

2: ํƒ€์ž…์ถ”๋ก ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜๋Š” ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํƒ€์ž…์„ ์ƒ๋žตํ•˜๋Š”๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์ถ”๋ก  ๊ณผ์ •์„ ๊ฑฐ์ณ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค

  3. ํƒ€์ž…์„ ์ƒ๋žตํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž…์ถ”๋ก  ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ปดํŒŒ์ผ์— ๋” ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

1. Class / Struct

1. Class ์™€ Struct์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  • struct๋Š” value type์ด๊ณ  class๋Š” reference type์ž…๋‹ˆ๋‹ค

  • ๊ทธ๋ž˜์„œ class๋Š” ARC๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค

  • class๋Š” ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ struct๋Š” ์ƒ์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

2. Class์™€ Struct์˜ ๊ณตํ†ต์ ์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  • ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ •์˜ํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋  ๋•Œ์˜ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • extension์„ ํ†ตํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ฐ’ํƒ€์ž…๊ณผ ์ฐธ์กฐํƒ€์ž…์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” '๋ฌด์—‡์ด ์ „๋‹ฌ๋˜๋А๋ƒ' ์ž…๋‹ˆ๋‹ค.
(๐Ÿ’ก ์ „๋‹ฌ : ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ)
๊ฐ’ํƒ€์ž…์„ ์ „๋‹ฌํ•  ๋•Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋‹ฌ์ธ์ž๋ฅผ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด ๋ณต์‚ฌ ๋ฉ๋‹ˆ๋‹ค.
์ฐธ์กฐํƒ€์ž…์„ ์ „๋‹ฌํ•  ๋•Œ์—๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(์ฃผ์†Œ)๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

2+. ์–ธ์ œ class๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์–ธ์ œ struct๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

Apple ๊ฐ€์ด๋“œ๋ผ์ธ์—์„œ ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค

  • ์—ฐ๊ด€๋œ ๊ฐ„๋‹จํ•œ ๊ฐ’์˜ ์ง‘ํ•ฉ์„ ์บก์Аํ™”ํ•˜๋Š” ๋ชฉ์ ์ผ ๋•Œ

  • ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ’ ํƒ€์ž…์ด๊ณ  ์ฐธ์กฐ๋ณด๋‹ค ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•  ๋•Œ

  • ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ

์ฆ‰, ์ƒ์† ๊ด€๊ณ„๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๊ณ„์† ๊ฐ€๊ณต๋˜๋Š”๊ฒฝ์šฐ์—๋Š” class๊ฐ€ ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค

3. Swift์˜ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. swift๋Š” COW๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’ํƒ€์ž…์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค

  2. COW๋Š” ์›๋ณธ๊ณผ ๋ณต์‚ฌ๋ณธ ์ค‘ ์ˆ˜์ •๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋‹ค๊ฐ€, ๋‘˜ ์ค‘ ํ•˜๋‚˜์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค

  3. ๊ทธ๋ž˜์„œ COW๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์—์„œ ๋ณต์‚ฌ ํ›„ ์ฒซ๋ฒˆ์งธ ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” COW์— ์˜ํ•ด ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค

  4. ๋ชจ๋“  value type์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ collection type์„ ๋ณต์‚ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3+. ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ COW๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ์š”?

swift์˜ COW๋Š” ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„ ์ค‘์— ๊ณต๊ฐ„์˜ ํšจ์œจ์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๊ฐ’์˜ ๋ณต์‚ฌ๋งŒ ์ผ์–ด๋‚˜๊ณ  ์ˆ˜์ •์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ฅผ ์ค„์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ์†Œ์Šค ๊ณต์œ 
COW์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ์™€ class์˜ ์ฐธ์กฐ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฒฝํ–ฅ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค
class ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— '๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๊ฐ’'์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
COW์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ๋Š” ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
์˜ˆ๋ฅผ๋“ค์–ด b๊ฐ€ a๋ฅผ ๋ณต์‚ฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” b๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ์•Š๊ณ  a์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
๋‹ค์‹œ ๋งํ•˜๋ฉด,
class์˜ a์™€ b๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ๋˜์ง€๋งŒ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ๊ฐ™์€ '์ฃผ์†Œ๊ฐ’'์ด ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค
collection type์˜ a์™€ b๋Š” ์„œ๋กœ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์€ '๋ฐ์ดํ„ฐ'์ž…๋‹ˆ๋‹ค
๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด b๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ  ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ ํ›„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค
(์ฐธ๊ณ  : https://nsios.tistory.com/56)

๐Ÿ“Œ collection type
Array, Set, Dictionary

Copy On Write๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค. Comment

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ณต์‚ฌ ๋™์ž‘์„ ํ•  ๋•Œ, ์‹ค์ œ ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์ด ์ˆ˜์ •๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ–ˆ๋‹ค๊ฐ€, ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ, ๊ทธ๋•Œ ๋ณต์‚ฌ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ณต์‚ฌ๋Š” ํ–ˆ์œผ๋‚˜, ์ˆ˜์ •์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

4. class์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  • final

    • ์ƒ์†๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์— final์„ ๋ถ™์ด๋ฉด ๋ฉ”์†Œ๋“œ๊ฐ€ Static Dispatch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ ๋ฉ๋‹ˆ๋‹ค

    • ํด๋ž˜์Šค๋Š” ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด Dynamic Dispatch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

    • ํ•˜์ง€๋งŒ final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ํด๋ž˜์Šค์˜ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฉ”์†Œ๋“œ์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋„ ๋ถˆ๊ฐ€๋Šฅํ•ด์ ธ Static Dispatch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

    • Dynamic Dispatch๋Š” ๋Ÿฐํƒ€์ž„์‹œ ์‹คํ–‰ํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , Static Dispatch๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

    • ๋˜ํ•œ private ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ํ˜„์žฌ ํŒŒ์ผ๋กœ ์ œํ•œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž๋™์ ์œผ๋กœ private ํ‚ค์›Œ๋“œ๊ฐ€ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ ํŒ๋‹จ ๊ฐ€๋Šฅํ•˜๋‹ค. Comment

      ์‰ฝ๊ฒŒ ๋งํ•ด privateํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋Š” final ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋”๋ผ๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋ฉด, ์ž๋™์ ์œผ๋กœ static dispatch๋กœ ๋™์ž‘ํ•œ๋‹ค.

๐Ÿ“Œ Dynamic Dispatch
- class๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค ์ค‘ ์–ด๋””๋ฅผ ์ฐธ์กฐํ•ด์•ผํ• ์ง€๋ฅผ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค
- ๋Ÿฐํƒ€์ž„ ๊ณผ์ •์—์„œ vTable์—์„œ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ '์ฝ๊ณ ' ๊ทธ ์ฃผ์†Œ๋กœ '์ ํ”„' ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์†ํ•ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค
๐Ÿ“Œ vTable
- ์ •์˜ : ๋””์ŠคํŒจ์น˜๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜
- ํด๋ž˜์Šค ๋งˆ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ€์ƒํ…Œ์ด๋ธ”์„ ๋งํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ๋“ค์˜ ํฌ์ธํ„ฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
- ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ vTable ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์ง€๊ณ , ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค

5. Dispatch๊ฐ€ ๋ญ”๋ฐ์š”?

Dispatch๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ, ๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. Static, Dynamic ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค

Static Dispatch๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. Dynamic Dispatch๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’ํƒ€์ž…์€ Static Dispatch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ฐธ์กฐํƒ€์ž…์—์„œ ์–ด๋–ค Dispatch๋ฅผ ์„ ํƒํ•˜๋Š”์ง€๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ฐ€๋Šฅ์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด Static Dispatch๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ ์ž…๋‹ˆ๋‹ค

WMO

  • Whole Module Optimization์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • WMO๋Š” ๋ชจ๋“ˆ ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ internal level์— ๋Œ€ํ•ด์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€์ ์œผ๋กœ final์„ ๋ถ™์—ฌ์„œ ์ปดํŒŒ์ผ ํ•ฉ๋‹ˆ๋‹ค

  • ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ ์ƒ์†๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด Dynamic Dispatch์˜ ์‚ฌ์šฉ์„ ์ค„์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๐Ÿค” WMO์•ˆํ•˜๋ฉด ์™œ ์ž๋™์œผ๋กœ final์„ ๋ชป๋ถ™์—ฌ์ฃผ๋Š”๊ฑธ๊นŒ?
- ๊ธฐ๋ณธ์ ์œผ๋กœ swift๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜์”ฉ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ๋Š”์ง€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ ์ˆ˜ ์—†์–ด์„œ final์„ ๋ถ™์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

6. swift์˜ ํƒ€์ž…์บ์ŠคํŒ…์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  1. swift์˜ ํƒ€์ž…์บ์ŠคํŒ…์€ ํƒ€์ž…์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ์ „ํ™˜ํ•˜์—ฌ ๋‹ค๋ฅธ ํƒ€์ž…์ฒ˜๋Ÿผ ํ–‰์„ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

  2. ์—…์บ์ŠคํŒ…์€ ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋‹ค์šด์บ์ŠคํŒ…์€ ์ƒ์œ„ํด๋ž˜์Šค๊ฐ€ ํ•˜์œ„ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

  3. ์—…์บ์ŠคํŒ…์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ as๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

  4. ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ as? ๋˜๋Š” as! ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋Ÿฐํƒ€์ž„์— ์บ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค

  5. as?๋Š” ์˜ต์…”๋„์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. as!๋Š” ์˜ต์…”๋„์ด ๊ฐ•์ œ ์ถ”์ถœ๋˜๋ฏ€๋กœ ๋‹ค์šด์บ์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

6+. ์บ์ŠคํŒ…ํ•˜๋ฉด ํƒ€์ž…์ด ๋ฐ”๋€Œ์ง€ ์•Š๋‚˜์š”?

  1. ์˜ˆ๋ฅผ๋“ค์–ด class Person {}, class Student: Person {}๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

  2. let student = Student() as Persen์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—…์บ์ŠคํŒ…๋˜์–ด Student์—์„œ ์ƒˆ๋กœ ๋งŒ๋“  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

  3. ํ•˜์ง€๋งŒ type(of: student)๋Š” ์—ฌ์ „ํžˆ Student์ž…๋‹ˆ๋‹ค. ์ฆ‰, type์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฒ”์œ„๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

2. ์ ‘๊ทผ์ œ์–ด์ž

1. ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—” ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  1. ์ ‘๊ทผ์ œ์–ด๋Š” ์ ‘๊ทผ์ˆ˜์ค€ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ์ˆ˜์ค€ ํ‚ค์›Œ๋“œ๋Š” open, public, internal, fileprivate, private ๋‹ค์„ฏ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ‚ค์›Œ๋“œ ์ค‘์—์„œ open์€ ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์ ‘๊ทผ ์ˆ˜์ค€์—๋Š” ๊ทœ์น™์ด ์žˆ๋Š”๋ฐ ์ƒ์œ„์š”์†Œ๋ณด๋‹ค ํ•˜์œ„์š”์†Œ๊ฐ€ ๋” ๋†’์€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. open๊ณผ public ํ‚ค์›Œ๋“œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

  1. open๊ณผ public์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ๊นŒ์ง€ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

  2. open์€ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ƒ์†ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค ๋ฉค๋ฒ„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. public์€ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋Š” ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

3. fileprivate๊ณผ private ํ‚ค์›Œ๋“œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

fileprivate์€ ๊ทธ ์š”์†Œ๊ฐ€ ๊ตฌํ˜„๋œ ์†Œ์ŠคํŒŒ์ผ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, private์€ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class๋‚˜ struct๋ฅผ private์œผ๋กœ ๋งŒ๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

private class A {
    func someFunction(){
        print("This is function")
    }
}

private let a = A()
a.someFunction()

์ถ”์ธกํ•˜๊ฑด๋ฐ ๊ตฌํ˜„์ฒด ์ž์ฒด์— private์„ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ตฌํ˜„์ฒด์˜ ์ƒ์œ„์ธ 'ํŒŒ์ผ'์„ ๊ตฌํ˜„์ฒด๋กœ ์ธ์‹ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋™์ผํ•œ ํŒŒ์ผ ๋‚ด์—์„œ๋Š” A ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, fileprivate ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๊ทผ๊ฑฐ๋กœ ์ƒ์œ„ ์ ‘๊ทผ ์ˆ˜์ค€์ธ fileprivate ํด๋ž˜์Šค๋‚ด์— private ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fileprivate let a = A()
a.someFunction()

3. ์ด๋‹ˆ์…œ๋ผ์ด์ €

1 : Convenience init์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  • ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค

  • ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๊ผญ!!! ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค -> self.init()

์ •๋ง ํŽธ์˜์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๊ผญ!!! ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ• ๊นŒ์š”?

ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์˜ init์ด ๋‹ค๋ฅธ ํŽธ์˜ init์„ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ์ตœ์ข…์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๊ผญ! ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๋ก ์ ์œผ๋กœ ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋งˆ์ง€๋ง‰์— ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ € ๊ผญ ์จ์•ผ ํ•˜๋‚˜์š”?

์•„๋‹ˆ์š”! ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค

์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” self.init์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

์–ด๋–ค ํด๋ž˜์Šค์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์žˆ์„๋•Œ

var a : Int
var b : Int
var c : Int

init(a: Int, b: Int, c: Int) {
    self.a = a
    self.b = b
    self.c = c
}

์•„๋ž˜์˜ ๋‘ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ๋‘ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๋™์‹œ์— ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

init(a: Int) {
    self.a = a
    self.b = 0
    self.c = 0
}

convenience init (a: Int){
    self.init(a: a, b: 0, c: 0)
}

2 : required init์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. required init์€ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ์žฌ์ •์˜ ํ•ด์•ผํ•˜๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ € ์ž…๋‹ˆ๋‹ค

  2. ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ required init์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฐ•์ œ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ override ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค

  3. ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์•„๋ฌด๋Ÿฐ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์ž๋™์ƒ์† ๋˜๋ฏ€๋กœ required init์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

  4. ๋‹จ, ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์–ด๋– ํ•œ ์ข…๋ฅ˜์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ผ๋„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž๋™์ƒ์† ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ required init์„ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

โญ๏ธ convenience init, required init์€ **class ์ด๋‹ˆ์…œ๋ผ์ด์ €** ์ž…๋‹ˆ๋‹ค!

3 : class์˜ ์ดˆ๊ธฐํ™” ์ง„ํ–‰ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

swift์˜ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋Š” 2๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค

  • 1๋‹จ๊ณ„ : ํด๋ž˜์Šค์— ์ •์˜ํ•œ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ดˆ๊นƒ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค

  • 2๋‹จ๊ณ„ : ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ํ•  ๊ธฐํšŒ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค

์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ์ „์— ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

์ปดํŒŒ์ผ๋Ÿฌ๋Š” 2๋‹จ๊ณ„ ์ดˆ๊ธฐํ™”๋ฅผ ์˜ค๋ฅ˜ ์—†์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„ค ๊ฐ€์ง€ safety-checks๋ฅผ ํ•ฉ๋‹ˆ๋‹ค

  1. ์ž์‹ํด๋ž˜์Šค์˜ init์ด ๋ถ€๋ชจํด๋ž˜์Šค์˜ init์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™” ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

class Perents {
    var home : String
    var firstName : String
    
    init(home: String, firstName: String) {
        self.home = home
        self.firstName = firstName
    }

}

class Child : Perents {
    var lastName : String
    var age : Int
    
โŒ
    init(lastName: String, age: Int) {
        super.init(home: "ํ•œ๊ฐ•๋ทฐ", firstName: "๊น€")
        self.lastName = lastName
        self.age = age
    }

โญ•๏ธ
    init(lastName: String, age: Int) {
        self.lastName = lastName
        self.age = age
        super.init(home: "ํ•œ๊ฐ•๋ทฐ", firstName: "๊น€")
    }
}
  1. ์ž์‹ํด๋ž˜์Šค์˜ init์€ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจํด๋ž˜์Šค์˜ init์„ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

init(lastName: String, age: Int) {
        self.lastName = lastName
        self.age = age

        self.home = "๊ฐ•๋‚จ" โŒ
        super.init(home: "ํ•œ๊ฐ•๋ทฐ", firstName: "๊น€")
        self.home = "๊ฐ•๋‚จ" โญ•๏ธ
    }
  1. ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๊ทธ ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋ผ๋„ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ init์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

convenience init(age: Int){
    self.age = 20 โŒ
    self.home = "ํ•œ๊ฐ•๋ทฐ" โŒ
    self.init(lastName: "ํ™๊ธธ๋™", age: age)
    self.age = 20 โญ•๏ธ
    self.home = "ํ•œ๊ฐ•๋ทฐ" โญ•๏ธ
}
  1. ์ดˆ๊ธฐํ™” 1๋‹จ๊ณ„๋ฅผ ๋งˆ์น˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    init(lastName: String, age: Int) {
        sayHello() โŒ //ํ”„๋กœํผํ‹ฐ์— ๊ฐ’ ํ• ๋‹น ์ „์ด๋ฏ€๋กœ 1๋‹จ๊ณ„ ์ „์ž„
        self.lastName = lastName
        self.age = age
        super.init(home: "ํ•œ๊ฐ•๋ทฐ", firstName: "๊น€")
        sayHello() โญ•๏ธ //๋‚˜์™€ ์ƒ์œ„์— ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹น ํ–ˆ์œผ๋ฏ€๋กœ 1๋‹จ๊ณ„ ๋งˆ์นจ
    }
    
    func sayHello(){
        print("hello")
    }

4. deinit์€ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ๋•Œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จํ•˜์—ฌ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

  • deinit ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋  ๋•Œ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋”˜๊ฐ€์— ๋ณด๋‚ด์ฃผ๊ฑฐ๋‚˜ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

4. Extension

1 : Extension์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

  1. extension์€ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  2. ๊ธฐ์กด์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

  3. ํ”„๋กœํผํ‹ฐ๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์™ธํ•œ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  4. deinit์€ ์ •์˜ํ•  ์ˆ˜ ์—†๊ณ  init์€ class์˜ ๊ฒฝ์šฐ์—๋Š” ํŽธ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’ํƒ€์ž…์€ ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋ผ ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ฐ’ํƒ€์ž…์—์„œ extension์„ ํ†ตํ•ด ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
- ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
- ํƒ€์ž…๋‚ด์— ๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์™ธ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

5. ๋ฐ์ดํ„ฐํƒ€์ž…

1. Optional์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

์˜ต์…”๋„์€ ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋กœ ์•ˆ์ „์„ฑ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“Œ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
- ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋’ค์— **๋ฌผ์Œํ‘œ**๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (var optinal : String?)
- **Optional**<Wrapped>์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (var optional : Optional<String>)

์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ์ฃ ?

  1. ์Šค์œ„ํ”„ํŠธ์—์„œ ์˜ต์…”๋„์ด ์•„๋‹Œ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์—๋Š” ๊ฐ’์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๋Š” nil์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

  2. ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๊ฐ€ ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ์„ ์ง๊ด€์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. ์˜ˆ๋กœ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ๊ตณ์ด ๋„˜๊ธฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ต์…”๋„๋กœ ์ •์˜ํ•˜์—ฌ ๊ฐ’์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์Œ์„ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์˜ต์…”๋„์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‚˜์š”?

  1. ์˜ต์…”๋„์€ ์ œ๋„ค๋ฆญ์ด ์ ์šฉ๋œ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

  2. @frozen ํ‚ค์›Œ๋“œ๋Š” type ๋ณ€๊ฒฝ์„ ์ œํ•œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ต์…”๋„์— case๊ฐ€ ์ถ”๊ฐ€ ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค

@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)

		/// ์ค‘๋žต
}

์˜ต์…”๋„์„ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜์š”?

  1. ์Šค์œ„ํ”„ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์˜ต์…”๋„์„ ๋ฒ—๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  2. if let ๊ตฌ๋ฌธ๊ณผ guard let ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ต์…”๋„์„ ๋ฒ—๊ธด ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. ์˜ต์…”๋„ ๋ณ€์ˆ˜๋’ค์— ๋А๋‚Œํ‘œ๋ฅผ ๋ถ™์—ฌ ๊ฐ•์ œ ์ถ”์ถœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, nil์ธ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์žˆ์Œ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“Œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ ๊ฐ’์˜ ์‚ฌ์šฉ
- if let์€ if๋ฌธ ๋‚ด๋ถ€์—์„œ๋งŒ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
- guard let์€ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด ์„ฑ๊ณต ํ•˜๋ฉด ๊ทธ ์ดํ›„์˜ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๐Ÿ“Œ ExpressibleByNilLiteral
- ์ด ํ”„๋กœํ† ์ฝœ์€ nil๋กœ ํ•ด๋‹น ํƒ€์ž…์„ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๊ฒฉ์š”๊ฑด์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค

2 : enum์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  1. ์—ด๊ฑฐํ˜•์€ ์—ฐ๊ด€๋œ ํ•ญ๋ชฉ๋“ค์„ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ž…๋‹ˆ๋‹ค

  2. ์—ด๊ฑฐํ˜•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•œ ํ•ญ๋ชฉ ๊ฐ’ ์ด์™ธ์—๋Š” ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

  3. ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ (.)์„ ํ†ตํ•ด์„œ case์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  4. ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํƒ€๋ฅผ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  5. ์›์‹œ๊ฐ’์ด๋‚˜ ์—ฐ๊ด€๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””ํ…Œ์ผํ•œ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

enum์˜ ์›์‹œ๊ฐ’์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. case์— ์›์‹œ๊ฐ’์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, enum์„ ์„ ์–ธํ•  ๋•Œ ์ด๋ฆ„ ์˜†์— ์›์‹œ๊ฐ’์˜ type์„ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

  2. ์›์‹œ๊ฐ’์˜ type์€ Number, Character, String ์„ธ๊ฐ€์ง€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

  3. ์›์‹œ๊ฐ’์€ type์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , ๋ชจ๋‘ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค

  4. ์›์‹œ๊ฐ’์€ rawValue๋ผ๊ณ  ํ•˜๋Š” ์†์„ฑ์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

enum Num : Int{
    case zero
    case one = 10
    case two
    case three
}

print(Num.two.rawValue) //11
๐Ÿค” ์›์‹œ๊ฐ’์€ ์–ธ์ œ ์ž๋™ ์ƒ์„ฑ๋ ๊นŒ?
- ์ •์ˆ˜๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„์— ์„ ์–ธ๋œ ๊ฐ’์—์„œ +1 ์ฆ๊ฐ€๋œ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
- String์€ ์›์‹œ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ case์ด๋ฆ„๊ณผ ๋™์ผํ•œ rawValue๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(detail : https://babbab2.tistory.com/116)

์—ด๊ฑฐํ˜•์˜ ์—ฐ๊ด€๊ฐ’์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ์—ฐ๊ด€๊ฐ’์€ case์— ์กฐ๊ธˆ๋” ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠœํ”Œ ํ˜•ํƒœ๋กœ ์›ํ•˜๋Š” ํƒ€์ž…์„ ๋ช…์‹œํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  2. ์—ฐ๊ด€๊ฐ’์€ ๋ชจ๋“  case๊ฐ€ ๊ฐ€์ ธ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์˜ต์…˜์ž…๋‹ˆ๋‹ค

enum Apple {
    case iPhone(model: String)
    case iPad
    case mackBook
}

var apple = Apple.iPhone(model: "14pro")

switch apple {
case .iPhone(model: "14pro"):
    print("์ตœ์‹ ํ˜• iPhone")
case .iPhone(model: let model):
    print(model)
case .iPad:
    print("iPad")
case .mackBook:
    print("mackBook")
}

// ์ตœ์‹ ํ˜• iPhone

3. Swift์˜ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ์ปฌ๋ ‰์…˜ ํƒ€์ž…์€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Swift์˜ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์—๋Š” Array, Dictionary, Set์ด ์žˆ์Šต๋‹ˆ๋‹ค

  2. ๋ฐฐ์—ด์€ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ„์น˜์— ๊ฐ™์€ ๊ฐ’์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Array๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์ˆœ์„œ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ key-value ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์˜ key๊ฐ’์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ผ์•ผํ•˜๋ฉฐ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  4. ์„ธํŠธ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ์—†์ด ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์„ธํŠธ ๋‚ด์˜ ๊ฐ’์€ ๋ชจ๋‘ ์œ ์ผํ•˜๋ฉฐ ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Set๋Š” Hashable ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ Swift์˜ Array๋Š” ๋ฒ„ํผ์ž…๋‹ˆ๋‹ค.
ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์ฃผ๋ฏ€๋กœ ์š”์†Œ์˜ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ๊ฐ€ ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Hashable ํ”„๋กœํ† ์ฝœ
์Šค์œ„ํ”„ํŠธ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ชจ๋‘ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.

Array๋ณด๋‹ค Set์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹์„ ๋•Œ๋Š” ์–ธ์ œ์ผ๊นŒ์š”?

  1. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต์—†์ด ๊ณ ์œ ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” Set์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

  2. Set์€ ์‚ฝ์ž…, ์‚ญ์ œ, ์กฐํšŒ๋ฅผ ๋ชจ๋‘ O(1) ์— ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์‚ญ์ œ์™€ ์‚ฝ์ž…์ด ๋นˆ๋ฒˆํ•  ๋•Œ๋„ Set์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4 : Any์™€ AnyObject์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  1. Any๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ Any ํƒ€์ž…์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  2. AnyObject๋Š” Any๋ณด๋‹ค ์กฐ๊ธˆ ํ•œ์ •๋œ ์˜๋ฏธ๋กœ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. Any๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งค๋ฒˆ ํƒ€์ž… ํ™•์ธ ๋ฐ ๋ณ€ํ™˜์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค

  4. Swift๋Š” ํƒ€์ž…์— ์—„๊ฒฉํ•œ ์–ธ์–ด๋ผ๋Š” ํŠน์„ฑ์ด ์žˆ์–ด Any์™€ AnyObject์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

6. ํด๋กœ์ €

1 : Closure์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํด๋กœ์ €๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋“ค์„ ๋ธ”๋ก์œผ๋กœ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.์Šค์œ„ํ”„ํŠธ์—์„œ ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  2. ํด๋กœ์ €๋Š” class์™€ ๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

2 : Closure ์˜ ๊ฐ’ ์บก์ฒ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํด๋กœ์ €๋Š” ์ž์‹ ์ด ์ •์˜๋œ ์œ„์น˜์—์„œ ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ์บก์ณํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ๊ฐ’์˜ ํƒ€์ž…๊ณผ ๊ด€๊ณ„ ์—†์ด ๊ฐ’์„ ์บก์ณํ•  ๋•Œ **์ฐธ์กฐ** ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ value ํƒ€์ž…์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” Closure List๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋กœ์ €๋ฅผ ์„ ์–ธํ•  ๋‹น์‹œ์˜ ๊ฐ’์„ ์ƒ์ˆ˜๋กœ ์บก์ณํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋กœ ์บก์ณ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • capture list

var string = "hello"
let closure = { [string] in
	string = "hi" // โŒerror
	print(string)
}

์ฐธ์กฐํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ๊ฐ€ ์žˆ์„๊ฑฐ ๊ฐ™์€๋ฐ์š”?

ํด๋กœ์ €๋Š” ์ฐธ์กฐํƒ€์ž…์˜ ๊ฐ’์„ ์บก์ณํ•  ๋•Œ strong์œผ๋กœ ์บก์ณํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ RC๊ฐ’์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์•ˆ์—์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ํด๋กœ์ €๊ฐ€ ํด๋ž˜์Šค์˜ ๊ฐ’์„ self๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ nil์ฒ˜๋ฆฌ ํ•˜๋”๋ผ๋„ ํด๋กœ์ €์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ €์˜ ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ๋Š” capture list๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ self๋ฅผ weak์œผ๋กœ ์บก์ณํ•˜์—ฌ RC๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ
์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ•ํ•œ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค A์™€ B๊ฐ€ ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ”„๋กœํผํ‹ฐ๋กœ B์™€ A๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋กœ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ์—๋Š” A,B์— ๋ชจ๋‘ nil์„ ์„ ์–ธ ํ•˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋กœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ RC๊ฐ’์ด ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋”์ด์ƒ A,B๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. A,B๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

self๋ฅผ weak ๋ง๊ณ  unowned๋กœ ์บก์ณํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”?

๋งŒ์•ฝ ํด๋ž˜์Šค ๋‚ด์—์„œ ํด๋กœ์ €๊ฐ€ unowned๋กœ self๋ฅผ ์บก์ณํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹œ์  ์ฐจ์ด๋กœ ์ธํ•ด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ nil์ด ํ• ๋‹น ๋œ ํ›„์—๋„ ํด๋กœ์ €์˜ ์ž‘์—…์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

unowned๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ ๊ฒฝ์šฐ nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” weak ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Name Closure๋„ ๊ฐ’์„ ์บก์ณํ•˜๋‚˜์š”?

Name Closure์ธ ๊ฒฝ์šฐ์—๋Š” ์–ด๋””์— ์œ„์น˜ ํ•˜๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ „์—ญ ํ•จ์ˆ˜๋Š” ์–ด๋– ํ•œ ๊ฐ’๋„ ์บก์ณํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ž์‹ ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๊ฐ’์„ reference capture ํ•ฉ๋‹ˆ๋‹ค.

3 : Trailing Closure์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ œ์ผ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ํด๋กœ์ € ์ผ ๋•Œ ์†Œ๊ด„ํ˜ธ ๋ฐ–์—์„œ ํด๋กœ์ €๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํ›„ํ–‰ ํด๋กœ์ €๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํด๋กœ์ €๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‹ค์ค‘ ํ›„ํ–‰ ํด๋กœ์ € ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์†Œ๊ด„ํ˜ธ ๋ฐ–์—์„œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์—ด๊ณ  ๋‹ซ์œผ๋ฉฐ ํด๋กœ์ €๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋กœ์ €์˜ ์–‘์ด ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Xcode์—์„œ๋„ ํ›„ํ–‰ ํด๋กœ์ €์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (์ž๋™ ๋ณ€ํ™˜๋จ)

4 : Escpaing Closure์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜ ์ข…๋ฃŒ ์ดํ›„์— ํ˜ธ์ถœ๋  ๋•Œ ํƒˆ์ถœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ํƒˆ์ถœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ํด๋กœ์ €๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.

  3. ์ฃผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•  ๋•Œ ํƒˆ์ถœ ํด๋กœ์ €๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ํƒˆ์ถœ ํด๋กœ์ €๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  4. ํƒˆ์ถœ ํด๋กœ์ €๋Š” ํด๋กœ์ € ์•ž์— @escaping ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

5 : Function๊ณผ Closure์˜ ์ฐจ์ด์ ์„ ๋งํ•ด๋ณด์„ธ์š”

  1. ํด๋กœ์ €๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์˜ ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์— ์†ํ•ฉ๋‹ˆ๋‹ค.

  2. ํ•˜์ง€๋งŒ ์ฃผ๋กœ ์ด๋ฆ„์ด ์žˆ๋Š” ํด๋กœ์ €๋ฅผ ํ•จ์ˆ˜๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ , ์ต๋ช… ํด๋กœ์ €๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

7. ARC

1. ARC์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  • ARC๋Š” swift์—์„œ ์ฐธ์กฐํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ARC๋Š” ๋”์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ธ์ œ ํ•ด์ œํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋Š” ์ธ์Šคํ„ด์Šค์˜ RC๊ฐ’์„ ํ†ตํ•ด ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ RC๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์–ธ์ œ ๊ฐ์†Œํ•˜๋‚˜์š”?

  • RC๊ฐ’์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•  ๋•Œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค์˜ ์‚ฌ์šฉ์ด ๋๋‚˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์— nil์„ ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด RC๊ฐ’์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

2. ์ฐธ์กฐ๋Š” ์–ด๋–ค๊ฒŒ ์žˆ๋‚˜์š”?

  • ์ฐธ์กฐ์˜ ์ข…๋ฅ˜๋Š” strong, weak, unowned ์„ธ ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

  • strong์€ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•˜์—ฌ RC๊ฐ’์„ +1 ์ฆ๊ฐ€ ์‹œํ‚ค๋Š” ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค.

  • weak๊ณผ unowned๋Š” RC๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก strong์€ ๊ฐ•ํ•œ์ฐธ์กฐ, weak์€ ์•ฝํ•œ์ฐธ์กฐ, unowned๋Š” ๋ฏธ์†Œ์œ ์ฐธ์กฐ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

weak๊ณผ unowned์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?

  • weak์€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด nil์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • unowned๋Š” ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋”๋ผ๋„ ๊ทธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์—์„œ์˜ ์ฐจ์ด๋„ ์žˆ์Šต๋‹ˆ๋‹ค. unowned๋กœ ์ฐธ์กฐํ•  ๋•Œ๋Š” ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ, weak์œผ๋กœ ์ฐธ์กฐํ•  ๋•Œ๋Š” ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ๐Ÿ’๐Ÿปโ€โ™‚๏ธ ์œ„ํ—˜ํ•œ๊ฑฐ ๊ฐ™์€๋ฐ unowned์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”?

  1. unowned๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ, weak์€ ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

  2. ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ weak reference๋กœ ์ฐธ์กฐ๋  ๋•Œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  3. ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ์ฐธ์กฐํ•˜๋Š”๊ฒƒ์€ ๊ทธ๋ ‡์ง€ ์•Š์„๋•Œ ๋ณด๋‹ค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ๊ทธ๋ž˜์„œ ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํ•œ ๊ฒฝ์šฐ์—๋Š” unowned๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

strong, weak, unowned reference๋Š” ๊ฐ๊ฐ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

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

  2. weak์€ ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. unowned๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ณด๋‹ค ๋จผ์ € ํ•ด์ œ๋˜๋Š” ๊ฒƒ์ด ํ™•์‹คํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3 : class๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

  1. class ์ธ์Šคํ„ด์Šค๋Š” strong, weak, unowned ์„ธ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ†ตํ•ด ์ฐธ์กฐ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์€ ๊ฐ์ž์˜ reference counting์„ ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ weak count๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ weak reference๋Š” ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

  3. ์ธ์Šคํ„ด์Šค์˜ RC๊ฐ’์ธ strong reference count ๊ฐ’์ด 0์ด ๋˜๋ฉด deinited ๋ฉ๋‹ˆ๋‹ค.

  4. deinited๋˜๋ฉด unowned count๊ฐ’์ด ๊ฐ์†Œํ•˜๊ณ  unowned count๊ฐ’์ด 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

  5. ๋งŒ์•ฝ weak count๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์ด๋“œ ํ…Œ์ด๋ธ”์ด ๋‚จ์•„์žˆ๋Š” freed ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ ์ด๋•Œ weak count๊ฐ’์ด ๊ฐ์†Œํ•˜๊ณ  weak count๊ฐ’์ด 0์ด ๋˜๋ฉด, ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์˜ side table์ด ํ•ด์ œ๋˜๋ฉฐ ๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.

8. ํ”„๋กœํ† ์ฝœ

1. ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๊ธฐ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  2. ํ”„๋กœํ† ์ฝœ์€ ์ •์˜๋ฅผ ํ•˜๊ณ  ์ œ์‹œ๋งŒ ํ•  ๋ฟ, ์Šค์Šค๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด ๊ฐ„์— ์œ ์—ฐํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฑ„ํƒํ•œ ํƒ€์ž…์€ ํ”„๋กœํ† ์ฝœ์ด ์ œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋‹คํ˜•์„ฑ
ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค์–‘ํ•œ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ“Œ ์ฑ„ํƒ์˜ ์ œํ•œ
ํ”„๋กœํ† ์ฝœ์˜ ์ƒ์† ๋ฆฌ์ŠคํŠธ์— class ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, class๋งŒ ์ฑ„ํƒ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์ด ๋ฉ๋‹ˆ๋‹ค.
๐Ÿ“Œ ํ”„๋กœํผํ‹ฐ
- ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ํ›„์—๋Š” var, let ์ค‘ ์–ด๋–ค๊ฒƒ์œผ๋กœ ์„ ์–ธํ•ด๋„ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
- ํ”„๋กœํผํ‹ฐ๋ฅผ { get set }์œผ๋กœ ์š”๊ตฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์ฑ„ํƒํ•œ ํ›„์—๋„ let์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. set์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
- ํ•˜์ง€๋งŒ { get }์œผ๋กœ ์š”๊ตฌํ–ˆ๋”๋ผ๋„, ์ฑ„ํƒํ•œ ํ›„์— ํ•„์š”ํ•˜๋‹ค๋ฉด set์„ ์ ์šฉ ํ•ด๋„ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•˜์ง€ ๋ชปํ•˜๋‚˜์š”?

  1. ์•„๋‹ˆ์š”, ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด ์ถ”์ƒํด๋ž˜์Šค๋กœ์จ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ”„๋กœํ† ์ฝœ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์—†๊ณ , ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํ‘œํ˜„์ด ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

  3. ํ•˜์ง€๋งŒ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ”„๋กœํ† ์ฝœ๋กœ ์ •์˜ํ•˜๊ณ  extension์„ ํ†ตํ•ด ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ์ถ”์ƒํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๊ฐœ๋…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

- ํ”„๋กœํ† ์ฝœ์€ extension์„ ํ†ตํ•ด์„œ๋งŒ ๊ตฌํ˜„์ฒด ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
- ํ”„๋กœํ† ์ฝœ๊ฐ„์— ์ƒ์†์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ์—์„œ ์ •์˜๋œ ๊ธฐ๋Šฅ์€ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ์š”?

  1. ์•„๋‹ˆ์š”, ํ”„๋กœํ† ์ฝœ์€ ์„ ํƒ์  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‹จ, ์„ ํƒ์  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœํ† ์ฝœ์€ objc ์†์„ฑ์ด ๋ถ€์—ฌ๋œ ํ”„๋กœํ† ์ฝœ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  ์š”๊ตฌ์‚ฌํ•ญ์ด ์ ์šฉ๋œ ํ”„๋กœํ† ์ฝœ์€ objc ์†์„ฑ์ด ๋ถ€์—ฌ๋œ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  4. ์„ ํƒ์  ์š”๊ตฌ์‚ฌํ•ญ์€ @objc optional ํ‚ค์›Œ๋“œ๋ฅผ ์š”๊ตฌ์‚ฌํ•ญ ์•ž์— ๋ถ™์—ฌ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@objc protocol SomeProtocol {
	func essential() //ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ์‹œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•จ!!
	@objc optional func option() //์„ ํƒ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋จ
}

2 : associatedType์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

associatedType์€ ํ”„๋กœํ† ์ฝœ ๋‚ด์—์„œ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๋•Œ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์—์„œ ์ผ์ข…์˜ ์ œ๋„ค๋ฆญ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

protocol ExamScore {
    associatedtype SubjectScore

    func calculateAverage(subject1: SubjectScore, subject2: SubjectScore) -> String
}

3 : Codable์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. Encodable๊ณผ Decodable ํ”„๋กœํ† ์ฝœ์˜ ํ•ฉ์„ฑ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

  2. Codable์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ ๋‹ค๋ฅธ ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋Œ€ํ‘œ์ ์œผ๋กœ JSONEncoder, JSONDecoder๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , JSON์„ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Encodable๊ณผ Decodable?
- ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ(with Encodable)ํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉ(with Decodable)ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
- Foundation ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์™€ ํ˜ธํ™˜ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Codable๊ณผ NSCoding์˜ ์ฐจ์ด๋Š”?

  1. Codable์€ ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜•, ๊ตฌ์กฐ์ฒด์— ๋ชจ๋‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ NSCoding์€ ํด๋ž˜์Šค ํƒ€์ž…์—๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  2. NSCoding์€ NSObject๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์—์„œ๋งŒ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ NSCoding์„ ์ฑ„ํƒํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ NSKeyedArchiver์™€ NSKeyedUnarchiver๋ฅผ ์‚ฌ์šฉํ•ด Data ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋””์ฝ”๋”ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

4 : Equatable ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํƒ€์ž…๋ผ๋ฆฌ ๋น„๊ต(==)์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์ž…๋‹ˆ๋‹ค.

  2. ๊ธฐ๋ณธ ํƒ€์ž…์€ Equatable์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด ๋น„๊ต ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ปค์Šคํ…€ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์ฑ„ํƒํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ชจ๋‘ ๊ธฐ๋ณธ ํƒ€์ž…์ธ ๊ฒฝ์šฐ Equatable์„ ์ฑ„ํƒํ•˜๋ฉด ๋น„๊ต ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  4. ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  5. ์—ด๊ฑฐํ˜•์˜ ๊ฒฝ์šฐ ์—ฐ๊ด€๊ฐ’์ด ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ Equatable์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ Equatable์„ ์ง์ ‘ ์ฑ„ํƒํ•ด์ค˜์•ผ ํ•˜๋ฉฐ, ์—ฐ๊ด€๊ฐ’์ด ๋ชจ๋‘ Equatable์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
static func == (lhs: Class, rhs: Class) -> Bool {
    return lhs.first == rhs.first && lhs.second == rhs.second
}

5. Hashable ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. Hashable์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…์€ ๋ชจ๋‘ ๊ฐ’์„ ์ •์ˆ˜ ํ•ด์‹œ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. Hashable์€ Equatable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ Hashable์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์ง€๋งŒ, ์ปค์Šคํ…€ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ชจ๋‘ ๊ธฐ๋ณธ ํƒ€์ž…์ด๋ฉด Hashable์„ ์ฑ„ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  5. ํด๋ž˜์Šค๋Š” ์ง์ ‘ hashํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ Equatable์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— == ํ•จ์ˆ˜๋„ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  6. ์—ด๊ฑฐํ˜•์˜ ๊ฒฝ์šฐ ์—ฐ๊ด€๊ฐ’์ด ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ Hashable์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ Hashable์„ ์ฑ„ํƒํ•ด์ค˜์•ผ ํ•˜๋ฉฐ, ์—ฐ๊ด€๊ฐ’์ด ๋ชจ๋‘ Hashable์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Equatable์„ ์™œ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋‚˜์š”?

ํ•ด์‹œ๊ฐ’์€ ๊ณ ์œ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณ ์œ ๊ฐ’์„ ์‹๋ณ„ํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” == ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Equatable์„ ์ฑ„ํƒํ•˜์—ฌ ==ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

9. ํ‚ค์›Œ๋“œ

1 : mutating ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ Swift์—์„œ๋Š” ๊ตฌ์กฐ์ฒด๋‚˜ ์—ด๊ฑฐํ˜• ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  2. ํ•˜์ง€๋งŒ, mutating ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ์ˆ˜ ์•ž์— ๋ถ™์ด๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด๋‚˜ ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2 : lazy ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. lazy๋Š” ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋กœ, ํ˜ธ์ถœ์ด ์žˆ์–ด์•ผ๋งŒ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

  2. lazy๋Š” ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๋ฏ€๋กœ init์‹œ์  ์ดํ›„์— ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. lazy ํ”„๋กœํผํ‹ฐ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ €ํ•˜๋‚˜ ๊ณต๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lazy๋Š” ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ lazy ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3 : typealias ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งํ•ด์ฃผ์„ธ์š”

  1. ๊ธฐ์กด ํƒ€์ž…์— ์ƒˆ๋กœ์šด ์ด๋ฆ„(๋ณ„๋ช…)์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

  2. typealias๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typealias Name = String
let name : Name = "๊น€์ œ๋‹ˆ"

4. required ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ํด๋ž˜์Šค๋‚˜ ํ”„๋กœํ† ์ฝœ์„ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. required ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ฉ”์„œ๋“œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  3. ๋งŒ์•ฝ, override ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, override ํ‚ค์›Œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. some ๋ถˆ๋ช…ํ™• ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

10. ํŒจ๋Ÿฌ๋‹ค์ž„

1. Swift์˜ map, filter, reduce์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ์Šค์œ„ํ”„ํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, map, filter, reduce๋Š” ๋ชจ๋‘ ๊ณ ์ฐจํ•จ์ˆ˜์— ์†ํ•ฉ๋‹ˆ๋‹ค.

  3. map์€ ์ดˆ๊ธฐ๊ฐ’๊ณผ ํด๋กœ์ €๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„ ์ „๋‹ฌ๋ฐ›์€ ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ์ดˆ๊ธฐ ๊ฐ’์˜ ํƒ€์ž…์„ Int โ†’ String์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. filter๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๊ฑธ๋Ÿฌ์„œ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’์„ ๋ชจ์•„ map๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ์ดˆ๊ธฐ ๊ฐ’์ด Int์ธ ๊ฒฝ์šฐ 10์ด์ƒ์ธ ๊ฐ’๋งŒ ์ถ”์ถœ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. reduce๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. reduce๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ ํ•ฉ์น˜๋Š” ๊ฒฝ์šฐ ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

map์˜ ์ข…๋ฅ˜์ธ flatMap๊ณผ compactMap์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

  1. ๋‘ ํ•จ์ˆ˜๋Š” ์š”์†Œ๊ฐ€ ์ผ์ฐจ์› ๋ฐฐ์—ด์ผ ๋•Œ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ผ์ฐจ์› ๋ฐฐ์—ด์—์„œ ํด๋กœ์ €์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ต์…”๋„์ผ ๋•Œ, nil์ธ ๊ฒฝ์šฐ nil์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, 2์ฐจ์› ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ nil์„ ์ œ๊ฑฐํ•˜์ง€์•Š์Šต๋‹ˆ๋‹ค.

  3. flatMap์€ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ์› ๋ฐฐ์—ด๋กœ(flatten) ๋งŒ๋“ค์–ด๋‚ด๊ณ , compactMap์€ 2์ฐจ์› ๋ฐฐ์—ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก swift์—์„œ ๊ฐ™์€ ์ผ์ฐจ์› ์˜ต์…”๋„ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ, compactMap์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value

2. Protocol Oriented Programming๊ณผ Object Oriented Programming์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

11. function / method

1. function๊ณผ method์˜ ์ฐจ์ด๋ฅผ ๋งํ•ด๋ณด์„ธ์š”.

  1. funtion์€ ํŠน์ • ๊ฐ์ฒด์— ์†ํ•ด์žˆ์ง€ ์•Š์€ ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

  2. method๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ ํŠน์ • ๊ฐ์ฒด ์•ˆ์—์„œ ์ •์˜ ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  3. function์€ ์™ธ๋ถ€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, method๋Š” ์ž๊ธฐ๊ฐ€ ์†ํ•ด ์žˆ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. instance ๋ฉ”์„œ๋“œ์™€ class ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  1. ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ํ•จ์ˆ˜๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด ์•ˆ์— ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ž„!!)

  2. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ, ํƒ€์ž… ์ž์ฒด์— ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํƒ€์ž…์„ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. class ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  1. ๋‘ ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค.

  2. ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” ํƒ€์ž… ์ž์ฒด์— ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋กœ, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. static ๋ฉ”์„œ๋“œ๋Š” ์ƒ์† ํ›„ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ณ , class ๋ฉ”์„œ๋“œ๋Š” ์ƒ์† ํ›„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฐ’ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋ ๊นŒ์š”?

  1. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” ์ƒ์ˆ˜ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  2. ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” inout ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ• 

  3. inout ํ‚ค์›Œ๋“œ๋Š” ์ธ์ž์˜ ํƒ€์ž… ์•ž์— ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ์ธ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

  4. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” ์ธ์ž ์•ž์— &๋ฅผ ๋ถ™์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ‘œ์‹œ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  5. inout์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func functionName(_ value : inout String) {
    value = "change"
}

var someValue: String = "hello"
functionName(&someValue)
print(someValue) // "change"

5. defer๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  1. defer๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ง€์—ฐํ•˜์—ฌ ํ•จ์ˆ˜ ์‹คํ–‰์‹œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค.

  2. defer์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  3. ํ•จ์ˆ˜๋‚ด์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ ์ค‘ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ •๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ฆฌ์†Œ์Šค ํ•ด์ œ, ์ž„์‹œ ๋ฐ์ดํ„ฐ ์‚ญ์ œ, ํŒŒ์ผ ๋‹ซ๊ธฐ etc)

defer๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๊ณ , defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์—†์„๊นŒ์š”?

  1. defer๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธํ•œ ์ˆœ์„œ์˜ ์—ญ์ˆœ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ์žˆ๋Š” defer๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜, defer๋ฅผ ์ฝ๊ธฐ ์ „์— ํ•จ์ˆ˜๊ฐ€ return ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” defer๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. guard๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ, guard๋ฌธ ์•„๋ž˜์— ์žˆ๋Š” defer๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func say(){
    defer {
        print("๋‚˜๋Š” ๋งˆ์ง€๋ง‰์ด๋‹ค!")
    }
    defer {
        print("๋‚˜๋Š” ์„ธ๋ฒˆ์งธ")
    }
    print("๋‚ด๊ฐ€ ์ œ์ผ ์ฒ˜์Œ ํ˜ธ์ถœ๋˜๊ฒ ์ง€")
    defer {
        print("๋‚˜๋Š” ๋‘๋ฒˆ์งธ๋กœ ํ˜ธ์ถœ๋˜๊ฒ ์ง€")
    }
}
say() // print์— ์ ํžŒ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ

defer๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  1. ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์˜ˆ๋ฅผ๋“ค์–ด ํ•จ์ˆ˜์—์„œ lock์„ ๊ฑธ์–ด ๋™๊ธฐํ™”๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— unlock์„ ํ•ด์ฃผ์–ด์•ผ ๋ฐ๋“œ๋ฝ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋งˆ๋‹ค ํ•ด์•ผ ํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•จ์ˆ˜ ๋‚ด์— ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ return ์•ž์— ์จ์ฃผ๊ธฐ ๋ณด๋‹ค๋Š”, defer๋ฅผ ํ•จ์ˆ˜ ์ƒ๋‹จ์— ์„ ์–ธํ•ด์ฃผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์•Œ์•„์„œ ์ข…๋ฃŒ๋  ๋•Œ ํ•ด์•ผํ•˜๋Š” ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

12. ํ”„๋กœํผํ‹ฐ

1. ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  1. ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด ๋‚ด์—์„œ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœํผํ‹ฐ ์ž…๋‹ˆ๋‹ค.

  2. ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€ ๊ฐ’์„ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ์ž…๋‹ˆ๋‹ค.

  4. ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์— ์žˆ๋Š” ์€๋‹‰ํ™” ๋œ ๊ฐ’์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์ˆ˜์ • ๋˜๋Š” ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ๊ตณ์ด ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์“ฐ๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”?

  1. ์ธ์Šคํ„ด์Šค์˜ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” getter, setter ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด๋Š” ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถ„์‚ฐ ๊ตฌํ˜„๋˜์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ๊ทธ ์—ญํ• ์„ ๋™์‹œ์— ํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ํ•˜์ง€๋งŒ, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์“ฐ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์“ฐ๊ธฐ ์ „์šฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  1. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

  2. lazy ํ‚ค์›Œ๋“œ๋ฅผ ํ”„๋กœํผํ‹ฐ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ €ํ•˜๋‚˜ ๊ณต๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3 : property warrper์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  1. ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  2. ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. @propertyWrapperํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‚ด๋ถ€์— ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ •์˜ํ•ด๋‘๋ฉด, ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๋ถ™์—ฌ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ๋™์ž‘์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ
ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ํ‹€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

//property wrapper ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์ž…๋‹ˆ๋‹ค.
@propertyWrapper
struct Wrapper {
    var value : String
    
    //๊ผญ!! ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ ์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    var wrappedValue: String {
        get { "Value : \(value)"}
        set { value = newValue }
    }
}
  • ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์ƒํ™ฉ์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

struct NotFound {
    private var _alert : String = "404 not found"
    
    **var alert : String {
        get{ "Alert!! \(_alert)" }
        set{ _alert = newValue }
    }**
    
    init(_ value : String){
        self._alert = value
    }
}

struct Forbidden {
    private var _alert : String = "403 forbidden"
    
    **var alert : String {
        get{ "Alert!! \(_alert)" }
        set{ _alert = newValue }
    }**
    
    init(_ value : String){
        self._alert = value
    }
}
  • ์œ„ ์ฝ”๋“œ๋ฅผ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@propertyWrapper
struct Alert {
    private var _alert : String
    
    var wrappedValue : String {
        get{ "Alert!! \(_alert)" }
        set{ _alert = newValue }
    }
    
    init(wrappedValue alert: String) {
        self._alert = alert
    }
}

struct NotFound {
    @Alert var alert : String = "404 not found"
}

struct Forbidden {
    @Alert var alert : String = "403 forbidden"
}
  • Userdefault์— ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์ ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@propertyWrapper
struct UserDefault<T> {
    let key : String
    let value : T
    
    var wrappedValue : T {
        get { UserDefaults.standard.object(forKey: key) as? T ?? self.value }
        set { UserDefaults.standard.set(newValue, forKey: key)}
    }
}

class UserManager {
    
    @UserDefault(key: "userName", value: nil) //๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
    static var userName : String?
    @UserDefault(key: "autoLogin", value: false) //๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
    static var autoLogin : Bool

}

13. ์ œ๋„ค๋ฆญ

  1. ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์„ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  2. ์ œ๋„ค๋ฆญ์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์˜ ํƒ€์ž… ์ œ์•ฝ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

  1. ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์„ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํƒ€์ž…๋„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ œ์•ฝ์„ ๊ฑธ์–ด ํƒ€์ž…์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋ช…์‹œํ•  ๋•Œ ํŠน์ • ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ํƒ€์ž…๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํƒ€์ž… ์ œ์•ฝ์€ ํด๋ž˜์Šค๋‚˜ ํ”„๋กœํ† ์ฝœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

14. Subscript

  1. subscript๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ์—์„œ ์ปฌ๋ ‰์…˜ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  2. ์ปฌ๋ ‰์…˜ ์š”์†Œ๋Š” ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ, ์ง‘ํ•ฉ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  3. subscript๋Š” index๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ํ•จ์ˆ˜ ๋‚ด์—์„œ get๊ณผ set์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. get๋งŒ ์ž‘์„ฑํ•˜์—ฌ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. subscript๋ฅผ ์ž‘์„ฑํ•œ ํ›„์—๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„ ๋’ค์— ๋Œ€๊ด„ํ˜ธ([])๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. subscript๋Š” ๊ตฌํ˜„๋ถ€ ๋˜๋Š” ์ต์Šคํ…์…˜ ๊ตฌํ˜„๋ถ€์— ์œ„์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class MyArray {
    var array = [Int]()

    subscript(index: Int) -> Int {
        get {
            return array[index]
        }
        set(newValue) {
            array[index] = newValue
        }
    }
}

var myArray = MyArray()
myArray.array = [1, 2, 3, 4, 5]

let value = myArray[2] // 3

String๋„ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค, String์€ Character ์ปฌ๋ ‰์…˜ ํƒ€์ž… ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ๋ฌธ์ž์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class MyClass {
    var myString = "Hello, world!"
    
    subscript(index: Int) -> Character {
        get {
            return myString[myString.index(myString.startIndex, offsetBy: index)]
        }
        set {
            let startIndex = myString.index(myString.startIndex, offsetBy: index)
            myString.replaceSubrange(startIndex...startIndex, with: String(newValue))
        }
    }
}

var myClass = MyClass()
print(myClass[1]) // "e"

myClass[0] = "J"
print(myClass.myString) // "Jello, world!"

15. ์ถ”๊ฐ€ ๊ฐœ๋…

1. Resultํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

์„ฑ๊ณต ํ˜น์€ ์‹คํŒจ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…”๋„๊ณผ ์ฐจ์ด์ ?

์˜ต์…”๋„์€ ๊ฐ’์ด ์—†์„ ๋•Œ ๋ฌด์กฐ๊ฑด nil์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, Result ํƒ€์ž…์€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ์—ฐ๊ด€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์Šค์œ„ํ”„ํŠธ์—์„œ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

  1. ์Šค์œ„ํ”„ํŠธ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ์˜ ์›ํ˜•์„ ํ”„๋กœํ† ์ฝœ์— ์„ ์–ธํ•ด๋‘๊ณ , ํ”„๋กœํ† ์ฝœ์„ extensionํ•˜์—ฌ ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ์ถ”์ƒํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๊ฐœ๋…์˜ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Self์™€ self์˜ ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ์š”?

  1. ๋Œ€๋ฌธ์ž Self๋Š” ํƒ€์ž… ์ž์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค.

  2. class, struct์˜ ์ž๊ธฐ ์ž์‹ ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ํ”„๋กœํ† ์ฝœ์—์„œ ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  3. ์†Œ๋ฌธ์ž self๋Š” ์˜ˆ์•ฝ์–ด๋กœ ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

4. @objc๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

  1. Objective-C ๋Ÿฐํƒ€์ž„์— swift ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. swift์—์„œ ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ static ๋””์ŠคํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, @objc๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ๋™์  ๋””์ŠคํŒจ์น˜๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

5. autoclosure attribute์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

  1. ํ•จ์ˆ˜ ์ธ์ž์— autoclosure ์†์„ฑ์„ ๋ถ™์ด๋ฉด, ์ „๋‹ฌ๋˜๋Š” ์ธ์ž ์ฝ”๋“œ๋ฅผ ๊ฐ์‹ธ์„œ ์ž๋™์œผ๋กœ ํด๋กœ์ €๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

  2. ๋‹ค์‹œ ๋งํ•ด ์ผ๋ฐ˜ ํ‘œํ˜„์˜ ์ฝ”๋“œ๋ฅผ ํด๋กœ์ € ํ‘œํ˜„์˜ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํด๋กœ์ €์—๋Š” ์ธ์ž๊ฐ€ ์—†๊ณ  ๋ฆฌํ„ด๊ฐ’๋งŒ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋กœ์ € ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์—†์•ฐ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. Swift์—์„œ @autoclosure๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ assert()ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

// @autoclosure ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
func normalPrint(_ closure: () -> Void) {
    closure()
}

// ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํด๋กœ์ € ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋Œ€๊ด„ํ˜ธ {...}๋กœ ๋ฌถ์–ด์„œ ์ธ์ž๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
normalPrint({ print("I'm Normal Expression") })

// @autoclosure ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
func autoClosurePrint(_ closure: @autoclosure () -> Void) {
    closure()
}

// @autoclosure๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•จ์ˆ˜์— ํด๋กœ์ €๋ฅผ ์ธ์ž๋กœ ์‚ฌ์šฉํ• ๋•Œ ์ผ๋ฐ˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
autoClosurePrint(print("I'm AutoClosure Expression"))

6. Never ๋ฐ˜ํ™˜ ํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

  • ์—๋Ÿฌ ๋“ฑ์˜ ์ด์œ ๋กœ ์ •์ƒ์ ์œผ๋กœ ๋ฆฌํ„ด ๋˜์ง€์•Š๋Š” ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. (The return type of functions that do not return normally, that is, a type with no values.)

func crashAndBurn() -> Never {
    fatalError("Something very, very bad happened")
}

7. ๋ชจ๋‚˜๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ๋ชจ๋‚˜๋“œ๋Š” ๊ฐ’์ด ์„ ํƒ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด(functor)์ž…๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ๊ฐ์ฒด(functor) = ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๊ณ ์ฐจ ํ•จ์ˆ˜ map ์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Swift ์—์„œ๋Š” Array, Dictionary, Optional ๋“ฑ์ด ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

  • Swift ์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ชจ๋‚˜๋“œ๋Š” Optional ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Optional ์€ ๊ฐ’์ด ์„ ํƒ์ ์œผ๋กœ ์กด์žฌํ•˜๊ณ , map ์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋‚˜๋“œ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด ์•ˆ์— ํฌํ•จ๋˜๋Š” ๊ฐœ๋…์ด์ง€๋งŒ, ํ•จ์ˆ˜ ๊ฐ์ฒด์™€์˜ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋ชจ๋‚˜๋“œ์—๋Š” flatMap (์˜ต์…”๋„ ํ•ด์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€) ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋‚˜๋“œ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ๊ฐ์ฒด์—๋Š” flatMap ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜

Last updated