25.06.13 (3) - 추가학습

김영하·2025년 6월 13일

C++

목록 보기
28/32

디자인패턴 추가학습

OCP 원칙이 적용된 클래스에 기능 추가

  • OCP 원칙 = 확장에는 열려있고 수정에는 닫혀있다
    제시된 코드를 수정하지 않고 새로운 기능을 추가해 보자


이미 Animal 이라는 추상 클래스가 있다고 가정하면
그냥 똑같이 간단하게 추가하면 끝나는 문제 아닌가..?


  • 정답 확인
#include <iostream>
#include <vector>
using namespace std;

// 기본 Animal 클래스 (수정 금지)
class Animal {
public:
    virtual void speak() = 0; // 순수 가상 함수
    virtual ~Animal() = default; // 가상 소멸자
};

// Dog 클래스 (이미 구현됨)
class Dog : public Animal {
public:
    void speak() {
        cout << "Woof! Woof!" << endl;
    }
};

// Cat 클래스 (이미 구현됨)
class Cat : public Animal {
public:
    void speak() {
        cout << "Meow! Meow!" << endl;
    }
};

// Bird 클래스 (새로운 클래스 추가)
class Bird : public Animal {
public:
    void speak() {
        cout << "Chirp! Chirp!" << endl;
    }
};

// 동물의 소리를 출력하는 함수 (수정 금지)
void makeAnimalsSpeak(vector<Animal*> &animals) {
    for (Animal* animal : animals) {
        animal->speak();
    }
    // 동적으로 할당된 메모리를 해제합니다.
    for (Animal* animal : animals) {
        delete animal;
    }
}

int main() {
    vector<Animal*> animals;
    animals.push_back(new Dog());
    animals.push_back(new Cat());

    // Bird 객체 추가
    animals.push_back(new Bird());

    makeAnimalsSpeak(animals);
    return 0;
}

동작 구조는 결국 비슷하다

profile
내일배움캠프 Unreal 3기

0개의 댓글