Giter Club home page Giter Club logo

ios-bank-manager's Introduction

πŸ’² 은행창ꡬ λ§€λ‹ˆμ € for UI-App UserπŸ’Έ

πŸ“– λͺ©μ°¨

  1. μ†Œκ°œ
  2. νŒ€μ›
  3. νƒ€μž„λΌμΈ
  4. UML & 파일트리
  5. μ‹€ν–‰ ν™”λ©΄
  6. νŠΈλŸ¬λΈ” μŠˆνŒ…
  7. νŒ€ 회고
  8. 참고 링크

1. πŸ“’ μ†Œκ°œ

Dear. UI-App User Customer

Bank에 업무λ₯Ό 보러 μ˜€μ…¨λ‚˜μš”?

저희 은행은 10λͺ…μ”© λŒ€κΈ°μ€‘μ— μΆ”κ°€λ₯Ό ν•΄λ“œλ¦¬κ³  μžˆμŠ΅λ‹ˆλ‹€!

μˆœμ„œκ°€ 되면 BankClerk이 μˆœλ²ˆμ— 따라 업무쀑 λΌμΈμ—μ„œ ν˜ΈμΆœν•΄λ“œλ¦½λ‹ˆλ‹€.

μž μ‹œλ§Œ κΈ°λ‹€λ € μ£Όμ„Έμš”~

핡심 κ°œλ… 및 κ²½ν—˜

  • MVC
    • Model, View, Controllerκ°€ ν•˜λ‚˜μ˜ μ—­ν• λ§Œ ν•  수 μžˆλ„λ‘ κ΅¬ν˜„
  • Timer
    • Timerλ₯Ό μ΄μš©ν•˜μ—¬ μ—…λ¬΄μ‹œκ°„μ„ μΈ‘μ •ν•  수 μžˆλŠ” WorkTimer κ΅¬ν˜„
  • CustomView
    • CustomViewλ₯Ό λ§Œλ“€μ–΄ View와 Controllerλ₯Ό λΆ„λ¦¬ν•˜κ³  μ½”λ“œλ‘œλ§Œ UI κ΅¬ν˜„
    • StackViewλ₯Ό ν™œμš©ν•˜μ—¬ Label의 μΆ”κ°€ μ‚­μ œ κΈ°λŠ₯을 κ΅¬ν˜„
  • Concurrency UI update
    • λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ Operation.main을 μ΄μš©ν•œ UI μ—…λ°μ΄νŠΈ μž‘μ„± μˆ˜ν–‰
  • Swift Package Manager
    • μ½˜μ†”μ•±μ˜ Customerλ₯Ό 둜컬 νŒ¨ν‚€μ§€λ‘œ λ§Œλ“€μ–΄ UI앱에 ν™œμš©

2. πŸ‘€ νŒ€μ›

Serena 🐷 Erick 🦦

3. ⏱️ νƒ€μž„λΌμΈ

ν”„λ‘œμ νŠΈ κΈ°κ°„ : 2023.07.10 ~ 2023.07.21

