Skip to content

Latest commit

ย 

History

History
225 lines (173 loc) ยท 13.3 KB

211018_let,_var,_tool_bar,_Design_Patterns,_Architectures,_MVC,_Dictionary,_Downcasting,_Function_Types_as_Parameter_Types.md

File metadata and controls

225 lines (173 loc) ยท 13.3 KB

211018 let, var, tool bar, Design Patterns, Architectures, MVC, Dictionary, Downcasting, Function Types as Parameter Types

TIL (Today I Learned)

10์›” 18์ผ (์›”)

ํ•™์Šต ๋‚ด์šฉ

์˜ค๋Š˜์€ ํ™œ๋™ํ•™์Šต์œผ๋กœ ์นดํ›—์„ ์‹œ์ž‘์œผ๋กœ ๋””์ž์ธํŒจํ„ด, ์•„ํ‚คํ…์ฒ˜, MVC์— ๋Œ€ํ•œ ๋‚ด์šฉ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์ผ์š”์ผ ์ €๋…์— ๋ฏธ๋ฆฌ ์˜ˆ์Šต์„ ํ•˜๊ณ  ๊ฐ€์„œ ํ•™์Šต์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ํฐ ๋„์›€์ด ๋˜๊ธด ํ–ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ญ์‹œ ๋ญ”๋ง์ธ์ง€ ๋ชจ๋ฅด๋Š” ํฌ์ธํŠธ๊ฐ€ ๋œจ๋ฌธ๋œจ๋ฌธ ์žˆ์–ด์„œ ๋ณต์Šต์ด ํ•„์š”ํ•ด๋ณด์˜€๋‹ค. ์ดํ›„ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ํŒ€์›์ธ ์ œ์ดํ‹ฐ์™€ ํ•จ๊ป˜ ๊ทธ๋ผ์šด๋“œ ๋ฃฐ๊ณผ STEP 1์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

ย 

๋ฌธ์ œ์  / ๊ณ ๋ฏผํ•œ ์ 

  • ํ™”๋ฉด ํ•˜๋‹จ์— ์•ก์…˜์„ ๋ชจ์•„๋‘” ๋ฐ”์˜ ์ด๋ฆ„...๋ชฐ๋ผ
  • Swift๊ฐ€ var๋ณด๋‹ค let์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ? ๋‚˜ ์•„๋Š”๋ฐ... ๋ญ์˜€์ง€?
  • ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?
  • ๋””์ž์ธ ํŒจํ„ด ๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค๊ฐ€ ์ฑ…์„ ์ถ”์ฒœ๋ฐ›์•˜๋‹ค.
  • Design Patterns vs Architectures
  • ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์„ค๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ๊ณผ์ผ์„ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ๋ชจ๋“  ๊ณผ์ผ์„ ํ•œ๊บผ๋ฒˆ์— ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฒ•
  • ์ •ํ•ด์ง„ ๋ ˆ์‹œํ”ผ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜๋ฅผ ํ•ด์ฃผ๋ฉด ์ข‹์„๊นŒ?
  • ๊ณผ์ผ ์žฌ๊ณ ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์—ฐ์‚ฐ์ž๋กœ ๋”ํ•˜๊ณ  ๋นผ์ค„ ์ˆ˜๋Š” ์—†์„๊นŒ?
  • ๋ชจ๋“  ๊ณผ์ผ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ ๊ฐœ๋ณ„์ ์œผ๋กœ๋„ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ณ  ์‹ถ๋‹ค.
  • ์—๋Ÿฌ์ฒ˜๋ฆฌ์‹œ ์ผ€์ด์Šค๋ณ„๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

