| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- C
- 다이나믹 프로그래밍
- 임베디드
- 이분탐색
- 컴퓨터 비전
- JavaScript
- 자바
- 프로그래머스
- dp
- level2
- java
- 통신 인터페이스
- 다이나믹프로그래밍
- 코틀린
- Stack
- 누적합
- level3
- 2018 KAKAO BLIND RECRUITMENT
- 컴퓨터비전
- BFS
- 백준
- lv2
- dfs
- cpp
- 그리디
- 동적계획법
- c++
- 우선순위큐
- 구현
- kotlin
- Today
- Total
코드를 느껴바라
[C/C++] C에서 객체를 만드는 방법: 구조체와 생명주기 본문
C언어에는 class가 없다.
그럼 구조체로 자료형을 정의하고 생성을 했을 때 어떻게 초기화할까?
하나 하나 값을 초기화 해주고 생성해주는 것은 너무 번거롭다.
그래서 생성자의 역할을 해주는 함수에서 초기화해줄 변수에 대해서
깊은 복사와 동적할당이 필요하다면 진행해주는 것이 좋다고 생각했다.
실제로 glibc, POSIX 라이브러리, 유닉스 계열 커널 구조체들이 이 생명주기 규약을 따른다.
init() → malloc + deep copy
destroy() → free
그래서 나도 person이라는 구조체를 만들어서 구현을 해보았다.
person 구조체 선언
typedef struct {
int age;
char* name;
} person;
person 구조체에서는 나이와 사람의 이름을 char 배열의 첫 주소를 가지게 된다.
string으로 하고 싶었으나 C에서는 C답게 하는 것이 좋아보여서 이대로 했다.
생성자 역할을 해주는 personMaker함수 생성
void personMaker(person *p1, int age, const char * name ) {
p1->age = age;
p1->name = (char*)malloc(strlen(name)+1);
strcpy(p1->name, name);
printf("%d세의 %s", p1->age, p1->name);
}
Java나 C++같은 객체지향언어와 같이 생성자, 소멸자 로직이 디폴트로 돌아가지 않는다.
인자로 자기 자원(메모리, 파일, 소켓 등)을 소유하고
생명주기 규칙(init/destroy)을 가진 구조체인
수동객체의 주소값을 받아오고 초기화 해줄 나이와 이름을 받아온다.
내부에서는 나이는 int값이니 단순히 넣으면 된다만
이름은 char 배열의 첫 주소값이기에 해당 name의 길이에 +1 만큼
인자로 받은 p1 수동 객체의 name배열에 할당을 해준다.
+1인 이유는 '\0' 널 종료 문자를 위한 공간이다.
그리고 나서 strcpy로 깊은 복사로 p1만을 위한 이름에 대한
새로운 공간에 새로운 문자열의 복사를 마쳐준다.
소멸자 역할을 해주는 getOrder함수 생성
void getOrder(person *p) {
free(p->name);
printf("나이 1살 증가로 이제 없음\n");
}
name 부분에 대해서는 동적할당을 했기 때문에 작업을 끝마쳤을 때는 free선언을 통해서
해당 메모리 부분을 반환해줘야 한다.
그래서 해당 수동 객체의 name에 대해서 free를 해주면 끝.
마무리
C 언어는 클래스와 생성자, 소멸자라는 문법적 장치를 제공하지 않지만,
그 대신 메모리 소유권과 생명주기 규약을 개발자가 직접 설계하도록 하는 언어이다.
그래서 구조체에 대한 init / destroy 규칙을 명확히 정의하고,
동적 자원에 대해서는 깊은 복사와 명시적인 해제를 수행함으로써
C에서도 객체와 동일한 수준의 안전한 생명주기 모델을 구축할 수 있다.
결국 C에서의 구조체는 단순한 데이터 묶음이 아니라,
“어떤 자원을 소유하며, 언제 생성되고 언제 파괴되는가”라는 규칙이 부여되는 순간
객체와 동일한 의미를 가지는 수동 객체(manual object)가 된다.
이러한 구조를 이해하는 것은 단순히 C 문법을 넘어서,
운영체제, 표준 라이브러리, 그리고 현대 시스템 소프트웨어의 설계 철학을 이해하는 출발점이 된다고 생각하기에
정리해서 포스팅 해보았다.!

'개발 > 임베디드(Embedded)' 카테고리의 다른 글
| [소프트웨어 공학] Automotive-SPICE 개요 (A-SPICE) (2) | 2026.01.23 |
|---|---|
| [네트워크] CAN 통신 (2) | 2026.01.10 |
| [C/C++] 정의와 선언의 차이 in C언어 (0) | 2025.12.30 |
| [C/C++] C언어 자료형 (0) | 2025.12.24 |
| [C/C++] C언어 프로젝트에서의 모듈화 (2) | 2025.12.23 |
