[c++] 추상 클래스와 인터페이스의 디자인 패턴

서론

이번에는 C++에서 추상 클래스와 인터페이스를 사용하는 디자인 패턴에 대해 알아보겠습니다. 디자인 패턴은 특정한 상황에 맞는 문제 해결을 위한 소프트웨어 디자인 템플릿으로, 객체 지향 프로그래밍에서 많이 활용됩니다.

추상 클래스와 인터페이스

추상 클래스는 하나 이상의 순수 가상 함수(가상 함수의 선언만 있는 함수)를 포함하고 있는 클래스로, 객체를 직접 생성할 수 없습니다. 반면, 인터페이스는 모든 함수가 순수 가상 함수로만 이루어진 클래스로, 인터페이스를 상속받는 클래스는 인터페이스의 모든 함수를 구현해야 합니다.

추상 팩토리 디자인 패턴

추상 팩토리 패턴은 서로 관련된 객체를 생성하는데 사용되는 인터페이스를 제공하는 디자인 패턴입니다. 이 패턴을 사용하면 클라이언트가 생성할 구체 클래스를 지정하지 않고 관련된 객체들을 생성할 수 있습니다.

예제 코드

class AbstractProductA {
public:
    virtual void operationA() = 0;
};

class ConcreteProductA1 : public AbstractProductA {
public:
    void operationA() override {
        // 구체 제품 A1의 동작 정의
    }
};

class ConcreteProductA2 : public AbstractProductA {
public:
    void operationA() override {
        // 구체 제품 A2의 동작 정의
    }
};

class AbstractFactory {
public:
    virtual AbstractProductA* createProductA() = 0;
};

class ConcreteFactory1 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ConcreteProductA1();
    }
};

class ConcreteFactory2 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ConcreteProductA2();
    }
};

전략 디자인 패턴

전략 패턴은 해당 알고리즘이 외부적으로 전환 가능하도록 만드는 디자인 패턴입니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 느슨하게 연결된 전략 객체를 만들어 사용할 수 있습니다.

예제 코드

class Strategy {
public:
    virtual void doOperation() = 0;
};

class ConcreteStrategy1 : public Strategy {
public:
    void doOperation() override {
        // 전략 1의 알고리즘 동작 정의
    }
};

class ConcreteStrategy2 : public Strategy {
public:
    void doOperation() override {
        // 전략 2의 알고리즘 동작 정의
    }
};

class Context {
private:
    Strategy* strategy;
public:
    void setStrategy(Strategy* newStrategy) {
        strategy = newStrategy;
    }

    void executeStrategy() {
        strategy->doOperation();
    }
};

마무리

추상 클래스와 인터페이스는 디자인 패턴에서 유용하게 활용됩니다. 이들을 적절히 활용하면 유연하고 확장 가능한 코드를 작성할 수 있습니다. 디자인 패턴을 적용하면 코드의 유지보수성과 가독성이 높아지며, 재사용성이 증가하게 됩니다.

이상으로 C++에서 추상 클래스와 인터페이스를 사용하는 디자인 패턴에 대해 살펴보았습니다.

참고 문헌