용이네 아지트

C++ 디자인 패턴 기초 객체지향 프로그래밍을 더 효율적으로! 본문

IT·자격증

C++ 디자인 패턴 기초 객체지향 프로그래밍을 더 효율적으로!

용이네 아지트 2025. 3. 14. 14:24

안녕하세요, 개발자 여러분! 😊
지난 포스팅에서 C++ 객체지향 프로그래밍(OOP) 개념을 정리했죠?
그럼 이제 실전에서 객체지향 개념을 어떻게 활용할지 궁금하지 않으신가요? 🤔

그래서 오늘은 C++ 디자인 패턴 기초를 소개할게요!
디자인 패턴(Design Pattern)효율적인 코드 구조를 만들기 위한 "최적의 코드 설계 방법" 입니다.

📌 오늘 배울 내용
디자인 패턴이란?
싱글톤 패턴(Singleton) – 인스턴스 하나만 만들기!
팩토리 패턴(Factory) – 객체 생성을 효율적으로!
전략 패턴(Strategy) – 유연한 알고리즘 선택!


1️⃣ 디자인 패턴(Design Pattern)이란? 🤔

💡 반복되는 설계 문제를 해결하기 위한 "검증된 코드 구조"
💡 재사용 가능한 코드 구조로 유지보수성을 높여줌

✅ 디자인 패턴은 3가지 유형 으로 나뉩니다!

패턴 유형 설명 대표 패턴

생성 패턴 객체 생성 방식을 최적화 싱글톤, 팩토리, 빌더
구조 패턴 객체 간 관계를 효율적으로 설계 어댑터, 데코레이터
행동 패턴 객체의 동작 및 알고리즘 최적화 전략, 옵저버, 상태

👉 오늘은 가장 많이 쓰이는 생성 패턴 & 행동 패턴 3가지 를 배워볼게요! 🚀


2️⃣ 싱글톤 패턴(Singleton) – 인스턴스 하나만 만들기!

📌 싱글톤 패턴이란?

  • 프로그램 전체에서 "하나의 객체" 만 생성되도록 보장하는 패턴
  • 리소스를 절약 & 데이터 일관성을 유지 하는데 유용함

📌 싱글톤 패턴 예제 코드

#include <iostream>
using namespace std;

class Singleton {
private:
    static Singleton* instance; // 유일한 객체
    Singleton() {}  // private 생성자 (외부에서 객체 생성 방지)

public:
    static Singleton* getInstance() { // 유일한 객체 반환
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void showMessage() {
        cout << "싱글톤 객체 사용 중!" << endl;
    }
};

// 정적 변수 초기화
Singleton* Singleton::instance = nullptr;

int main() {
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();

    s1->showMessage();

    // 동일한 인스턴스인지 확인
    cout << "주소 비교: " << (s1 == s2) << endl;  // 1 (true)
    return 0;
}

getInstance()를 통해 하나의 인스턴스만 생성됨!
게임 엔진, 데이터베이스 연결 등에 자주 사용됨!


3️⃣ 팩토리 패턴(Factory) – 객체 생성을 효율적으로!

📌 팩토리 패턴이란?

  • 객체 생성을 담당하는 "팩토리 클래스" 를 따로 만들어 객체 생성 로직을 캡슐화 하는 패턴
  • 객체를 직접 생성하는 것이 아니라 "팩토리 메서드"를 통해 생성

📌 팩토리 패턴 예제 코드

#include <iostream>
using namespace std;

// 부모 클래스 (인터페이스)
class Animal {
public:
    virtual void speak() = 0; // 순수 가상 함수
};

// 자식 클래스 (Dog)
class Dog : public Animal {
public:
    void speak() override { cout << "멍멍!" << endl; }
};

// 자식 클래스 (Cat)
class Cat : public Animal {
public:
    void speak() override { cout << "야옹~" << endl; }
};

// 팩토리 클래스
class AnimalFactory {
public:
    static Animal* createAnimal(const string& type) {
        if (type == "dog") return new Dog();
        else if (type == "cat") return new Cat();
        return nullptr;
    }
};

int main() {
    Animal* myPet = AnimalFactory::createAnimal("dog");
    myPet->speak();  // 멍멍!

    delete myPet; // 메모리 해제
    return 0;
}

팩토리 패턴을 사용하면 객체 생성 로직을 숨길 수 있어 유지보수성이 좋아짐!
게임 개발, GUI 라이브러리에서 버튼/창 생성 등에 많이 활용됨!


4️⃣ 전략 패턴(Strategy) – 유연한 알고리즘 선택!

📌 전략 패턴이란?

  • 여러 개의 알고리즘을 미리 만들어 두고, 상황에 따라 적절한 알고리즘을 선택 하는 패턴
  • if-else 대신 유연한 구조로 알고리즘 변경 가능!

📌 전략 패턴 예제 코드

#include <iostream>
using namespace std;

// 전략 인터페이스
class PaymentStrategy {
public:
    virtual void pay(int amount) = 0;
};

// 신용카드 결제 클래스
class CreditCardPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        cout << "신용카드로 " << amount << "원 결제 완료!" << endl;
    }
};

// 페이팔 결제 클래스
class PayPalPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        cout << "페이팔로 " << amount << "원 결제 완료!" << endl;
    }
};

// 결제 처리 클래스
class ShoppingCart {
private:
    PaymentStrategy* strategy;

public:
    ShoppingCart(PaymentStrategy* strategy) : strategy(strategy) {}

    void checkout(int amount) {
        strategy->pay(amount);
    }
};

int main() {
    CreditCardPayment card;
    PayPalPayment paypal;

    ShoppingCart cart1(&card);
    cart1.checkout(50000);  // 신용카드로 50000원 결제 완료!

    ShoppingCart cart2(&paypal);
    cart2.checkout(30000);  // 페이팔로 30000원 결제 완료!

    return 0;
}

전략 패턴을 활용하면 결제 방식을 쉽게 변경 가능!
AI, 게임 개발에서 행동 패턴을 변경할 때 많이 사용됨!


✅ 마무리 – C++ 디자인 패턴 기초 총정리!

싱글톤 패턴 – 프로그램에서 단 하나의 객체만 생성
팩토리 패턴 – 객체 생성을 담당하는 팩토리 클래스를 활용
전략 패턴 – 유연한 알고리즘 변경을 위한 설계

📌 💬 여러분은 어떤 패턴이 가장 유용하다고 생각하나요?
📌 추가로 알고 싶은 디자인 패턴이 있다면 댓글로 남겨주세요! 😊