C언어를 공부하다 보면 배열, 포인터, 함수까지는 비교적 익숙하게 느껴진다.
하지만 구조체(Struct)는 처음 접할 때 “이걸 왜 쓰지?”라는 생각이 들 수 있다.
단순한 예제에서는 변수 몇 개만 선언해도 충분해 보이기 때문이다.
uint8 Temp;
uint8 Speed;
uint8 Error;
하지만 실무 코드에서는 데이터가 많아지고, 서로 관련된 값들을 함께 관리해야 하는 상황이 계속 발생한다.
예를 들어 차량 제어 소프트웨어에서는 아래와 같은 데이터가 하나의 모듈에 동시에 존재한다.
- 모터 현재 속도
- 모터 목표 속도
- 과전류 에러 상태
- 과온도 에러 상태
- 동작 모드
- 진단 상태
이 데이터를 각각 따로 관리하면 코드가 복잡해지고 유지보수가 어려워진다.
이때 사용하는 것이 구조체다.
구조체는 서로 관련된 여러 데이터를 하나로 묶어서 관리하는 사용자 정의 자료형이다.
이번 글에서는 구조체의 개념부터, 왜 실무에서 필수인지, 그리고 임베디드 / AUTOSAR 스타일 예제까지 자세히 설명한다.
구조체란 무엇인가?
구조체는 여러 개의 변수를 하나의 그룹으로 묶는 기능이다.
예를 들어 모터 상태 정보를 하나로 묶어보자.
typedef struct
{
uint16 CurrentSpeed;
uint16 TargetSpeed;
uint8 Error;
} MotorStatusType;
설명:
- CurrentSpeed : 현재 속도
- TargetSpeed : 목표 속도
- Error : 에러 상태
이제 이 세 변수는 따로따로가 아니라 MotorStatusType이라는 하나의 데이터 형태가 된다.
구조체를 왜 사용할까?
1. 관련 데이터를 한 번에 관리할 수 있다
구조체를 사용하지 않으면, 변수가 많아질수록 이름도 길어지고 관리가 어렵다.
구조체를 사용하면,
MotorStatusType Motor;
이 한 줄로 관련 데이터를 묶어서 관리할 수 있다.
2. 코드 가독성이 좋아진다
Motor.CurrentSpeed = 1200U;
Motor.TargetSpeed = 1500U;
Motor.Error = 0U;
이 코드를 보면 어떤 데이터가 어떤 모듈 소속인지 바로 알 수 있다.
3. 함수 전달이 쉬워진다
변수 5개를 각각 전달하는 대신 구조체 하나를 전달할 수 있다.
구조체 기본 사용법
## 선언
typedef struct
{
uint8 Temp;
uint8 Humidity;
} SensorType;
## 변수 생성
SensorType RoomSensor;
## 값 저장
RoomSensor.Temp = 25U;
RoomSensor.Humidity = 60U;
## 값 사용
if (RoomSensor.Temp > 20U)
{
/* 처리 */
}
실무 예제 1: 모터 상태 관리
임베디드 시스템에서는 모터 관련 데이터가 여러 개 존재한다.
typedef struct
{
uint16 CurrentRpm;
uint16 TargetRpm;
uint8 RunState;
uint8 ErrorState;
} MotorInfoType;
사용:
MotorInfoType MotorInfo;
MotorInfo.CurrentRpm = 800U;
MotorInfo.TargetRpm = 1000U;
MotorInfo.RunState = 1U;
MotorInfo.ErrorState = 0U;
만약 구조체 없이 작성하게 되면, 데이터가 늘어날수록 관리가 어려워진다.
구조체는 모터 관련 정보를 하나의 객체처럼 다룰 수 있게 해준다.
실무 예제 2: AUTOSAR 스타일 상태 관리
AUTOSAR 프로젝트에서는 모듈 상태를 구조체로 관리하는 경우가 많다.
typedef struct
{
uint8 InitState;
uint8 NmState;
uint8 SleepState;
uint16 ErrorCode;
} EcuStateType;
사용:
EcuStateType EcuState;
EcuState.InitState = 1U;
EcuState.NmState = 2U;
EcuState.SleepState = 0U;
EcuState.ErrorCode = 0U;
상태값이 여러 개여도 하나의 변수로 관리 가능하다.
이 변수(EcuState) 하나만 보면 ECU 상태를 확인할 수 있다.
정리
구조체는 단순 문법 기능이 아니다.
실무 코드에서 데이터를 체계적으로 관리하기 위한 핵심 도구다.
변수가 많아질수록 구조체의 가치가 커진다.
특히 임베디드 시스템처럼 상태값, 센서값, 통신 데이터가 많은 환경에서는 구조체 없이 큰 프로젝트를 관리하기 어렵다.
구조체는 흩어진 변수들을 의미 있는 단위로 묶어주는 실무 필수 도구다.
'C 언어 > 실무' 카테고리의 다른 글
| C언어 switch문 실무 사용법 (if문보다 switch문이 강력한 이유) (0) | 2026.04.21 |
|---|---|
| C언어 내부 변수 / 전역 변수 / static 변수 사용 기준 (0) | 2026.04.16 |
| C언어 비트 연산자 쉽게 설명하기 (임베디드 실무 관점에서 제대로 이해하기) (0) | 2026.04.14 |
| C언어 extern 변수 사용법 (파일 간 변수 공유 방법) (0) | 2026.04.13 |
| C언어 배열과 포인터 차이 (헷갈리는 이유부터 핵심 차이까지) (0) | 2026.04.12 |