[swift] 상속을 활용한 디자인 패턴 구현 및 예제

목차


소개

디자인 패턴은 소프트웨어 개발에서 특정 문제를 해결하기 위한 테스트된 해결책을 제공합니다. 상속은 객체 지향 디자인에서 중요한 개념으로, 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 재사용할 수 있게 합니다. 이번 글에서는 상속을 활용하여 디자인 패턴을 구현하는 방법을 알아보고, 예제 코드를 통해 실제 구현 방법을 살펴보겠습니다.

상속을 활용한 디자인 패턴

여러 디자인 패턴 중에서 상속을 활용할 수 있는 몇 가지 패턴을 소개하겠습니다.

팩토리 메서드 패턴

팩토리 메서드 패턴은 객체 생성 로직을 하위 클래스로 미루어, 클라이언트 코드를 객체 생성 로직에서 분리하는데 사용됩니다. 부모 클래스에 추상적인 팩토리 메서드를 정의하고, 하위 클래스에서 이를 구현하여 객체를 생성합니다.

템플릿 메서드 패턴

템플릿 메서드 패턴은 알고리즘의 뼈대를 정의한 후, 일부 단계를 하위 클래스로 미루는데 사용됩니다. 부모 클래스에 템플릿 메서드를 정의하고, 하위 클래스에서 일부 단계를 구현하여 알고리즘을 완성합니다.

전략 패턴

전략 패턴은 알고리즘을 캡슐화하여 동적으로 교체할 수 있도록 하는데 사용됩니다. 부모 클래스에 전략을 나타내는 인터페이스를 정의하고, 이를 상속하는 여러 하위 클래스를 만들어 각자 다른 전략을 구현합니다.

예제 코드

이제 간단한 예제 코드를 통해 위에서 소개한 패턴을 구현해보겠습니다.

// 팩토리 메서드 패턴 예제
class Product {
    func create() {
        fatalError("Subclass must implement this method")
    }
}

class ConcreteProductA: Product {
    override func create() {
        print("Product A created")
    }
}

class ConcreteProductB: Product {
    override func create() {
        print("Product B created")
    }
}

// 템플릿 메서드 패턴 예제
class Algorithm {
    func templateMethod() {
        step1()
        step2()
    }
    
    func step1() {
        fatalError("Subclass must implement this method")
    }
    
    func step2() {
        fatalError("Subclass must implement this method")
    }
}

class ConcreteAlgorithmA: Algorithm {
    override func step1() {
        print("Step 1 of Algorithm A")
    }
    
    override func step2() {
        print("Step 2 of Algorithm A")
    }
}

// 전략 패턴 예제
protocol Strategy {
    func execute()
}

class Context {
    var strategy: Strategy
    
    init(strategy: Strategy) {
        self.strategy = strategy
    }
    
    func executeStrategy() {
        strategy.execute()
    }
}

class ConcreteStrategyA: Strategy {
    func execute() {
        print("Executing strategy A")
    }
}

class ConcreteStrategyB: Strategy {
    func execute() {
        print("Executing strategy B")
    }
}

결론

이번 글에서는 상속을 활용하여 세 가지 디자인 패턴을 구현하는 방법을 알아보았습니다. 이러한 디자인 패턴은 소프트웨어의 유연성과 확장성을 향상시키는 데 도움을 줄 수 있습니다. 상속을 적절히 활용하여 디자인 패턴을 구현하면, 유지보수가 용이하고 재사용 가능한 코드를 작성할 수 있습니다.

참고 문헌: