[Stanford iOS] Lecture 2) ์ •๋ฆฌ (MVC, Switch, Enum, Struct)
iOS ๐Ÿ”ฅ/Stanford Lecture

[Stanford iOS] Lecture 2) ์ •๋ฆฌ (MVC, Switch, Enum, Struct)

MVC

Model, View, Controller ์„ธ ๊ฐœ์˜ ๋‹ค๋ฅธ ์บ ํ”„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ

Model โ‡’ application์ด ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€. ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ๊ทธ๋ ค์ง€๋Š”๊ฐ€๋Š” ๊ด€๊ณ„ ์—†์Œ
Controller โ‡’ ๋ชจ๋ธ์ด ์Šคํฌ๋ฆฐ์— ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋  ๊ฒƒ์ธ๊ฐ€. How
View โ‡’ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•˜์œ„์ข…์†์ž๋ผ ๋ณด๋ฉด ๋จ. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ (outlet์ด ๊ทธ ์—ฐ๊ฒฐ์„ ์˜๋ฏธํ•จ)

์ด๋ฏธ์ง€์—์„œ ๋…ธ๋ž€์„ ์€ ๊ฑด๋„ ์ˆ˜ ์—†์Œ.

ํฐ ์„ ์€ ๊ฑด๋„ ๋•Œ ์œ ์˜ํ•ด์•ผ ํ•จ.

๋ชจ๋ธ๊ณผ UI๋Š” ๋…๋ฆฝ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‘˜์€ ์„œ๋กœ ์†Œํ†ตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋ทฐ๊ฐ€ Controller์— ์ด์•ผ๊ธฐํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์€ target-action์ž„. @IBAction

ScrollView๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์Šคํฌ๋กค์ด ์‹œ์ž‘๋๋‹ค๊ณ  ๋งํ• ๊นŒ?
"์ด๋ด, ์ด ์นœ๊ตฌ ๋ฐฉ๊ธˆ ์Šคํฌ๋กค๋ง ์‹œ์ž‘ํ–ˆ์–ด." "์‚ฌ์šฉ์ž๊ฐ€ ์คŒ ์ด๋งŒํผ ํ™•๋Œ€ํ–ˆ์–ด" "์ง€๊ธˆ ์ˆ˜์ง์œผ๋กœ ์Šคํฌ๋กคํ•˜๋Š” ๊ฑธ ํ—ˆ์šฉํ•ด๋„ ๋ ๊นŒ?"
์ด๋Ÿฐ ์งˆ๋ฌธ์ด should, will, did ๊ฐ™์€ ๋ง์„ ํฌํ•จํ•ด์„œ ์งˆ๋ฌธ์„ ๋˜์ง€๊ฒŒ ๋˜๊ณ , ์ด ํ–‰์œ„๋Š” Delegate ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋จ.

Delegate ๋Š” ๋‹จ์ˆœํžˆ ๋ทฐ ์•ˆ์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ, ์ฆ‰ ํ”„๋กœํ† ์ฝœ์ž„.

ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋‹ค๋ฅธ ๋…€์„์ด ๋Œ€์‹  ์‹คํ–‰ํ•˜๊ธฐ๋กœ ์•ฝ์†๋œ ๋ฉ”์†Œ๋“œ๋“ค์„ ๋ชจ์•„๋†“์€ ์„ค๋ช…์ž„.

๋ทฐ๋Š” ๋น„๋ก ๊ทธ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋”๋ผ๋„ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ will, should, did๊ฐ™์€ ๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ•˜๋ฉด ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Œ.

View do not own the data they display.
๋ทฐ๋Š” ์ž์‹ ์ด ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์—†์Œ.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ฃผ๋ƒ? ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋ฌผ์–ด๋ด์„œ.

์ด ๋•Œ๋Š” will, should, did ๋Œ€์‹  ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์Œ. ์ด ๊ณณ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ฌ๋ผ๊ณ  ํ•˜๋˜์ง€, ๋ช‡ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€.. ์—ฌ๊ธฐ ์“ฐ์ด๋Š” delegate๋ฅผ data Source ๋ผ๊ณ  ๋ถˆ๋ฆ„.

