IMCAT.DEV
로그인 가입
Swift 고급 디자인패턴

Swift Swift에서의 디자인 패턴 적용

Swift Swift에서의 디자인 패턴 적용 — 고급

Swift에서의 디자인 패턴 적용

1. 도입 (왜 배워야 하는가)

디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 솔루션입니다. Swift와 같은 현대적인 언어에서도 디자인 패턴을 이해하고 활용하는 것은 매우 중요합니다. 디자인 패턴을 모르면 다음과 같은 문제가 발생할 수 있습니다:

  • 코드 복잡성 증가: 비효율적인 코드 구조로 인해 유지보수가 어려워질 수 있습니다.
  • 버그 발생 확률 증가: 문제를 해결하기 위해 반복적인 코드를 작성하면 버그가 발생할 가능성이 높아집니다.
  • 팀 협업의 비효율성: 디자인 패턴을 이해하지 못한 팀원 간의 코드 이해도가 낮아져 협업이 어려워질 수 있습니다.
  • 디자인 패턴을 배우면 코드를 더 깔끔하고 일관되게 유지할 수 있으며, 팀원들과의 협업이 원활해집니다.

    2. 핵심 개념 설명

    디자인 패턴 정의

    디자인 패턴은 소프트웨어 설계에서 일반적으로 발생하는 문제를 해결하기 위해 설계된 반복 가능한 솔루션입니다.

    실생활 비유

    디자인 패턴을 요리 레시피에 비유할 수 있습니다. 각 레시피는 특정한 요리를 만들기 위한 단계와 방법을 제공합니다. 마찬가지로, 디자인 패턴은 특정한 소프트웨어 문제를 해결하기 위한 구조와 방법을 제공합니다.

    관련 용어 정리

    용어설명
    싱글톤(Singleton)애플리케이션에서 단 하나의 인스턴스만 존재하는 패턴
    옵저버(Observer)객체의 상태 변화를 관찰하는 패턴
    팩토리(Factory)객체 생성을 캡슐화하여 코드의 유연성을 높이는 패턴

    3. 기본 코드 예제

    싱글톤 패턴

    class Singleton {
        static let shared = Singleton()
        
        private init() {
            // 초기화 코드
        }
        
        func doSomething() {
            print("Doing something!")
        }
    }
    
    // 사용 예
    Singleton.shared.doSomething()

    실행 결과:

    Doing something!
  • class Singleton : Singleton 클래스를 정의합니다.
  • static let shared : 이 클래스의 단 하나의 인스턴스를 생성합니다.
  • private init() : 외부에서 인스턴스 생성을 막기 위해 초기화 메서드를 private으로 설정합니다.
  • doSomething : Singleton 인스턴스가 수행할 작업을 정의합니다.
  • Singleton.shared.doSomething() : 싱글톤 인스턴스를 통해 메서드를 호출합니다.
  • 4. 실전 활용 예제

    옵저버 패턴

    쇼핑몰에서 장바구니에 상품을 추가할 때, 장바구니의 상태를 업데이트하는 데 옵저버 패턴을 사용할 수 있습니다.

    protocol Observer {
        func update(price: Double)
    }
    
    class Cart: Observer {
        var totalPrice: Double = 0.0
        
        func update(price: Double) {
            totalPrice += price
            print("장바구니 총액: \(totalPrice) 원")
        }
    }
    
    class Product {
        var observers: [Observer] = []
        var price: Double {
            didSet {
                notifyObservers()
            }
        }
        
        init(price: Double) {
            self.price = price
        }
        
        func addObserver(_ observer: Observer) {
            observers.append(observer)
        }
        
        func notifyObservers() {
            for observer in observers {
                observer.update(price: price)
            }
        }
    }
    
    // 사용 예
    let cart = Cart()
    let product = Product(price: 10000)
    product.addObserver(cart)
    product.price = 12000

    실행 결과:

    장바구니 총액: 12000.0 원
  • 사용자가 상품의 가격을 변경할 때마다 장바구니의 총액이 업데이트됩니다.
  • 팩토리 패턴

    사용자가 로그인할 때, 다양한 로그인 방법을 제공하는 쇼핑몰에서 팩토리 패턴을 사용할 수 있습니다.

    protocol Login {
        func login()
    }
    
    class FacebookLogin: Login {
        func login() {
            print("Facebook으로 로그인")
        }
    }
    
    class GoogleLogin: Login {
        func login() {
            print("Google로 로그인")
        }
    }
    
    class LoginFactory {
        static func createLogin(type: String) -> Login? {
            switch type {
            case "Facebook":
                return FacebookLogin()
            case "Google":
                return GoogleLogin()
            default:
                return nil
            }
        }
    }
    
    // 사용 예
    if let loginMethod = LoginFactory.createLogin(type: "Facebook") {
        loginMethod.login()
    }

    실행 결과:

    Facebook으로 로그인
  • 로그인 메서드를 유연하게 변경할 수 있습니다.
  • 5. 흔한 실수와 주의사항

    잘못된 코드 vs 올바른 코드

    1. 싱글톤 패턴에서 인스턴스 중복 생성
    2. - 잘못된 코드:

         let instance1 = Singleton()
         let instance2 = Singleton()

      - 올바른 코드:

         let instance1 = Singleton.shared
         let instance2 = Singleton.shared
    3. 옵저버 패턴에서 메모리 누수
    4. - 잘못된 코드: 옵저버를 등록한 후 해제하지 않음. - 올바른 코드: 옵저버를 해제하는 메서드를 추가하여 메모리 누수 방지.

      6. 정리

    5. 디자인 패턴은 소프트웨어 개발에서 재사용 가능한 솔루션입니다.
    6. 싱글톤, 옵저버, 팩토리 패턴 등은 실무에서 유용하게 쓰입니다.
    7. 디자인 패턴을 활용하면 코드의 유지보수성과 협업 효율성을 높일 수 있습니다.
    8. 다음에 학습하면 좋은 주제

    9. 고급 디자인 패턴 (전략 패턴, 템플릿 메서드 패턴)
    10. SOLID 원칙 이해 및 적용
    11. Swift 프로토콜 지향 프로그래밍