ย 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ํ™”๋ฉด ํ•˜๋‹จ์— ์•ก์…˜์„ ๋ชจ์•„๋‘” ๋ฐ”์˜ ์ด๋ฆ„์€ Tool bar์ด๋‹ค.
  • Swift๊ฐ€ var ๋ฐ let์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ์ฐธ๊ฒฌํ•˜๋Š” ์ด์œ ?
    • ์ƒ์ˆ˜(let)๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฐ’์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด Swift๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ํ˜น์‹œ๋‚˜ ๋‚˜์ค‘์— ์‹ค์ˆ˜๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š”๋ฐ ์ข‹๋‹ค.
    • let์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์˜ˆ์•ฝ๋œ๋‹ค. 10๊ฐœ์˜ ์ƒ์ˆ˜์™€ 10๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ 10๊ฐœ์˜ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๊ณ  ์ดˆ๊ธฐํ™” ๋œ๋‹ค. (ํ• ๋‹น๋œ ๊ฐ’์€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ) ์ƒ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋Š˜์–ด๋‚˜๋Š”๋ฐ, ๊ฐ’์ด ํ• ๋‹น๋˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹คํ–‰์‹œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ๊ตฌ๋งคํ•˜์˜€๋‹ค. ์‹œ๊ฐ„๋‚  ๋•Œ ๋งˆ๋‹ค ์ •๋…ํ•ด์•ผ์ง€.
  • Design Patterns vs Architectures
    • Architecture ํฐ ๊ทธ๋ฆผ, ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ „๋ฐ˜์ ์ธ ํฐ ๊ทธ๋ฆผ, ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ ex) ์„œ์–‘ ๊ฑด์ถ•๋ฌผ ์–‘์‹, MVC architecture
    • Design Patten ์ด ์•„ํ‚คํ…์ฒ˜ ์•ˆ์—์„œ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๋Š” ํ•ด๊ฒฐ๋ฐฉ์‹ ex) ์„œ์–‘ ๊ฑด์ถ•๋ฌผ ์•ˆ์˜ ๋ถˆํŽธํ•œ ์„ค๊ณ„ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์„œ ํ˜„์žฌ์— ๋งž๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ
  • ์ œ์ดํ‹ฐ์™€ ํ•จ๊ป˜ ์ˆœ์„œ๋„๋ฅผ ๊ทธ๋ ค๋ณผ๊นŒ...? ํ–ˆ์—ˆ๋Š”๋ฐ ๋ชจ๋“  ์Šคํ…์ด ์˜คํ”ˆ ๋˜์ง€๊ฐ€ ์•Š์•„์„œ ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ์• ๋งคํ–ˆ๋‹ค. ์ผ๋‹จ STEP 1์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ•˜์˜€๊ณ , ๋…ธ์…˜์œผ๋กœ ๊ฐ™์ด ๋ฉ”๋ชจํ•ด๊ฐ€๋ฉด์„œ FruitStore์™€ JuiceMaker์˜ ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ํž˜์ผ๋‹ค.
  • ๊ณผ์ผ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ •ํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๋‚˜์—๊ฒŒ ์ข‹์€ ์ƒ๊ฐ์ด ์žˆ์–ด์„œ ์ œ์ดํ‹ฐ์—๊ฒŒ ์ œ์•ˆ์„ ํ–ˆ๋‹ค. ์šฐ์„  ๊ณผ์ผ๊ณผ ๊ณผ์ผ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ Dictionary๊ฐ€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์˜๊ฒฌ์„ ๋‚˜๋ˆ„์—ˆ๊ณ , Dictionary ์ด๋‹ˆ์…œ๋ผ์ด์ € ์ค‘์— ํŠœํ”Œ์„ ๋ฐ›์•„์„œ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์žˆ์–ด์„œ ์ฐพ์•„๋ณด์•˜๊ณ , ์ž˜ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.
    • Dictionary init(uniqueKeysWithValues:)
  • ์ •ํ•ด์ง„ ๋ ˆ์‹œํ”ผ๋ฅผ ๋ฐ›์•„์„œ ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋ ˆ์‹œํ”ผ๋ฅผ ์–ด๋–ค์‹์œผ๋กœ ๋ฐ›์•„์˜ฌ์ง€ ์ข‹์€ ์ƒ๊ฐ์ด ์•ˆ๋‚ฌ๋‹ค. ์ œ์ดํ‹ฐ๊ฐ€ Dictionary๋กœ ํ†ตํ•ด์„œ ๋ฐ›๋Š” ๊ธฐ๋ฐœํ•œ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ผ์„œ ํ™œ์šฉํ•ด๋ณด์•˜๋‹ค.
  • ์—ฐ์‚ฐ์ž๋กœ ๋”ํ•˜๊ณ  ๋นผ๋Š” ๋ฐฉ๋ฒ• ์—ญ์‹œ ์ œ์ดํ‹ฐ์˜ ์•„์ด๋””์–ด์˜€๋Š”๋ฐ, ๋ฐ”๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์˜€๋‹ค.