λ‚ μ§œ λ‚΄μš©
2023.07.10 ▫️ Linked List κ΅¬ν˜„
▫️ Linked Listλ₯Ό μ΄μš©ν•œ Queue κ΅¬ν˜„
2023.07.11 ▫️ μ½”λ“œ κ°œμ„ μ„ μœ„ν•œ λ¦¬νŽ™ν† λ§
2023.07.12 ▫️ 고객의 역할을 ν•˜λŠ” Customer
▫️ μ€ν–‰μ›μ˜ 역할을 ν•˜λŠ” BankClerk κ΅¬ν˜„
▫️ μ€ν–‰μ˜ 업무λ₯Ό ν•˜κΈ° μœ„ν•œ Bank κ΅¬ν˜„
▫️ Bankλ₯Ό κ΄€λ¦¬ν•˜λŠ” BankManager κ΅¬ν˜„
2023.07.13 ▫️ μ½”λ“œ κ°œμ„ μ„ μœ„ν•œ λ¦¬νŽ™ν† λ§
2023.07.14 ▫️ μ—…λ¬΄μ˜ μ’…λ₯˜λ₯Ό λ‚˜λˆ„κΈ° μœ„ν•΄ WorkType κ΅¬ν˜„
▫️ μ€ν–‰μ›μ˜ 인원에 따라 λΉ„λ™κΈ°μ μœΌλ‘œ 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” 둜직 κ΅¬ν˜„
▫️ μ€ν–‰μ›μ˜ WorkType에 따라 업무λ₯Ό λ‚˜λˆ  μ£ΌλŠ” 둜직 κ΅¬ν˜„
▫️ README μž‘μ„±
2023.07.16 ▫️ μ½”λ“œ κ°œμ„ μ„ μœ„ν•œ λ¦¬νŽ™ν† λ§
▫️ WorkType에 업무 Name μΆ”κ°€
2023.07.17 ▫️ HTTP 개인 곡뢀
2023.07.18 ▫️ μ½”λ“œ κ°œμ„ μ„ μœ„ν•œ λ¦¬νŽ™ν† λ§
2023.07.19 ▫️ Queueλ₯Ό protocol Queueable둜 좔상화
▫️ 은행창ꡬ λ§€λ‹ˆμ € μ•±μ˜ 화면을 κ΅¬μ„±ν•˜λŠ” BankManagerView κ΅¬ν˜„
▫️ DynamicType 적용
2023.07.20 ▫️ MVC 파일 뢄리 및 Timer 개인 곡뢀
2023.07.21 ▫️ SPM ν™œμš©ν•˜μ—¬ 둜컬 라이브러리 μΆ”κ°€
▫️Console App에 κ΅¬ν˜„ν•œ Bankλ₯Ό UI App에 맞게 λ¦¬νŽ™ν† λ§
▫️ μ—…λ¬΄μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” WorkTimer κ΅¬ν˜„
▫️ Controllerμ—μ„œ μ‚¬μš©μž μž…λ ₯에 맞게 Viewλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  Model을 ν˜ΈμΆœν•˜λŠ” 둜직 κ΅¬ν˜„

4. πŸ“Š UML & 파일트리

UML

파일트리

BankManagerUIApp
β”œβ”€β”€ Application
β”‚Β Β  β”œβ”€β”€ AppDelegate.swift
β”‚Β Β  └── SceneDelegate.swift
β”œβ”€β”€ ViewController
β”‚Β Β  └── BankManagerViewController.swift
β”œβ”€β”€ View
β”‚Β Β  └── BankManagerView.swift
β”œβ”€β”€ Model
β”‚Β Β  β”œβ”€β”€ Bank
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Bank.swift
β”‚Β Β  β”‚Β Β  └── BankClerk.swift
β”‚Β Β  └── WorkTimer.swift
└── Extenstion
    β”œβ”€β”€ Double+.swift
 Β Β  └── Notification.Name+.swift

5. πŸ“² μ‹€ν–‰ ν™”λ©΄

졜초 λŒ€κΈ°μΈμ› μΆ”κ°€ μ‹œ 업무 μ™„λ£Œ μ „ λŒ€κΈ°μΈμ› μΆ”κ°€ μ‹œ 업무 μ™„λ£Œ ν›„ λŒ€κΈ°μΈμ› μΆ”κ°€ μ‹œ
업무 쀑 μ΄ˆκΈ°ν™” μ‹œ 업무 μ™„λ£Œ ν›„ μ΄ˆκΈ°ν™” μ‹œ μ΄ˆκΈ°ν™” ν›„ λŒ€κΈ°μΈμ› μΆ”κ°€ μ‹œ

6. πŸ›ŽοΈ νŠΈλŸ¬λΈ” μŠˆνŒ…

