์งฑ์งฑ ํธํ ๋ค๋ฅธ ๊ฐ์ฒด์งํฅ ์ธ์ด ํ๋ค๊ฐ C์ธ์ด๋ก ๋์ด์ค๋ฉด ๋ถํธํ๊ฒ ํ๋๊ฐ๊ฐ ์๋๋ค.
๋ถํธํ๊ฑฐ ๋์ดํ๋ผ๊ณ ํ๋ฉด ํ๋๋๋ ์์ง๋ง ์ ์ผ ๋ถํธํ๊ฑด class
์ ๋ถ์ฌ๋ค.
๋ญ์ผ ๋ด ๊ฐ์ฒด์งํฅ ๋๋ ค์ค์
C์ธ์ด๋ ๊ฐ์ฒด์งํฅ ์ธ์ด๊ฐ ์๋๋ค. ํ์ง๋ง ๊ฐ์ฒด์งํฅ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ผ ๋ฟ์ด๋ค ๊ฐ์ฒด์งํฅ์ธ์ด๊ฐ ์๋๋๋ผ๋ ๋ถํธํ์ง๋ง ๊ฐ์ฒด์งํฅ์ ์ ์ฉํ ์ ์๋ค. ๋ฆฌ๋ ์ค ์ปค๋์ด๋ GTK+์ C์์๋ ๊ฐ์ฒด์งํฅ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ข์ ์์์ผ ๊ฒ์ด๋ค.
์ค๋์ C์ธ์ด์์ ์ต๋ํ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ์ ์ฉ์์ผ์ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ฅผ ํ๋ด๋ด๋ ๋ฒ์๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋ค.
๋ป์ด์์ผ๋ฉด ๊ธธ์ด์๋๋ฒ
์ด์ฉ๋ฉด ๊ทธ ๋ชจ์ต์ด ์์์๋ converter์ converter์ converter๊ฐ์ ํผ์ข ์ ๋ชจ์ต์ผ๋ก ๋ณด์ผ์ง ๋ชจ๋ฅด๊ฒ ๋ค... ์๋ฌดํผ ์์๋ณด์.
ํ๊ต์์ ๊ณผ์ ํ ๋ ๋ณด๋ฉด ๊ต์๋์ด ์ธ์ด ์๋ฌด๊ฑฐ๋ ์จ๋ ๋๋ค๊ณ ํ๋๋ฐ ๊ตณ์ด~ ๊ทธ๊ฑธ c์ธ์ด ์จ์ ๊ตฌํํ๋ ์ฌ๋๋ค์ด ์๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ malloc engineer๋ผ๊ณ ๋ถ๋ฅธ๋ค.
C์ธ์ด๋ก ๊ฐ์ฒด์งํฅ์ ํ๋ด๋ด๊ธฐ ์ํด์๋ ์ ์ ์ฐ๋ฆฌ๋ malloc engineer๊ฐ ๋์ด์ผ ํ ํ์๊ฐ ์๋ค. ์ ๊ทธ๋ค์ด malloc
์ ์ก์๋จนํ ๊ดด๋ฌผ์ด ๋์๋์ง, ๊ทธ๋ค์ ๋จธ๋ฆฟ์์ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ค๋ ํจ๊ป ์์๋ณด์.
์ด์ ํฌ์คํ ์์ ๋ง๋ค์๋ ํ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์๊ฐํด๋ณด์.
struct student {
char* name; // ์ด๋ฆ
char* major; // ์ ๊ณต
float gpa; // ํ์
};
์๋ก์ด ํ์์ ํ๋ ๋ง๋ค๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ์๋์ ๊ฐ์ ์์ ์ ํ๋ค.
struct student t = {
.name = "Jacky",
.major = "CSE",
.gpa = 4.4,
};
ํ๋ฒ ์์ ๋ฐฉ์์ ๋ค๋ฅธ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ํ๋ ๊ฒ์ฒ๋ผ ์๋์ ์์ฑ๋ฐฉ์์ผ๋ก ํ ์ ์๊ฒ ๋ง๋ค์ด๋ณด์.
Student jacky = new Student("Jacky", "CSE", 4.4);
์ฐ์ ๊ฑฐ์ถ์ฅ์ค๋ฌ์ด struct student ๋ฅผ ์์ค๋ค.
typedef struct student student_t;
๐๐ปโโ๏ธ FYI:
typedef
์#define
์ ์ฐจ์ด์ ?
์ฐ์ ,#define
์scope
์์ ์์ ๋กญ์ง๋งtypedef
๋scope
์ ์ํฅ์ ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ , #define์ผ๋ก ์ ์ํ ํฌ์ธํฐ๋ ์์์น ๋ชปํ ๋์์ ํ๋ค. ์๋์ ์์๋ฅผ ๋ณด์#define student_p student_t*
student_p jack, jill;
jack
์student_t*
,jill
์student_t
ใ ค
typedef student_t* student_p;
student_p jack, jill;
jack
๊ณผjill
๋ชจ๋student_t*
ใ ค
#define
์ ๋จ์ํ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํตํด ์นํํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋์์ ์ฐจ์ด๊ฐ ๋ํ๋๋ค.
student_t *jack, *jill;ใ คใ คใ ค์ด๋ ๊ฒ ํด์ผ๋๋๋ฐ
student_t* jack, jill;ใ คใ คใ คใ ค์ด๋ ๊ฒ ๋จ์ํ๊ฒ ์นํํจ
๐ฎ๐ปโโ๏ธ TMI: TODO: _t
์ปจ๋ฒค์
์ค๋ช
์ฌ๊ธฐ์ ์ถ๊ฐ
student_t new_student(char* name, char* major, float gpa) {
student_t this = {
.name = name,
.major = major,
.gpa= gpa,
};
return this;
}
์๋ก์ผํ๋ฉด ์ด์ ํ์์ ๋ง๋ค๋ ์๋์ฒ๋ผ ๋ง๋ค ์ ์๋ค!
student_t jacky = new_student("Jacky", "CSE", 4.4);
๊ต์ฅํ ๊น๋ํด ๋ณด์ธ๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋๋ฐ jacky์ ์ฃผ์๊ฐ
์ ๋์
ํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌ์กฐ์ฒด ๊ฐ
์ ๋์
ํ๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ๋ค๋๊ฒ. (student_t
์ ์ฌ์ด์ฆ๋งํผ mov
๊ฐ ๋ฐ์ํ๋ค.)
์ด๋ฐ๋๋...
pointer
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ๋ฐ๊ฟ ์ ์๋ค.์ฌ์ค C์
Call by reference
,pass by reference
๋ผ๋๊ฒ์ ์๋ค. ํจ์์ ์ฃผ์๊ฐ ์ค๊ฐ๋๊ฒ์ reference์ ์ด๋์ด ์๋ํฌ์ธํฐ ๊ฐ
์ ๋ณต์ฌ๋ค.
student_t* new_student(char* name, char* major, float gpa) {
student_t this = {
.name = name,
.major = major,
.gpa= gpa,
};
return &this;
}
๊ทธ๋ฅ ์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ํธํ ๊ฑฐ๊ฐ์๋ฐ ์ ๋๋ก ์์ฒ๋ผ ํ๋ฉด ์๋๋ค. this๊ฐ stack
์ ์์ธ ๋ณ์์ด๊ณ new_student()
์ ํธ์ถ ์ข
๋ฃ์์ lifetime
์ด ๋๋๊ธฐ ๋๋ฌธ์ด๋ค. this
๋ ์ธ์ ๋ ๋ฎ์ด ์์์ง ์ ์๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด malloc()
์ ์ด์ฉํด์ stack
์ด ์๋ heap
์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์์ผํ๋ค.
#include <stdlib.h>
#include <assert.h>
student_t* new_student(char* name, char* major, float gpa) {
student_t* this = malloc(sizeof(student_t));
assert(this);
this->name = name;
this->major = major;
this->gpa = gpa;
return this;
}
// Usage
student_t* jacky = new_student("Jacky", "CSE", 4.4);
๐๐ปโโ๏ธ FYI:
malloc()
์ผ๋ก ํ ๋น๋ฐ์ ๊ณต๊ฐ์ ์(student_t *)
๋ก ์บ์คํ ํ์ง ์๋๊ฐ?
c++์์๋ ์บ์คํ ์ด ๋ฐ๋์ ํ์ํ๊ธฐ ๋๋ฌธ์ c++ ํธํ์ ์ํด์๋ ํ์ํ์ง๋ง ANSI/ISO C ํ์ค์์ ์ด๋ฌํ ์บ์คํ ์ ์ ํ ํ์ํ์ง ์๋ค. g++๊ณผ gcc๋ก ๊ฐ๊ฐ ์ปดํ์ผ ํด๋ณด๋ฉด ์ ์ ์๋ค.
๐ฏ ๊ฟํ: ์์๋๋ฉด ์ข์
assert()
assert(this);
๋ this๊ฐ 0์ด ์๋๋ฉด ์กฐ์ฉํ ์ง๋๊ฐ๊ณ 0์ด๋ฉด ์ข ๋ฃํ๋ค.
malloc()
ํจ์๊ฐ ๊ณต๊ฐ์ ๋ฐ์์ค๋๋ฐ ์คํจํ๋ฉดNULL
์ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ์ด ์ฝ๋๋ค.
NULL
์(void *)0
์ผ๋กstddef.h
์ ์ ์๋์ด ์๋ค.
์ฌ์คassert
๋ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃํ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ ํ๋ก๊ทธ๋จ์์malloc()
๊ณผ ๊ฐ์ด ์ฐ๋ ์ผ์ ์์ด์ผ ํ ๊ฒ์ด๋ค.
์ฑ๊ธํค ํจํด์
๋จ ํ๋์ ๊ฐ์ฒด๋ง์ ์์ฑํ๋ ๋์์ธํจํด์ด๋ค. C์์๋ ํจ์์ static
๋ณ์๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
student_t* new_student(char* name, char* major, float gpa) {
static student_t this;
static bool is_initialized;
if (is_initialized) return &this;
this = (student_t) {
.name = name,
.major = major,
.gpa = gpa,
};
is_initialized = true;
return &this;
}
this
๋ ๋จ ํ๋ฒ๋ง ์ด๊ธฐํ๋๊ณ new_student
๋ฅผ ๊ณ์ ํธ์ถํด๋ ๊ฐ์ &this
๋ฅผ ๋ฆฌํดํ๋ค.
๐ : ์๊น๋ ํจ์ ๋ด๋ถ ๋ณ์ &this ๋ฆฌํดํ์ง ๋ง๋ผ๊ณ ํ์ง์์์๋?
Answer : ํจ์ ๋ด๋ถ์static
์ผ๋ก ์ ์ธ๋ ๋ณ์๋stack
์ ์์ด์ง ์๊ณ.bss
์์ญ์ ์๋ฆฌ์ก๋๋ค. ๋ฐ๋ผ์ ๋ฎ์ด ์์์ง ์ผ์ด ์๊ธฐ๋๋ฌธ์static
๋ณ์์ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋๊ฒ์ ํฉ๋ฒ์ ์ด๋ค. ์์ธํ ๋ด์ฉ์runtime storage
ํธ ์ฐธ๊ณ .
๐
static bool is_initialized
์ด๊ฑฐ ์ด๊ธฐํ ์ํด์ค๋ ๋๋๊ฑฐ๋?
Answer :.bss
์์ญ์ ์๋ฆฌํ๋static ๋ณ์
๋ค,์ ์ญ๋ณ์
๋ค์ ๋ฐ๋ก ์ด๊ธฐํ๋ฅผ ํ์ง ์์๋0
์ผ๋ก ์ด๊ธฐํ๊ฐ ๋ณด์ฅ๋๋ค. (float, double๋ฑ์0.0
์ผ๋ก ์ด๊ธฐํํด์ค๋ค)
๋ฐ๋ผ์ static์ผ๋ก is_initialized๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ด๋ถ์ ๋ณ์๊ฐ0
์ธ์ง ๋น๊ตํ๋๊ฒ์ผ๋ก ๊ทธ ์ญํ ์ ๋์ ํด๋ ๋๋ค.
TODO: ์ธ์ ์ ๋ถ ์๋๊ฒจ ์ฃผ๋๊ฑฐ๋ ์ด๋ป๊ฒ ๊ตฌํํ๋์ ๊ดํ ๋ด์ฉ ์ฌ๊ธฐ์
TODO: ์ธ์ ๊ธฐ๋ณธ๊ฐ ์ค์ ์ฌ๊ธฐ์ (๊น์ค์ฒ )
์๋ฉธ์์์์๋ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ๋ค๋ ํจ๊ป ์๋ฉธ์์ผ์ผ ํ ์ฑ ์์ด ์๋ค. ๋ฉค๋ฒ๊ฐ ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ณ ์๋ค๋ฉด this๋ฅผ ์๋ฉธ์ํค๊ธฐ ์ ์ ๋จผ์ ๋ฉค๋ฒ๋ค์ ์ ๋ฆฌ์์ผ์ค์ผํ๋ค. ์ฌ๊ธฐ์๋ name๊ณผ major๊ฐ
string literal
์ ๊ฐ๋ฅดํค๊ธฐ๋๋ฌธ์ ๊ทธ๋ฅ this๋ง ์ ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
์๋ฉธ์ ๊ธฐ๋ฅ์ ํจ์๋ก ๋ง๋ค์ด๋ณด์.
void del_student(student* this) {
free(this);
}
// Usage
student_t jacky = new_student(...);
del_student(jacky);
๐ฎ๐ปโโ๏ธ TMI: ๋ณดํต destructor, destroyer, del ๋ฑ์ ๋ช ์นญ์ ์ด๋ค. ์ทจํฅ์ ๋ฐ๋ผ์ ์์ ๋ถ์ผ์ง ๋ค์ ๋ถ์ผ์ง ๋ค๋ฆ del_student, student_del ์ด๋ฐ์์ผ๋ก
๋ง์ฝ์ name๊ณผ major๊ฐ string literal
์ด ์๋ ๋์ ํ ๋น๋ ์์ญ์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ๋ ์์ฑ์์ ์๋ฉธ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
#include <string.h>
student_t* new_student(char* name, char* major, float gpa) {
student_t* this = malloc(sizeof(student_t));
this->name = strdup(name);
this->major = strdup(major);
this->gpa = gpa;
return this;
}
void del_student(student* this) {
free(this->name);
free(this->major);
free(this);
}
๐ฏ ๊ฟํ:
strdup()
๋new_string()
๊ฐ์ ์ญํ ์ ํ๋ค. ์คํธ๋ง์ ๋์ ํ ๋น๋ ๊ณต๊ฐ์ ๋ด์์ ๊ทธ ์ฃผ์๊ฐ์ ๋ฆฌํดํด์ค๋ค.heap
์ ๋์ ํ ๋น๋ ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋์ค์free()
ํด์ค์ผ ํ ์๋ฌด๊ฐ์๋ค.
In fact, all young people are like that now, once they sit on a chair, everyone is leaning back and curving their spine. Because I work all day sitting in the office, I often play basketball stars and exercise every day.
๋ฉ์ ธ์ ใ ใ malloc engineer ๋ ์ฒ์๋ค์ด๋ณด๋๋ฐ ๋ฑ ๋ง๋ ๋จ์ด๊ฐ๋ค์ ใ ใ ใ ใ
๊ธ ์ ์ฝ์์ต๋๋ค.
'ํ์ง๋ง ๋ป์ด์์ผ๋ฉด ๊ธธ์ด์๋๋ฒ' ์ด ๋ฌธ์ฅ์ด ์ ์ฌ๊ธ์ ์ธ๋ฆฌ๋ค์
์์ผ๋ก๋ ์ข์ ๊ธ ๋ถํ๋๋ฆฝ๋๋ค. :)