๋”ฐ๋ผ์„œ ์–ด๋–ค ๋ทฐ์—๋Š” data Source๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๊ณ  ์ด ํ”„๋กœํ† ์ฝœ์˜ ํฌ์ธํ„ฐ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๋จ.
์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ž๊ธฐ์ž์‹ ์„ ๊ทธ๋ ‡๊ฒŒ ์ง€์ •ํ•ด์„œ ๋ทฐ๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๊ด€์—ฌํ•˜๊ฒŒ ๋จ.
์ฆ‰, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์™€ ๋ชจ๋ธ๊ฐ„์˜ ํ•ด์„๊ฐ€์ž„.

๋ชจ๋ธ์ด ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์–˜๊ธฐํ•  ๋ฐฉ๋ฒ•์€ ์—†์Œ.

๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” UI์™€ ์ƒ๊ด€์—†๋Š” ๊ฐ’์ด, ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฉด?

๋ชจ๋ธ์˜ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋ผ๋””์˜ค-๋ฐฉ์†ก๊ตญ ๋ชจ๋ธ์„ ์ด์šฉํ•จ. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ทธ ๋ฐฉ์†ก๊ตญ์— ์ฑ„๋„์„ ๋งž์ถ”์–ด ๋†“์Œ.

iOS์—์„œ๋Š” ํ•˜๋‚˜์˜ MVC๊ฐ€ ๋ณดํ†ต ํ•˜๋‚˜์˜ ํ™”๋ฉด์„ ์ œ์–ดํ•จ.

์—ฌ๋Ÿฌ MVC๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋‚˜์˜ ํฐ ์•ฑ์ด ๋งŒ๋“ค์–ด์ง.

๊ธฐ๋ณธ์ ์œผ๋กœ MVC๋Š” ๋˜ ๋‹ค๋ฅธ MVC์˜ ๋ทฐ ์ผ๋ถ€๋กœ์„œ๋งŒ ์ผํ•  ์ˆ˜ ์žˆ์Œ.

์˜ˆ์‹œ๋กœ TabBarController ๊ฐ™์€ ๋ช‡๋ช‡ MVC๋Š” ๋ทฐ์˜ ์ผ๋ถ€๋กœ์„œ 3,4๊ฐœ์˜ ๋ณ„๊ฐœ์˜ MVC๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

์ ˆ๋Œ€๋กœ ๋ชจ๋ธ์— UIKit์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ง์•„์•ผ ํ•จ.

Foundation โ‡’ Core Service ๊ณ„์ธต, UI๊ฐ€ ์•„๋‹Œ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋“ค์ด ์žˆ์Œ

API

ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๊ฒƒ๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šค

๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ „๋ถ€์ž„.

Button์—์„œ currentTitle์€ ์ฝ๊ธฐ์ „์šฉ computed property ์ด๋ฏ€๋กœ get๋งŒ ์žˆ์Œ.

internal๊ณผ public์˜ ์ฐจ์ด

internal์€ ๋ชจ๋“ˆ ์•ˆ์—์„œ๊ณต๊ฐœ๋œ๊ฒƒ, public์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—๋„ ๊ณต๊ฐœ๋จ

UIKit์—๋Š” ์ˆ˜๋งŒ๊ฐœ์˜ public๋ฉ”์†Œ๋“œ, ์ˆ˜์ฒœ๊ฐœ์˜ internal method๊ฐ€ ์žˆ์Œ. ์ด internal ๋ฉ”์†Œ๋“œ๋Š” UIKit ํด๋ž˜์Šค๊ฐ„์—๋งŒ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Œ. ์šฐ๋ฆฐ ๊ทธ๊ฒŒ ๋ญ”์ง€ ์•Œ ์ˆ˜ ์—†์Œ.

์•ฑ์—์„œ๋Š” internal๊ณผ public์ด ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋จ.

Switch

swift์—์„œ switch๋Š” ๋ชจ๋“  ๊ฐ’์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ. ๋งŒ์•ฝ String์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋ฌดํ•œ์ด๋ฏ€๋กœ default๊ฐ€ ํ•„์š”ํ•จ.

swift์—์„œ switch๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•จ. ์—ฐ๊ด€๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ํŒจํ„ด ๋งค์นญ์„ ํ•  ์ˆ˜ ์žˆ์Œ.