MVC νŒ¨ν„΄μ— λ”°λ₯Έ ꡬ쑰 κ³ λ―Ό

πŸ”₯ 문제점

  • Model, View, Controller의 역할에 λŒ€ν•΄ κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ 객체가 μ„œλ‘œμ˜ ν”„λ‘œνΌν‹°μ— 직접 μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹Œ λ©”μ„œλ“œλ₯Ό ν†΅ν•œ μ˜μ‚¬μ†Œν†΅μ„ ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

🧯 해결방법

  • View: ViewλŠ” View객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ 가지고 Constraints μ½”λ“œμ™€ View객체에 데이터λ₯Ό μ„ΈνŒ…ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.
  • Model: λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλŠ” μ½”λ“œμ™€ Controllerμ—μ„œ 이λ₯Ό μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.
  • Controller: View와 Model을 객체둜 가지고 있고 μ‚¬μš©μžμ˜ μž…λ ₯μ΄λ‚˜ νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„λ•Œ λ·°λ₯Ό μ—…λ°μ΄νŠΈ μ‹œν‚€κ±°λ‚˜ Model의 λ‘œμ§μ„ μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€.

ν™”λ©΄ νšŒμ „ / scrollview

πŸ”₯ 문제점

  • ν™”λ©΄ νšŒμ „μ„ 해도 UIκ°€ 기기의 κ°€μž₯μžλ¦¬μ— μž˜λ¦¬μ§€ μ•Šκ³  좜λ ₯될 수 μžˆλ„λ‘ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€.
  • 그리고 ν™”λ©΄ μŠ€ν¬λ‘€μ„ λŒ€κΈ°μ€‘/업무쀑 stackView만 슀크둀이 λ˜λ„λ‘ 할지 전체 화면을 λͺ¨λ‘ μŠ€ν¬λ‘€μ„ 할지 κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€.

🧯 해결방법

  • ν™”λ©΄ νšŒμ „μ„ 해도 UIκ°€ 기기의 κ°€μž₯μžλ¦¬μ— μž˜λ¦¬μ§€ μ•Šκ³  좜λ ₯될 수 μžˆλ„λ‘ scrollViewλ₯Ό 뷰의 μ•ˆμ „κ΅¬μ—­ 내에 μœ„μΉ˜ν•˜κ²Œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ view.safeAreaLayoutGuide와 constraintλ₯Ό μ„€μ •ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
    private func setUpScrollViewConstraints() {
        NSLayoutConstraint.activate([
            scrollView.frameLayoutGuide.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
            scrollView.frameLayoutGuide.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
            scrollView.frameLayoutGuide.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
            scrollView.frameLayoutGuide.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor)
        ])
    }
  • 앱을 μ΄μš©ν•  λ•Œ ν™”λ©΄ λ‚΄ 뷰객체가 μŠ€ν¬λ‘€λ˜λŠ” 것보단 전체 화면을 슀크둀 ν•˜λŠ” μͺ½μ΄ 접근성이 더 μ’‹λ‹€κ³  μƒκ°ν•˜μ—¬ 전체화면이 슀크둀 λ˜λ„λ‘ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 특히 μ•Όκ³° 닷넷을 톡해 배운 λ‚΄μš© λ˜ν•œ ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 슀크둀뷰 μ„€μ • μ‹œ frameκ³Ό multiply을 1둜 맞좘 ν›„ constant 1값을 μ£Όλ©΄ contentview의 크기가 μž‘μ•„λ„ λ“œλž˜κ·Έ 및 슀크둀의 효과λ₯Ό λ‚΄μ—ˆμŠ΅λ‹ˆλ‹€.
    let contentViewHeightConstraints = contentView.heightAnchor.constraint(equalTo: scrollView.frameLayoutGuide.heightAnchor, constant: 1)
    contentViewHeightConstraints.priority = .init(1)
    contentViewHeightConstraints.isActive = true

