본문 바로가기
언어/C, C++

c, c++ 임베디드 설계 비교

by minhyeok.lee 2025. 5. 21.
반응형

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 pointerC++ 스타일 추상화 유사 구현 가능
  • C++ 프로젝트에서는 new/delete 없이 정적 객체만 써도 충분히 안전하게 운용 가능
  • C++에서 .c/.h 파일은 그대로 가져와 사용 가능 (C 링크로 extern "C" 처리)
반응형

댓글