var num = 3
func operate(operNum: Int, fun: (Int, Int) -> Int) {
    num = fun(num, operNum)
}
operate(operNum: 6, fun: +)
print(num) // 9
  • ๊ณผ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์€ ์—†์ง€๋งŒ ๊ถ๊ธˆํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๋‹ค์‹œ ๋ณต์Šตํ•˜๊ณ  ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ...
  • ์›๋ž˜๋Š” enum ๋‚ด๋ถ€์—์„œ static ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ถœ๋ ฅํ•ด์ฃผ๊ธฐ๋กœ ํ•˜์˜€์œผ๋‚˜, ๊ผญ static ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์ง€ ์•Š์•„๋„ Error ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์šด์บ์ŠคํŒ…(as)์„ ํ†ตํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์ค„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
enum RequestError: Error {
    case wrongInput
    case notFound
    case fruitStockOut
    
    func printErrorMessage() {
        switch self {
        case RequestError.wrongInput:
            print("์ˆ˜๋Ÿ‰์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.")
        case RequestError.notFound:
            print("์„ ํƒํ•œ ๊ณผ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.")
        case RequestError.fruitStockOut:
            print("๊ณผ์ผ์˜ ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.")
        }
    }
}
do {
    try maker.fruitsMixer(juice: .strawberryBanana)
} catch let error as RequestError {
    error.printErrorMessage()
}

ย 

๊ณต๋ถ€๋‚ด์šฉ ์ •๋ฆฌ

Design Pattern

Design Pattern

  • ์„ค๊ณ„ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ด๋Š” ํ…œํ”Œ๋ฆฟ
  • ์„ ๋ฐฐ๋“ค์˜ ์‚ฝ์งˆ ๊ธฐ๋ก
  • ์ฝ”๋“œ์˜ ๋ชจ์–‘์ƒˆ ๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ๊ณตํ†ต์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž์ฃผ ์“ฐ์ด๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•œ ํŒจํ„ด์ด๋‹ค.

์‚ฌ์šฉ ์ด์œ 

๋””์ž์ธ ํŒจํ„ด์„ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์šด์šฉ์„ฑ์ด ๋†’์•„์ง€๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์ตœ์ ํ™”์— ๋„์›€์ด ๋œ๋‹ค.

  • OOP์˜ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ๋ฐฉ
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ ์‚ฌ์ด์˜ ํ˜‘์—… ํšจ์œจ ํ–ฅ์ƒ
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ ์‚ฌ์ด์˜ ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
  • ์ฝ”๋“œ์˜ ์•ˆ์ •ํ™” ๋ฐ ์ตœ์ ํ™”
  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

์ฃผ์–ด์ง„ ํŒจํ„ด์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ์„ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋””์ž์ธ ํŒจํ„ด์— ์ง‘์ฐฉํ•˜๊ฒŒ ๋˜๋ฉด ์œ ์—ฐํ•˜๊ฒŒ ํŒจํ„ด์„ ์ ์šฉ ๋ฐ ๋ณ€๊ฒฝ์„ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 100ํผ์„ผํŠธ ์ง€ํ‚ฌ ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ์•„๋‘๋ฉด ์“ธ ์ผ์ด ๋งŽ๋‹ค.

Architectures

Architectures

๊ฐ„๋‹จํ•˜๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์œ„ํ‚ค์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด์—์„œ์˜ ๊ณตํ†ต์ ์ธ ๋ฐœ์ƒ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

์‚ฌ์šฉ ์ด์œ 