비동기 처리 둜직 처리

πŸ”₯ 문제점

  • 직전 μŠ€ν…κ³Ό 달리 UI에 λ§žμΆ”μ–΄ ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μ„±ν•˜λ‹€λ³΄λ‹ˆ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ 비동기λ₯Ό κ΅¬ν˜„ν• μ§€ κ³ λ―Όν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 첫번째둜 DispatchQueueλŠ” Operationκ³Ό 달리 μŠ€λ ˆλ“œμ— μž‘μ—…μ„ 전달 μ‹œ λ³€κ²½ 및 μ·¨μ†Œκ°€ λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 이에 UIλŠ” mainμŠ€λ ˆλ“œμ—μ„œλ§Œ 진행기 λ•Œλ¬Έμ— μž‘λ™ μ‹œ 좩돌의 μš°λ €κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    • λ‘λ²ˆμ§Έλ‘œ μ½˜μ†”μ•±κ³Ό UIλ₯Ό κ΅¬ν˜„ν•  λ•Œ λ·°μ»¨νŠΈλ‘€μ΄λΌλŠ” κ°€μž₯ 큰 차이가 μƒκ²ΌμŠ΅λ‹ˆλ‹€. 이에 ꡬ쑰λ₯Ό 이전과 λ™μΌν•˜κ²Œ μ§„ν–‰ν•˜κΈ°μ—” μ–΄μƒ‰ν•œ 뢀뢄이 생길 수 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€

🧯 해결방법

  • Operation으둜 μž‘μ—…μ„ νƒ€μž…ν™” μ‹œμΌœμ€„ 수 있고, Queueλ₯Ό μ΄μš©ν•œ μž‘μ—…κ΄€λ¦¬κ°€ 더 μ‰¬μ›Œ μ½”λ“œκ°€ κ°„κ²°ν•˜λ©° 가독성이 μ’‹μ•„μ Έ GCD둜 κ΅¬ν˜„λ˜μ–΄ 있던 비동기 λ‘œμ§μ„ Operation으둜 λ³€κ²½ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • BankClerk을 μ—…λ¬΄λ³„λ‘œ λ‚˜λˆ  μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μ•„λ‹Œ μ—…λ¬΄λ³„λ‘œ OperationQueueλ₯Ό λ‚˜λˆ  μƒμ„±ν•˜μ—¬ μŠ€λ ˆλ“œ 관리λ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 그리고 BankClerk.carryOutBankServiceλ₯Ό BlockOperation으둜 νƒ€μž…ν™”ν•˜μ—¬ 업무별 Queue에 λ„£μ–΄μ£ΌλŠ” κ²ƒμœΌλ‘œ 비동기 처리λ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • μ΄ˆκΈ°ν™” λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ 이미 큐에 λ“€μ–΄κ°„ μž‘μ—…μ„ cancelAllOperationsλ₯Ό μ΄μš©ν•˜μ—¬ μ·¨μ†Œν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    class Bank {
        // ...
        private let loanOperationQueue: OperationQueue = {
            let operationQueue = OperationQueue()
            operationQueue.maxConcurrentOperationCount = WorkType.loan.numberOfBankClerk
    
            return operationQueue
        }()
    
        private let depositOperationQueue: OperationQueue = {
            let operationQueue = OperationQueue()
            operationQueue.maxConcurrentOperationCount = WorkType.deposit.numberOfBankClerk
    
            return operationQueue
        }()
        
        // ...
        private func startBankService() {
            while !waitingLine.isEmpty {
                guard let currentCustomer = waitingLine.dequeue() else { return }
                let operation = BlockOperation { BankClerk.carryOutBankService(for: currentCustomer) }
    
                switch currentCustomer.workType {
                case .deposit:
                    depositOperationQueue.addOperation(operation)
                case .loan:
                    loanOperationQueue.addOperation(operation)
                default:
                    print("workType이 nilμž…λ‹ˆλ‹€.")
                }
            }
        }
    
        func stopBankService() {
            // ...
            depositOperationQueue.cancelAllOperations()
            loanOperationQueue.cancelAllOperations()
        }
    }

