์ค๋์ ๋ฉค๋ฒํจ์์๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋ค.
๋ค๋ฅธ ๊ฐ์ฒด์งํฅ์ธ์ด์์๋ ๋ค์๊ณผ๊ฐ์ด ๊ฐ์ฒด.
๋ฉ์๋()๋ฅผ ํตํด์ ํจ์๋ฅผ ํธ์ถํ์๋ค.
Student jacky = new Student("Jacky", "CSE", 4.4);
jacky.say_hi();
์ด์ ์ ํฌ์คํ
์์ ์ ์ํ๋ student_t
๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ฒ ๋ค.
typedef struct student {
char* name;
char* major;
float gpa;
} student_t;
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);
}
์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์ง์ํ๋ say_hi()
ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์.
void student_say_hi(student_t* this) {
if (this->gpa > 4.0) { // ๊ฐ์ฒด๊ฐ ์ํ๋ฅผ ๊ฐ๋๋ค!
printf("๋๋ %s๋ค.\n", this->name);
return;
}
printf("์๋
ํ์ธ์ ์ ๋ %s๋ฅผ ์ ๊ณตํ๊ณ ์๋ %s๋ผ๊ณ ํฉ๋๋ค. ๋ฐ๊ฐ์ต๋๋ค.\n", this->major, this->name);
}
ํจ์์ ์ธ์๋ก
student_t* this
๋ฅผ ๋ฃ์ด์ฃผ๋๊ฒ ๊ฑฐ์ฌ๋ฆด ์ ์๋๋ฐ ํ์ด์ฌ์์ self๊ณ์ ๋ถ์ด๋๊ฒ์ฒ๋ผ ํด์ผ๋๋ค. C์ธ์ด๋ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๊ณ ๋ คํด์ ์ค๊ณํ ๊ฐ์ฒด์งํฅ ์ธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ด์ฉ ์ ์๋ค.
student_t* jacky = new_student("Jacky", "CSE", 4.4);
student_say_hi(jacky);
๋ฉค๋ฒํจ์ ํธ์ถ์ ํตํ๋๊ฒ ์๋๋ผ์ ๋ญ๊ฐ ๋ง์ด ์๋๋ค. ๊ตฌ์กฐ์ฒด์ ํจ์ํฌ์ธํฐ๋ฅผ ํตํด์ ๋ฉค๋ฒํจ์๋ฅผ ๋ง๋ค์ด๋ณด์.
extern void student_say_hi(student_t* this);
struct student {
char* name; // ์ด๋ฆ
char* major; // ์ ๊ณต
float gpa; // ํ์
void (*say_hi) (struct student *); // ์๊ธฐ์๊ฐ
};
student_t* new_student(char* name, char* major, float gpa) {
student_t* this = malloc(sizeof(student_t));
this->name = name;
this->major = major;
this->gpa = gpa;
this->say_hi = student_say_hi;
return this;
}
student_t *jacky = new_student("Jacky", "CSE", 4.4);
jacky->say_hi(jacky); // this๋ฅผ ํญ์ ๋๊ฒจ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํธํ๋ค.
์ด๋ ๊ฒ ๋ฉค๋ฒํจ์
๋ฅผ ๋ง๋ค ์๋ ์๋ค. ๊ทผ๋ฐ ๊ฒ๋ ๋ถํธํ๋ค. ์ง๊ฐ ํธ์ถํด๋๊ณ ์ง๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค
์ค์ ๋ก C์์ ๊ฐ์ฒด์งํฅ์ ํ๋ ์ฝ๋๋ค์ ๋ณด๋ฉด ๋ฉค๋ฒํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋๊ฒ์ด 100์ค์ 99์ด๋ค.
student_say_hi(jacky);
๊ทธ๋ฅ ๋ฉค๋ฒํจ์
๋ฅผ ํจ์ํฌ์ธํฐ
๋ฅผ ํตํด์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ์ ๋๋ง ์ดํดํ๊ณ ๋์ด๊ฐ๋ฉด ์ถฉ๋ถํ๋ค. ์ง์ง ๋
ธ์ธ๋ชจ๋ค.
๊ฐ์๊ธฐ ๋์ด๋ ๋ด๋ ค๊ฐ์ ํ๋ญ