NOW-ON / iOS-Interview-Preparation

iOS ๋ฉด์ ‘ ์ค€๋น„
3 stars 0 forks source link

Protocol #9

Closed Glsme closed 1 year ago

Glsme commented 1 year ago

๐Ÿ—“๏ธ ๋งˆ๊ฐ์ผ

2023.01.15

๐Ÿ’ ์ฐธ์—ฌ์ž

โš ๏ธ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ต๋ณ€ ๋‹จ ์‚ฌ๋žŒ์ด ์ด์Šˆ close ํ•˜๊ณ  ๋ฆฌ๋“œ๋ฏธ์— ํ•ญ๋ชฉ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์„ธ์š”.

Yun-YeoJin commented 1 year ago

ํ”„๋กœํ† ์ฝœ

ํ”„๋กœํ† ์ฝœ ์ข…๋ฅ˜

1. Optional Protocol : ์„ ํƒ์  ์š”์ฒญ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์š”์†Œ๋Š” ์•ˆ์จ๋„ ๋œ๋‹ค.

2. CaseIterable : ์—ด๊ฑฐํ˜•์˜ ๊ฐ’๋“ค์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ, allCases๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์ฒ˜๋Ÿผ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-12-26 แ„‹แ…ฉแ„’แ…ฎ 5 04 33

3. Hashable : ์ •์ˆ˜ Hash ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์˜ ํ”„๋กœํ† ์ฝœ, Hashable์„ ์ค€์ˆ˜ํ•˜๋ฉด Dictionary์˜ ํ‚ค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ Dictionary์˜ ํ‚ค ๊ฐ’์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค.

wodyddml2 commented 1 year ago

ํƒ€์ž…์œผ๋กœ class๋‚˜ struct์˜ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ์—ญํ•  (์ฆ‰, ๊ตฌํ˜„ํ•˜๋Š” ์—ญํ• ์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค)

Glsme commented 1 year ago

Protocol

ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ ๋ฐ ๊ธฐํƒ€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถ”์ƒํ™”ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Class Protocol
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์ƒ์† ๊ฐ€๋Šฅ ๋‹ค์ค‘ ์ƒ์† ๊ฐ€๋Šฅ
ํด๋ž˜์Šค ํƒ€์ž…์—์„œ๋งŒ ๊ฐ€๋Šฅ ๋ชจ๋“  ํƒ€์ž… ์ ์šฉ ๊ฐ€๋Šฅ

์ •์˜ ๋ฐฉ๋ฒ•

protocol Student {
    var id: String { get }
    var name: String { get set }
    func study()
}
LeeJoobang commented 1 year ago

ํ”„๋กœํ† ์ฝœ : ํŠน์ • ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ, ํ”„๋กœํผํ‹ฐ, ๊ธฐํƒ€ ์š”๊ตฌ ์‚ฌํ•ญ ๋“ฑ์˜ ์ฒญ์‚ฌ์ง„ ํ”„๋กœํ† ์ฝœ์˜ ์žฅ์  : ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. : ๊ฐ€๋ณ๊ณ  ์•ˆ์ „ํ•˜๋‹ค.(์ƒ์†๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.) : ๊ฐ’ ํƒ€์ž…์˜ ์ƒ์† ํšจ๊ณผ : ์ œ๋„ค๋ฆญ ํ™œ์šฉ ๊ฐ€๋Šฅ(ํƒ€์ž…์— ๊ด€๊ณ„ ์—†์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.)

heydoy commented 1 year ago

ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜

ํŠน์ • ์ž‘์—…์ด๋‚˜ ๊ธฐ๋Šฅ์— ์ ํ•ฉํ•œ ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, ๋‹ค๋ฅธ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์˜ ์ฒญ์‚ฌ์ง„์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœํ† ์ฝœ. ํ”„๋กœํ† ์ฝœ์€ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ์— ์ฑ„ํƒ์ด ๋  ์ˆ˜ ์žˆ์Œ. ์–ด๋–ค ํƒ€์ž…์ด๋“  ํ”„๋กœํ† ์ฝœ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž…์€, 'ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜(conform to protocol)'ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

protocol DeeProtocol {
  // ํ”„๋กœํ† ์ฝœ ์ •์˜๋ฅผ ์—ฌ๊ธฐ์— ์„ ์–ธ
}

ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ธฐ ์œ„ํ•ด์„  ์ปค์Šคํ…€ ํƒ€์ž…์— ์˜ค๋ฅธ์ชฝ์— ์ฝœ๋ก , ํ”„๋กœํ† ์ฝœ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ๋‹ค