슀크둀 μ‹œ 타이머 멈좀

πŸ”₯ 문제점

  • 화면을 슀크둀 μ‹œ 타이머가 λ©ˆμΆ”λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ‚¬μš©μžκ°€ μŠ€ν¬λ‘€μ„ ν–ˆμ„ λ•Œ RunLoopκ°€ tracking λͺ¨λ“œλ‘œ λ°”λ€Œμ–΄ 타이머가 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

🧯 해결방법

  • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν˜„μž¬ λŸ°λ£¨ν”„μ— 타이머λ₯Ό .common λͺ¨λ“œλ‘œ λ“±λ‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

.common: ν•˜λ‚˜ μ΄μƒμ˜ λ‹€λ₯Έ μ‹€ν–‰ λͺ¨λ“œλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“œ

RunLoop.current.add(timer, forMode: .common)

Swift Package Managerλ₯Ό ν™œμš©ν•˜μ—¬ μ½˜μ†”μ•±κ³Ό UI 톡합

πŸ”₯ 문제점

  • 기쑴에 κ΅¬ν˜„ν•œ μ½˜μ†”μ•± ν”„λ‘œμ νŠΈλ₯Ό ν™œμš©ν•˜μ—¬ μƒˆλ‘­κ²Œ UIν”„λ‘œμ νŠΈλ₯Ό 진행함에 μžˆμ–΄ μ–΄λ–»κ²Œ νŒŒμΌμ„ 합칠지 고민을 ν–ˆμŠ΅λ‹ˆλ‹€. μ½˜μ†”μ•± ν”„λ‘œμ νŠΈμ— κ΅¬ν˜„ν•œ 파일의 경둜λ₯Ό μΆ”μ ν•˜μ—¬ νŒŒμΌμ„ κ³΅μœ ν•˜λŠ” 방법도 κ°€λŠ₯ν•˜μ§€λ§Œ 이 방법을 μ‚¬μš©ν•  경우 UIν”„λ‘œμ νŠΈλ₯Ό μœ„ν•΄ νŒŒμΌμ„ λ³€κ²½ν•  경우 μ½˜μ†”μ•±μ˜ ν”„λ‘œμ νŠΈλ„ ν•¨κ»˜ μˆ˜μ •λœλ‹€λŠ” 단점이 μ‘΄μž¬ν–ˆμŠ΅λ‹ˆλ‹€.

🧯 해결방법

  • μ½˜μ†”μ•±κ³Ό UI ν”„λ‘œμ νŠΈ λͺ¨λ‘ Queue, Linked-List, Customer λ“± 큐 ꡬ쑰와 Customer λ‚΄μš©μ„ 둜컬 framework둜 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•˜λŠ”λ° CocoaPods, Carthage, SPM λ“± μ—¬λŸ¬ 방법이 μžˆμ§€λ§Œ 둜컬둜 λ°”λ‘œ 연동이 κ°€λŠ₯ν•œ SPM을 μ‚¬μš©ν•˜μ—¬ μ½˜μ†”μ•± ν”„λ‘œμ νŠΈμ˜ 곡톡 λ‚΄μš©μ„ UI ν”„λ‘œμ νŠΈμ— μ μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


Public ν‚€μ›Œλ“œ