ํ”„๋กœ๊ทธ๋žจ์€ ์ œ๋Œ€๋กœ ์ž‘์„ฑ๋งŒ ๋œ๋‹ค๋ฉด ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์œ ์ง€๋ณด์ˆ˜์— ๊ต‰์žฅํžˆ ๋งŽ์€ ๋น„์šฉ์ด ๋“ค์–ด๊ฐ€๋ฉฐ ์‹ค๋ ฅ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๊ธฐ์—๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ข‹์€ ์•„ํ‚คํ…์ฒ˜๋ž€?

  • ๊ท ํ˜•์žกํžŒ ๋ถ„๋ฐฐ(Balanced Distribution)
    • ๊ฐ์ฒด ์ง€ํ–ฅ ์›์น™ ์ค‘ Single Responsibility์— ๊ธฐ๋ฐ˜ > ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ๊ฐ–๋Š”๋‹ค
    • ๋ชจ๋“ˆ(ํด๋ž˜์Šค)๋“ค์˜ ๋…๋ฆฝ์„ฑ์ด ๋–จ์–ด์ง€๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค
  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ (Testablity)
    • ํ…Œ์ŠคํŠธ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋‹ค.
  • ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด์ง€ (Easy of Use)
    • ๊ฐœ๋ฐœ ์†๋„์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.
  • ๋‹จ๋ฐฉํ–ฅ์„ฑ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Unidirectional Data Flow)
    • ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ ์‰ฌ์šด ๋””๋ฒ„๊น…์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์›์ธ์„ ์ฐพ๊ธฐ ํž˜๋“ค์–ด ์ง€๋Š” ๊ณต์œ  ์ž์›์˜ ์‚ฌ์šฉ๋„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

4๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑ ์‹œํ‚ค๋Š” ์™„๋ฒฝํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊น ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ ์„ฑ๊ฒฉ์— ๋งž์ถฐ์„œ ์ ์ ˆํ•œ ์•„ํ‚คํ…์ฒ˜ ๋„์ž…์ด ํ•„์š”ํ•˜๋‹ค.

iOS์—์„œ๋Š” 4๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ๊ท ํ˜•์žกํžŒ ๋ถ„๋ฐฐ๋ฅผ ์œ„ํ•ด์„œ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด ์ฝ”๋”ฉ์ด ์ง„ํ–‰๋œ๋‹ค.

  • Modelโ€จ๋ฐ์ดํ„ฐ ์กฐ์ž‘์ด ์ผ์–ด๋‚˜๊ณ  ์ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„
  • Viewโ€จ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์‹œ๊ฐ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ UI์— ํ•ด๋‹น.
  • Controller / Presenter / ViewModelโ€จ์ด ๋ถ€๋ถ„์€ Model๊ณผ View ์‚ฌ์ด์˜ ์ค‘์žฌ์ž๋กœ View๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•œ ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์— ๋”ฐ๋ผ ๋™์ž‘ํ•˜๋ฉฐ Model์— ๊ฐ’์˜ ์กฐ์ •์„ ์š”์ฒญํ•˜๋ฉฐ Model ๊ฐ’์˜ ๋ณ€ํ™”์— ๋งž๊ฒŒ View๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์—ญํ•  ๊ทธ๋ž˜์„œ iOS์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ธ MVC, MVP, MVVM๊ฐ€ ์žˆ๋‹ค.
Design Patterns vs Architectures
  • Architecture ํฐ ๊ทธ๋ฆผ, ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ „๋ฐ˜์ ์ธ ํฐ ๊ทธ๋ฆผ, ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ ex) ์„œ์–‘ ๊ฑด์ถ•๋ฌผ ์–‘์‹, MVC architecture
  • Design Patten ์ด ์•„ํ‚คํ…์ฒ˜ ์•ˆ์—์„œ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๋Š” ํ•ด๊ฒฐ๋ฐฉ์‹ ex) ์„œ์–‘ ๊ฑด์ถ•๋ฌผ ์•ˆ์˜ ๋ถˆํŽธํ•œ ์„ค๊ณ„ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์„œ ํ˜„์žฌ์— ๋งž๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ
MVC (Model-View-Controller)

Xcode ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ Model, View, Controller ํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

Model

์•ฑ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ• ์ง€ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์ •์˜๋˜๊ณ , ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ(ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด ๋“ฑ)์™€ ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ •์˜๋œ๋‹ค.

View

์‚ฌ์šฉ์ž์—๊ฒŒ ๋ง ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Storyboard ํŒŒ์ผ์„ ๋น„๋กฏํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์˜์—ญ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

Controller