struct SanStruct: DeeProtocol, CatProtocol {
   // ๊ตฌ์กฐ์ฒด ์ •์˜ 
}

๋งŒ์•ฝ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํผ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ธฐ ์ „์— ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

ํ”„๋กœํ† ์ฝœ์˜ ํ”„๋กœํผํ‹ฐ ์š”๊ตฌ์‚ฌํ•ญ

์ €์žฅ ํ”„๋กœํผํ‹ฐ์ธ์ง€ ๊ณ„์‚ฐํ”„๋กœํผํ‹ฐ์ธ์ง€๋Š” ๋ช…์„ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•œ ํƒ€์ž…๊ณผ ์ด๋ฆ„๋งŒ ์ง€์ •. ๋˜ํ•œ ํ”„๋กœํ† ์ฝœ์€ ๊ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ gettable ํ•œ์ง€, ๋˜๋Š” gettable and settableํ•œ์ง€ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

protocol DeeProtocol {
  var settableProperty: String { get set }
  var gettableProperty: String { get } 
  static var typeProperty: String { get set } 
}

ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์„œ๋“œ ์š”๊ตฌ์‚ฌํ•ญ

ํ”„๋กœํ† ์ฝœ์—์„œ ๋ฉ”์„œ๋“œ๋Š” ์ค‘๊ด„ํ˜ธ(=๋ฉ”์„œ๋“œ๋ฐ”๋””)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€๋ณ€ ํŒŒ๋ผ๋ฏธํ„ฐ ํ—ˆ์šฉ๋˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์—†๋‹ค.

protocol CatProtocol {
   static func purrMethod() 
   func tasteCatFood() -> Int
   mutating func isJipsaHome() -> Bool
}

ํ”„๋กœํ† ์ฝœ์˜ ์ƒ์„ฑ์ž(Initialiser) ์š”๊ตฌ์‚ฌํ•ญ

์ƒ์„ฑ์ž ๋ฐ”๋”” (= ์ค‘๊ด„ํ˜ธ)๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๋นผ๊ณ ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

protocol JipsaProtocol {
   init(catName: String) 
}

ํƒ€์ž…์œผ๋กœ์„œ์˜ ํ”„๋กœํ† ์ฝœ

ํ”„๋กœํ† ์ฝœ์€ ์ž๊ธฐ์ž์‹ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํ”„๋กœํ† ์ฝœ์„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ existential type (์‹ค์กด์ ํƒ€์ž…) ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ด ํ‘œํ˜„์€ 'ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š”ํƒ€์ž… T๊ฐ€ ์‹ค์žฌํ•œ๋‹ค.'๋ผ๋Š” ๋ง์—์„œ ์™”์Œ.

๋‹ค๋ฅธ ํƒ€์ž…๋“ค ์ฒ˜๋Ÿผ ํ”„๋กœํ† ์ฝœ์„ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

์™œ๋ƒํ•˜๋ฉด ํ”„๋กœํ† ์ฝœ์€ ํƒ€์ž…์ด๋ฏ€๋กœ.

Class San {
   let jipsa: JipsaProtocol
   let favoriteFood: [String] 

   init(jipsa: JipsaProtocol, favouriteFood: [String]) {
       self.jipsa = jipsa
       self.favouriteFood = favouriteFood
   }

   func isMyFavorite(food: String) -> Bool {
       return favoriteFood.contains(food)
   }
}

Delegation

Delegation์€ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์ผ๋ถ€ ์ฑ…์ž„์„ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์— ์ด๊ด€(์œ„์ž„)ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด. ์ด ๋””์ž์ธ ํŒจํ„ด์€ ์œ„์ž„๋œ ๊ถŒํ•œ์„ ์บก์Šํ™”ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ์œ ํ˜•(Delegate=๋Œ€๋ฆฌ์ž)์ด ์œ„์ž„๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋„๋ก ๋ณด์žฅํ•จ. Delegate์€ ์†Œ์Šค์˜ ์‹ค์ œ ํƒ€์ž…์„ ์•Œ ํ•„์š” ์—†์ด, ํŠน์ • ์ž‘์—…์— ์‘๋‹ตํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.