코딩 학습/C와 C++

C++ 기초 - 객체지향 설계

이개 2026. 3. 16. 21:09

응집도 : 클래스 내 모듈들이 얼마나 관련있는지를 나타냄

  • 클래스 하나에 모든 기능을 집어넣지 말고, 관련 없는 기능은 적절히 분산해주어야한다.
  • 응집도가 높을 수록 좋은 설계.
  • 예를 들어, 메시지를 처리하는 기능, 계산 기능, 문자열 수정 기능이 필요하다면, 한 클래스에 이를 다 구현하지 말고 각 기능을 하는 클래스를 각각 생성한다.

 

  • transform함수 : 컨테이너의 원소들을 변환해서 다른 값으로 변환해주는 algorithm 함수
transform(시작, 끝, 결과시작, 함수);

 

 

결합도 : 각 모듈들이 서로 얼마나 의존하는지 나타냄

  • 결합도가 낮은 것이 좋은 코드.
  • 결합도가 높으면 하나의 모듈이 변경될 때 다른 모듈까지 영향을 미침.
  • 결합도를 낮추려면, 자바의 의존성 주입처럼 다형성을 활용하여 기본 클래스에 파생 클래스를 넣어주면 됨
#include <iostream>
#include <memory>

using namespace std;

// 공통 인터페이스 정의
class Engine {
public:
    virtual void start() = 0;
    virtual ~Engine() = default;
};

// DieselEngine 구현
class DieselEngine : public Engine {
public:
    void start() {
        cout << "Diesel Engine started" << endl;
    }
};

// 새로운 ElectricEngine 구현
class ElectricEngine : public Engine {
public:
    void start() {
        cout << "Electric Engine started silently" << endl;
    }
};

// Car 클래스는 Engine 인터페이스에만 의존
class Car {
private:
    unique_ptr<Engine> engine;

public:
    Car(unique_ptr<Engine> eng) : engine(move(eng)) {}

    void startCar() {
        engine->start();
        cout << "Car started" << endl;
    }
};

int main() {
    // DieselEngine을 사용하는 경우
    auto dieselEngine = make_unique<DieselEngine>();
    Car dieselCar(move(dieselEngine));
    dieselCar.startCar();

    // ElectricEngine을 사용하는 경우
    auto electricEngine = make_unique<ElectricEngine>();
    Car electricCar(move(electricEngine));
    electricCar.startCar();

    return 0;
}

 

SOLID 원칙

  • 객체지향을 설계할 때 주요한 5가지 원칙
  • 유지보수성 및 확장성 향상
  • 변경에 유연하게 함
  1. 단일 책임 원칙(SRP)
    1. 각 클래스는 하나의 책임을 가져야 한다는 원칙
  2. 개방 폐쇄 원칙(OCP)
    1. 확장에는 열려 있고, 수정에는 닫혀있어야 한다.
    2. 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 하는 게 목적
  3. 리스 코프 치환 원칙(LSP)
    1. 자식 클래스는 부모 클래스에서 기대되는 행동을 보장해야 한다.
  4. 인터페이스 분리 원칙(ISP)
    1. 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
    2. 불필요한 메서드는 원본에 구현하지 말아야한다.
  5. 의존 역전 원칙(DIP)
    1. 고수준 모듈은 저수준 모듈에 의존하지 않고 둘다 추상화에 의존해야 한다.

 

트러블 슈팅

분명히 되는 걸 확인한 코드였음에도

 

확인할 수 없는 외부 기호 "public: virtual void __cdecl Magician::attack(void)" (?attack@Magician@@UEAAXXZ) 1개의 확인할 수 없는 외부 참조입니다.

 

라는 에러가 났다. 빌드 문제라고 보여 재빌드하니 사라졌다.