๋‹ค์Œ์€ ์‚ฌ์šฉ๋ฒ• ์˜ˆ์‹œ

    func performOperation(symbol: String) {
        if let operation = operations[symbol] {
            switch operation {
            case .Constant(let value):
                accumulator = value
            case .UnaryOperation(let foo):
                accumulator = foo(accumulator)
            case .BinaryOperation(let foo):
                executePendingOperation()
                pending = PendingBinaryOperation(binaryOperation: foo, firstOperand: accumulator)
            case .Equals:
                executePendingOperation()
            }
        }
    }

Enum

๋ณ„๊ฐœ์˜ ๊ฐ’์„ ๋ชจ์•„๋†“์€ ์„ธํŠธ, ์„œ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ

์Šค์œ„ํ”„ํŠธ์—์„œ enum์€ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ, ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ

๊ณ„์‚ฐ ๋ณ€์ˆ˜๋Š” ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €์žฅ ๋ณ€์ˆ˜๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ.

์ƒ์†ํ•˜๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์—†์Œ

value type์ž„.

๋‹ค์Œ์€ ์‚ฌ์šฉ๋ฒ• ์˜ˆ์‹œ

    var operations:[String:Operation] = [
        "e":.Constant(M_E),
        "ฯ€":.Constant(Double.pi),
        "โˆš":.UnaryOperation(sqrt),
        "cos":.UnaryOperation(cos),
        "ร—":.BinaryOperation({$0 * $1}),
        "+":.BinaryOperation({$0 + $1}),
        "-":.BinaryOperation({$0 - $1}),
        "รท":.BinaryOperation({$0 / $1}),
        "=":.Equals
    ]

    enum Operation {
        case Constant(Double)
        case UnaryOperation((Double) -> Double)
        case BinaryOperation((Double, Double) -> Double)
        case Equals
    }

Struct

value type์ž„

swift์—์„œ ํ•จ์ˆ˜ํƒ€์ž…์€ Double Type๊ณผ ์ฐจ์ด๊ฐ€ ์—†์Œ. ๋˜‘๊ฐ™๋‹ค.

struct๋Š” class์™€ ๊ฐ™์Œ.

์ƒ์†์€ ํ•  ์ˆ˜ ์—†์Œ.

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€, struct๋Š” value type์ž„.

class๋Š” ์ฐธ์กฐ

์ฐธ์กฐํ˜•์‹์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์€, ๊ทธ๊ฒŒ heap ์–ด๋”˜๊ฐ€์— ์žˆ๋‹ค๊ฐ€ ๋ฉ”์†Œ๋“œ๋‚˜ ์–ด๋””๋ก ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์‹ค์ œ๋ก  pointer(๋ฉ”๋ชจ๋ฆฌ)์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž„.

๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์ „๋‹ฌํ•  ๋•Œ ๊ทธ๊ฑธ ๋ณต์‚ฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž„. ๊ทธ๋ ‡๋‹ค๊ณ  Swift์—์„œ ๊ผญ stack์„ ํ†ตํ•ด ๋ณต์‚ฌ๋˜๋Š” ๊ฑด ์•„๋‹˜. Swift๋Š” ๊ฐ’ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌํ•  ๋•Œ, ๊ฑด๋“ค๊ธฐ ์ „๊ฐ€์ง€๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ณต์‚ฌ๊ฐ€ ์•ˆ๋จ. (๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ณต์‚ฌ๋œ๋‹ค๊ณ  ํ•จ)

๊ตฌ์กฐ์ฒด๋Š” ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ, ๊ตฌ์กฐ์ฒด์—์„œ ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋Š” ๊ตฌ์กฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ์ธ์ž๋กœ ๊ฐ–๊ฒŒ ๋จ.

๋‹ค์Œ์€ ์‚ฌ์šฉ๋ฒ• ์˜ˆ์‹œ์ž„.

    struct PendingBinaryOperation {
        var binaryOperation: (Double, Double) -> Double
        var firstOperand: Double
    }

Closure

๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ผ์ธ ํ•จ์ˆ˜ ( ์ธ๋ผ์ธ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ํ˜ธ์ถœ์—†์ด ๊ทธ ์œ„์น˜์—์„œ ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜)

ํ™˜๊ฒฝ ์ƒํƒœ๋ฅผ ์บก์ณํ•˜๋Š” ์ธ๋ผ์ธ ํ•จ์ˆ˜

'iOS ๐Ÿ”ฅ > Stanford Lecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Stanford iOS] Lecture 1) ์ •๋ฆฌ (Cocoa Touch, MVC, Optional)  (0) 2021.01.24