πŸ”₯ 문제점

  • swift packmanagerλ₯Ό μ‚¬μš©ν•˜μ—¬ customer 둜컬 νŒ¨ν‚€μ§€λ₯Ό μƒμ„±ν•˜μ—¬ ν™œμš©ν•˜λŠ” κ³Όμ •μ—μ„œ 직접 λ§Œλ“  νŒ¨μ§€λ₯Ό ν™œμš©ν•˜λ‹€λ³΄λ‹ˆ μƒˆλ‘œμš΄ λ¬Έμ œμ— μ§λ©΄ν–ˆμŠ΅λ‹ˆλ‹€. 기본적으둜 μ„€μ •λ˜μ–΄μžˆλŠ” internal을 λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œλ„ μ‚¬μš©κ°€λŠ₯ν•˜κ²Œ μˆ˜μ •ν•΄μ•Όν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ ‘κ·Όμ œμ–΄μžμ—λŠ” publicκ³Ό open이 μžˆμŠ΅λ‹ˆλ‹€. 이 λ‘˜μ˜ 차이점을 κ³ λ €ν•˜μ—¬ μ μš©ν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

🧯 해결방법

  • openκ³Ό public은 λͺ¨λ‘ 외뢀에 개방이 λ˜μ–΄ μžˆμ–΄ λͺ¨λ“ˆ λ°–μ—μ„œ λͺ¨λ‘ 접근이 κ°€λŠ₯ν•˜λ‹€λŠ” 곡톡점이 μžˆμ§€λ§Œ, open의 경우 μ˜€λ²„λΌμ΄λ“œ, μ„œλΈŒν΄λž˜μ‹±μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ public의 경우 μ˜€λ²„λΌμ΄λ“œ, μ„œλΈŒν΄λž˜μ‹±μ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 차이λ₯Ό κ³ λ €μ„ν–ˆμ„ λ•Œ μ •ν˜•ν™”λœ 큐와 Customer 객체λ₯Ό κ³΅μœ ν•˜κ³ μž ν”„λ ˆμž„μ›Œν¬λ₯Ό μƒμ„±ν•œ μ €ν¬μ˜ μ˜λ„μ—λŠ” public이 더 μ μ ˆν•˜λ‹€ μƒκ°ν•˜μ—¬ public을 각 λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹°λ³„λ‘œ μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    public struct Customer {
        public let waitingNumber: Int
        public let workType: WorkType? = WorkType.allCases.randomElement()
    
        public init(waitingNumber: Int) {
            self.waitingNumber = waitingNumber
        }
    }

7. πŸ’­ νŒ€ 회고

νŒ€ 회고

μš°λ¦¬νŒ€μ΄ μž˜ν•œ μ πŸ˜ƒ

  • μ½”λ“œλ₯Ό κ΅¬ν˜„ν•¨μ— μžˆμ–΄ μ„œλ‘œμ˜ μ˜κ²¬μ„ λ°˜μ˜ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œμ νŠΈ κ΅¬ν˜„μ„ 함에 μžˆμ–΄ ν•œκ°€μ§€ 방법이 μ•„λ‹Œ μ—¬λŸ¬κ°€μ§€ 방법을 κ³ λ €ν•œ 점이 μ’‹μ•˜μŠ΅λ‹ˆλ‹€.
  • μ½”λ“œλ₯Ό 깊이있게 κ³ λ―Όν•˜κ³  κ³΅λΆ€ν•œ ν›„ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • μ‹œκ°„ 내에 ν”„λ‘œμ νŠΈλ₯Ό 완성도 있게 λ§ˆλ¬΄λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μš°λ¦¬νŒ€μ΄ μ•„μ‰¬μ› λ˜ 점😭

  • νŒ€μ› κ°„ μ‹œκ°„μ΄ 잘 μ•ˆ λ§žμ•„ 더 λ§Žμ€ 곡뢀λ₯Ό ν•¨κ»˜ν•˜μ§€ λͺ» ν–ˆλ˜ 것이 μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€.
  • 개인 μ‚¬μ •μœΌλ‘œ μ‹œκ°„ μ‘°μ • μ‹œ 어렀움이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

8. πŸ”— μ°Έκ³  링크

ios-bank-manager's People

Contributors

h-suo avatar serena0720 avatar yagom avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.