Model ๊ณผ View ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. Controller๋Š” Model์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ๋ช…๋ น์„ ๋‚ด๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ช…๋ น์„ ํ† ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ถ€๋ถ„๋„ ์ˆ˜์ •์„ ํ•œ๋‹ค. ๋ณดํ†ต ์—ฌ๊ธฐ์„œ @IBAction ํ•จ์ˆ˜๋“ค์ด ์ •์˜๋œ๋‹ค. ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ View๋ฅผ ํ†ตํ•ด Interaction์„ ํ•˜๋ฉด Controller๊ฐ€ ์ด๋ฅผ controlํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Model ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„, View์—์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ๋“ค์„, ๊ทธ๋ฆฌ๊ณ  Controller ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ Model ์„ ํ™œ์šฉํ•ด์„œ View ์—๊ฒŒ ๋ณด์—ฌ์งˆ ๊ฒƒ์ธ์ง€๋งŒ ์ •์˜ํ•˜๋ฉด ๋˜๋‹ˆ, ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.

MVC ํŒจํ„ด์—์„œ ๊ฐ ์˜์—ญ์ด ๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

Controller๋Š” Model๊ณผ View์— ์ง์ ‘ ์ง€์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Model๊ณผ View๋Š” Controller์— ์ง์ ‘์ ์œผ๋กœ ์•Œ๋ฆด ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋งŒ์•ฝ Model์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ๋ฆฌ๊ฑฐ๋‚˜, View์—์„œ ์‚ฌ์šฉ์ž์˜ action์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ Controller์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์•Œ๋ฆด๊นŒ?

View to Controller

์ปจํŠธ๋กค๋Ÿฌ๋Š” View์— ๋Œ€ํ•ด์„œ outlet์„ ์ด์šฉํ•ด์„œ View์—๊ฒŒ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. View๋Š” target - Action ๊ตฌ์กฐ๋กœ ์‚ฌ์šฉ์ž์˜ ํ–‰์œ„์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ๋ฐฉ์‹์œผ๋กœ ํ–‰์œ„์— ๋Œ€ํ•œ ์š”์ฒญ (delegate), ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š”์ฒญ(data-source)์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Model to Controller

์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋ธ์€ Notification & KVO ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ชจ๋ธ์˜ ๋ณ€ํ™”๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  • ๋‹ค๋ฅธ ํŒจํ„ด์— ๋น„ํ•ด ์ฝ”๋“œ๋Ÿ‰์ด ์ ๋‹ค
  • ์• ํ”Œ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์นœ์ˆ™ํ•œ ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

๋‹จ์ 

  • ์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋ทฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
  • View์™€ Controller๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉฐ Controller๊ฐ€ View์˜ Lift Cycle๊นŒ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— View์™€ Controller๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ํž˜๋“ค์–ด์ง„๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ Controller์— ๋ฐ€์ง‘๋  ์ˆ˜ ์žˆ๋‹ค. Life Cycle ๊ด€๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ delegate๋‚˜ datasource๊ด€๋ฆฌ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, DB์— ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋“ฑ ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ Controller์— ์ž‘์„ฑ๋˜๋ฉด Controller์˜ ํฌ๊ธฐ๋Š” ๋น„๋Œ€ํ•ด์ง€๊ณ  ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ๋ณต์žกํ•ด์ง€๊ฒŒ ๋œ๋‹ค.
  • ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋น„์œ ํ•ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Massive View Contorller๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค
  • ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•ด์ง„ ์ฝ”๋“œ๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค.

MVC ์•„ํ‚คํ…์ฒ˜๋Š” ์•„ํ‚คํ…์ฒ˜์˜ ๊ธฐ์ค€์— ์–ผ๋งˆ๋‚˜ ๋ถ€ํ•ฉํ• ๊นŒ?

  • Distributionโ€จView์™€ Model์€ ๋ถ„๋ฆฌ๋˜์—ˆ์ง€๋งŒ View์™€ Controller๋Š” ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
  • Testabilityโ€จView์™€ Controller๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์„œ Model๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Easy of Useโ€จ๊ฐ€์žฅ ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ํ•„์š”ํ•˜๋ฉฐ ๊ฒฝํ—˜์ด ์ ์€ ๊ฐœ๋ฐœ์ž๋“ค๋„ ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž˜ ๋ชจ๋ฅผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํŒจํ„ด์ด์ง€๋งŒ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—ฌ๋„ ๋งŽ์€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค.