C (.c) vs C++ (.cpp) 기반 임베디드 설계 비교 정리
요약
항목 |
C 기반 설계 (.c) |
C++ 기반 설계 (.cpp) |
주요 개념 |
구조체 + 함수 분리 |
클래스 (캡슐화, 상속, 다형성 등) |
상태/동작 |
struct 로 상태, function() 으로 동작 |
클래스 멤버 변수 + 멤버 함수로 통합 |
모듈화 |
파일 단위 (.c/.h) 모듈화 |
객체 단위 (클래스) 모듈화 |
의존성 |
extern 또는 handle 방식 |
참조(&) 또는 포인터 기반 의존성 주입 |
싱글톤 처리 |
전역변수 또는 getInstance() 직접 구현 |
정적 멤버 or 싱글톤 패턴 |
상속/다형성 |
직접 구현 어렵고 불편 |
명시적 지원 (virtual 등) |
코드 재사용성 |
낮음 (구조체 확장 어려움) |
높음 (클래스 재사용 용이) |
초기화/생성자 |
별도 init_XXX() 함수 필요 |
생성자 자동 호출 가능 |
컨텍스트 전달 |
MyStruct* 넘겨서 모든 함수 공유 |
this 를 기반으로 내부 멤버 접근 |
IDE 지원 |
함수 위주로 미약함 |
객체/상속 구조로 네비게이션 우수 |
✅ C (.c)의 구조 설계 예시
typedef struct {
int speed;
int direction;
} Motor;
void motor_init(Motor* m);
void motor_setSpeed(Motor* m, int speed);
- 각 모듈은
.c/.h
파일쌍으로 작성
- 상태 (
Motor
)와 동작 (motor_setSpeed
)이 분리되어 관리됨
- 전역 인스턴스가 필요하면
static Motor motor
또는 extern Motor motor;
사용
✅ C 방식의 장점
항목 |
설명 |
✅ 단순함 |
초기에 빠르게 구성 가능 |
✅ 컴파일 최적화 |
오버헤드 없음, 바이너리 작음 |
✅ C99 기반 툴 호환성 우수 |
대부분 MCU 및 RTOS가 C 기반 |
❌ C 방식의 단점
항목 |
설명 |
❌ 코드 분산 |
상태와 로직이 분리되어 추적 어려움 |
❌ 추상화 부족 |
다형성, 유연한 재사용 불가 |
❌ 유지보수 어려움 |
복잡해질수록 인터페이스가 늘어나고 혼란 유발 |
✅ C++ (.cpp)의 대응 구조
class Motor {
public:
Motor();
void setSpeed(int speed);
int getSpeed() const;
private:
int _speed;
int _direction;
};
- 상태와 동작이 한 클래스에 캡슐화
- 생성자, 소멸자, 접근자 등이 자연스럽게 제공
- OutputManager, LogicController 등의 상위 조합도 깔끔하게 구현 가능
✅ C++ 방식의 장점
항목 |
설명 |
✅ 캡슐화 |
상태 + 동작을 클래스 단위로 묶어 가독성 ↑ |
✅ 상속과 재사용 |
다양한 로직과 장치에 대해 코드 재사용성 ↑ |
✅ 계층적 설계 |
InputManager , OutputManager , LogicController 로 역할 분리 쉬움 |
❌ C++ 방식의 단점
항목 |
설명 |
❌ 코드 크기 증가 가능 |
RTTI, vtable 등 사용 시 |
❌ 일부 임베디드 툴 제한 |
일부 MCU 또는 RTOS가 new/delete , STL 지원 안함 |
❌ 학습 곡선 |
C에 비해 구조 설계가 복잡할 수 있음 |
✅ 결론: 상황 별로 언제 사용할지 (C vs C++)
상황 |
권장 방식 |
단순 센서/장치 제어, 빠른 PoC |
C |
유지보수가 중요한 로봇 시스템, RTOS 기반 아키텍처 |
C++ |
저용량 MCU (8bit/16bit), 제한된 툴체인 |
C |
ARM Cortex-M + FreeRTOS + HAL 기반 |
C++ 지향 |
💡 보완 팁
- C 프로젝트에서도
struct + function pointer
로 C++ 스타일 추상화 유사 구현 가능
- C++ 프로젝트에서는
new/delete
없이 정적 객체만 써도 충분히 안전하게 운용 가능
- C++에서
.c/.h
파일은 그대로 가져와 사용 가능 (C 링크로 extern "C"
처리)
댓글