응집도 : 클래스 내 모듈들이 얼마나 관련있는지를 나타냄
- 클래스 하나에 모든 기능을 집어넣지 말고, 관련 없는 기능은 적절히 분산해주어야한다.
- 응집도가 높을 수록 좋은 설계.
- 예를 들어, 메시지를 처리하는 기능, 계산 기능, 문자열 수정 기능이 필요하다면, 한 클래스에 이를 다 구현하지 말고 각 기능을 하는 클래스를 각각 생성한다.
- 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가지 원칙
- 유지보수성 및 확장성 향상
- 변경에 유연하게 함
- 단일 책임 원칙(SRP)
- 각 클래스는 하나의 책임을 가져야 한다는 원칙
- 개방 폐쇄 원칙(OCP)
- 확장에는 열려 있고, 수정에는 닫혀있어야 한다.
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 하는 게 목적
- 리스 코프 치환 원칙(LSP)
- 자식 클래스는 부모 클래스에서 기대되는 행동을 보장해야 한다.
- 인터페이스 분리 원칙(ISP)
- 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
- 불필요한 메서드는 원본에 구현하지 말아야한다.
- 의존 역전 원칙(DIP)
- 고수준 모듈은 저수준 모듈에 의존하지 않고 둘다 추상화에 의존해야 한다.
트러블 슈팅
분명히 되는 걸 확인한 코드였음에도
확인할 수 없는 외부 기호 "public: virtual void __cdecl Magician::attack(void)" (?attack@Magician@@UEAAXXZ) 1개의 확인할 수 없는 외부 참조입니다.
라는 에러가 났다. 빌드 문제라고 보여 재빌드하니 사라졌다.

'코딩 학습 > C와 C++' 카테고리의 다른 글
| C++ 메모 - 은/는, 이/가 자동 처리 (0) | 2026.03.17 |
|---|---|
| C++ 기초 - 디자인 패턴(싱글톤, 데코레이터, 옵저버) (0) | 2026.03.17 |
| C++ 헷갈리는 개념 정리 (0) | 2026.03.13 |
| C++ 기초 오답노트 / 기능 정리 (0) | 2026.03.12 |
| C++ 기초 - 템플릿 (0) | 2026.03.11 |