๐ข chap8. ์์๊ณผ ๋คํ์ฑ
โญ 8.1 ์์
์์ ๊ด๊ณ: to-be ๊ด๊ณ, ํ์ฅ ๊ด๊ณextention relationship
์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ฐ์ ์์ฑ์ ๊ฐ๊ณ ์๋๋ฐ ๋ค๋ฅธ ์ถ๊ฐ ์์ฑ์ ๊ฐ์ง ๊ฒฝ์ฐ
์) ํ์์ ์ฌ๋์ด๋ผ๋ ๋ชจ๋ ์์ฑ์ ๊ฐ๊ณ ์์ผ๋ ๋ค๋ฅธ ์ถ๊ฐ ์์ฑ์ ๊ฐ์ง ์ ์์
- ์ฝ๋ ๋ฐ์ค 8-1 (p.316)
Person ํด๋์ค์ Student ํด๋์ค ์์ฑ ๊ตฌ์กฐ์ฒด
โ ์๋ก์ด ์์ฑ์ผ๋ก ํ์ฅ, to be ๊ด๊ณ, โํ์์ ์ฌ๋์ด๋คโ
person_t: ์ํผํ์ supertype, ๋ฒ ์ด์คํ์ base type, ๋ถ๋ชจ ํ์ parent type
student_t: ์์ ํ์ child type, ์์๋ฐ์ ์๋ธํ์ inherited subtype
โ๏ธ ์์์ ๋ณธ์ง
์์ ๊ด๊ณ: ์ผ๋์ผ ํฉ์ฑ ๊ด๊ณ
Student ํด๋์ค์ ์์ฑ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ๋น๊ณต๊ฐ person ๊ฐ์ฒด๊ฐ ์กด์ฌ
โํ์ ๋ด๋ถ์ ์ธ๊ฐ์ ์์ฑ์ ๊ฐ์ง
- ์ฝ๋ ๋ฐ์ค 8-2 (p.317)
Person ํด๋์ค์ Student ํด๋์ค ์์ฑ ๊ตฌ์กฐ์ฒด(์ค์ฒฉ๋จ)
โ ํฌ์ธํฐ๊ฐ ์๋ ๊ตฌ์กฐ์ฒด ๋ณ์ ์ฌ์ฉ, ์ด์ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ํ ์ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ๊ฐ์ง
์ ์บ์คํ : ์์์ ์์ฑ ๊ตฌ์กฐ์ฒด ์๋ฃํ์ ํฌ์ธํฐ๋ฅผ ๋ถ๋ชจ ์์ฑ ๊ตฌ์กฐ์ฒด ์๋ฃํ์ผ๋ก ๋ณํ
student_t ํฌ์ธํฐ๋ฅผ person_t ํฌ์ธํฐ๋ก ๋ณํํ ์ ์์
์์ 8-1 (p.318)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include <stdio.h> typedef struct { char first_name[32]; char last_name[32]; unsigned int birth_year; } person_t; typedef struct { person_t person; char student_number[16]; // ์ถ๊ฐ ์์ฑ unsigned int passed_credits; // ์ถ๊ฐ ์์ฑ } student_t; int main(int argc, char** argv) { student_t s; student_t* s_ptr = &s; person_t* p_ptr = (person_t*)&s; printf("Student pointer points to %p\n", (void*)s_ptr); printf("Person pointer points to %p\n", (void*)p_ptr); return 0; }
s_ptr๊ณผ p_ptr ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
1 2 3 4
gcc ExtremeC_examples_chapter8_1.c -o ex8_1.out ./ex8_1.out //Student pointer points to 0x7ffeb64e6500 //Person pointer points to 0x7ffeb64e6500
student_tํ์ ๊ตฌ์กฐ์ฒด ๋ณ์๊ฐ person_t ๊ตฌ์กฐ์ฒด๋ฅผ ์์ํ๋ค๋ ๋ป
โ student ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก Person ํด๋์ค์ ํ์ ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ
์ฝ๋ ๋ฐ์ค 8-3 (p.319)
์ปดํ์ผ๋์ง ์๋ ์์ ๊ด๊ณ ๋ง๋ค๊ธฐ
๋ถ์์ ํ ํ์ ์ ์ธโ๋ณ์ ์์ฑ ๋ถ๊ฐ๋ฅ, ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ถ๊ฐ๋ฅ
์ค์ฒฉ๋ ๊ตฌ์กฐ์ฒด ๋ณ์ ์ฌ์ฉ์ ์ํด์๋ student_t ๊ตฌ์กฐ์ฒด๊ฐ ๋น๊ณต๊ฐ์ธ person_t ๊ตฌ์กฐ์ฒด์ ์ค์ ์ ์๋ฅผ ์์์ผ ํจ
์์ ๊ด๊ณ ๊ตฌํ์ ์ํ ์ ๊ทผ ๋ฐฉ๋ฒ
- ์์ ํด๋์ค๊ฐ ๋ฒ ์ด์ค ํด๋์ค์ ๋ํ ๋น๊ณต๊ฐ ๊ตฌํ์ ์ ๊ทผ
- ์์ ํด๋์ค๊ฐ ๋ฒ ์ด์ค ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค์๋ง ์ ๊ทผ
โ๏ธ C์ ์์์ ๊ดํ ์ฒซ ๋ฒ์งธ ์ ๊ทผ๋ฒ
์ฒซ ๋ฒ์งธ ์ ๊ทผ๋ฒ์ ๋ํด ์์ 8-2์์ ์ค๋ช
Student ํด๋์ค๋ Person ํด๋์ค์ ์์ฑ ๊ตฌ์กฐ์ฒด์ ๋ํ ์ค์ ๋น๊ณต๊ฐ ์ ์์ ์ ๊ทผํ ์ ์์ด์ผ ํจ
์์ 8-2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#ifndef EXTREME_C_EXAMPLES_CHAPTER_8_2_PERSON_H #define EXTREME_C_EXAMPLES_CHAPTER_8_2_PERSON_H // ์ ๋ฐฉ ์ ์ธ struct person_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ struct person_t* person_new(); // ์์ฑ์ void person_ctor(struct person_t*, const char* /* first name */, const char* /* last name */, unsigned int /* birth year */); // ์๋ฉธ์ void person_dtor(struct person_t*); // ํ์ ํจ์ void person_get_first_name(struct person_t*, char*); void person_get_last_name(struct person_t*, char*); unsigned int person_get_birth_year(struct person_t*); #endif
Person ํด๋์ค๋ฅผ ์ ์ธํ๋ ํค๋ ํ์ผ ์์ฑ์ ํจ์โperson ๊ฐ์ฒด ์์ฑ์ ์ํ ๋ชจ๋ ๊ฐ์ ๋ฐ์ ์์ฑ ๊ตฌ์กฐ์ฒด person_t์ ๋ํ ์ค์ ์ ์๋ฅผ ํฌํจํ๋ฉด ์๋จ(์บก์ํ)โ๋น๊ณต๊ฐ ํค๋ ํ์ผ(์ด ํค๋์ ์ค์ ์ ์๋ฅผ ํฌํจํ๋ ํค๋ ํ์ผ)
1 2 3 4 5 6 7 8 9 10 11
#ifndef EXTREME_C_EXAMPLES_CHAPTER_8_2_PERSON_P_H #define EXTREME_C_EXAMPLES_CHAPTER_8_2_PERSON_P_H // ๋น๊ณต๊ฐ ์ ์ typedef struct { char first_name[32]; char last_name[32]; unsigned int birth_year; } person_t; #endif
์ด๋ Person ํด๋์ค์ ์ผ๋ถ๋ถ, student_t ์์ฑ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๊ธฐ ์ํด ํ์
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 32 33 34 35 36 37 38
#include <stdlib.h> #include <string.h> // person_t๋ ๋ค์ ํค๋ ํ์ผ์ ์ ์๋์ด ์์ต๋๋ค. #include "ExtremeC_examples_chapter8_2_person_p.h" // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ person_t* person_new() { return (person_t*)malloc(sizeof(person_t)); } // ์์ฑ์ void person_ctor(person_t* person, const char* first_name, const char* last_name, unsigned int birth_year) { strcpy(person->first_name, first_name); strcpy(person->last_name, last_name); person->birth_year = birth_year; } // ์๋ฉธ์ void person_dtor(person_t* person) { // ํ ์ผ ์์ } // ํ์ ํจ์ void person_get_first_name(person_t* person, char* buffer) { strcpy(buffer, person->first_name); } void person_get_last_name(person_t* person, char* buffer) { strcpy(buffer, person->last_name); } unsigned int person_get_birth_year(person_t* person) { return person->birth_year; }
Person ํด๋์ค์ ๋น๊ณต๊ฐ ๊ตฌํ์ ๋ํ๋
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
#ifndef EXTREME_C_EXAMPLES_CHAPTER_8_2_STUDENT_H #define EXTREME_C_EXAMPLES_CHAPTER_8_2_STUDENT_H // ์ ๋ฐฉ ์ ์ธ struct student_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ struct student_t* student_new(); // ์์ฑ์ void student_ctor(struct student_t*, const char* /* first name */, const char* /* last name */, unsigned int /* birth year */, const char* /* student number */, unsigned int /* passed credits */); // ์๋ฉธ์ void student_dtor(struct student_t*); // ํ์ ํจ์ void student_get_student_number(struct student_t*, char*); unsigned int student_get_passed_credits(struct student_t*); #endif
Student ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ ๋ํ๋ student ๊ฐ์ฒด๊ฐ ์ค์ ๋ก person ๊ฐ์ฒด๋ฅผ ํฌํจโPerson ํด๋์ค์ ์์ฑ์์ ๋น์ทํ ์ธ์๋ฅผ ๋ฐ์ ํ์ ํจ์๊ฐ 2๊ฐ๋ฟ: Person ํด๋์ค์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#include <stdlib.h> #include <string.h> #include "ExtremeC_examples_chapter8_2_person.h" // 1. person_t๋ ๋ค์ ํค๋ ํ์ผ์ ์ ์๋์ด ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ํ์ํฉ๋๋ค. #include "ExtremeC_examples_chapter8_2_person_p.h" // ์ ๋ฐฉ ์ ์ธ typedef struct { // 2. ์ฌ๊ธฐ์์ person ํด๋์ค์์ ๋ชจ๋ ์์ฑ์ ์์๋ฐ์ผ๋ฉฐ, // ์ด ์ค์ฒฉ์ผ๋ก ์ธํด person ํด๋์ค์ ๋ชจ๋ ํ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. person_t person; char* student_number; unsigned int passed_credits; } student_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ student_t* student_new() { return (student_t*)malloc(sizeof(student_t)); } // ์์ฑ์ void student_ctor(student_t* student, const char* first_name, const char* last_name, unsigned int birth_year, const char* student_number, unsigned int passed_credits) { // 3. ๋ถ๋ชจ ํด๋์ค์ ๋ํ ์์ฑ์ ํธ์ถํ๊ธฐ person_ctor((struct person_t*)student, first_name, last_name, birth_year); student->student_number = (char*)malloc(16 * sizeof(char)); strcpy(student->student_number, student_number); student->passed_credits = passed_credits; } // ์๋ฉธ์ void student_dtor(student_t* student) { // 4. ์์ ๊ฐ์ฒด๋ฅผ ๋จผ์ ์๋ฉธ์์ผ์ผ ํฉ๋๋ค. free(student->student_number); // ๊ทธ๋ฐ ๋ค์, ๋ถ๋ชจ ํด๋์ค์ ์๋ฉธ์ ํจ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. person_dtor((struct person_t*)student); } // ํ์ ํจ์ void student_get_student_number(student_t* student, char* buffer) { strcpy(buffer, student->student_number); } unsigned int student_get_passed_credits(student_t* student) { return student->passed_credits; }
- Person ํด๋์ค์ ๋น๊ณต๊ฐ ํค๋๋ฅผ ํฌํจ
- person_t๊ฐ ์ด๋ฏธ ์ ์๋์ด ์์ด์ผ ํจ
- ๋ถ๋ชจ์ ์์ฑ์ ํธ์ถโ๋ถ๋ชจ ๊ฐ์ฒด์ ๋ํ ์์ฑ์ ์ด๊ธฐํ
- ์์ ์์ค ๋ค์ ๋ถ๋ชจ ์์ค์์ ์๋ฉธ์๋ฅผ ํธ์ถ
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 32 33 34 35 36 37 38 39
#include <stdio.h> #include <stdlib.h> #include "ExtremeC_examples_chapter8_2_person.h" #include "ExtremeC_examples_chapter8_2_student.h" int main(int argc, char** argv) { // student ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์์ฑํ๊ธฐ struct student_t* student = student_new(); student_ctor(student, "John", "Doe", 1987, "TA5667", 134); // ์ด์ person์ ์์ฑ์ student ๊ฐ์ฒด์์ ์ฝ๊ธฐ ์ํด person์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. char buffer[32]; // ๋ถ๋ชจ์ ์๋ฃํ์ ๋ํ ํฌ์ธํฐ๋ก ์ ์บ์คํ ํ๊ธฐ struct person_t* person_ptr = (struct person_t*)student; person_get_first_name(person_ptr, buffer); printf("First name: %s\n", buffer); person_get_last_name(person_ptr, buffer); printf("Last name: %s\n", buffer); printf("Birth year: %d\n", person_get_birth_year(person_ptr)); // ์ด์ student ๊ฐ์ฒด์ ํ์ ๋ ์์ฑ์ ์ฝ์ต๋๋ค. student_get_student_number(student, buffer); printf("Student number: %s\n", buffer); printf("Passed credits: %d\n", student_get_passed_credits(student)); // student ๊ฐ์ฒด๋ฅผ ์๋ฉธ ๋ฐ ํด์ ํ๊ธฐ student_dtor(student); free(student); return 0; }
Person๊ณผ Student ํด๋์ค ๋ชจ๋์ ๋ํ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ ํฌํจ, but ๊ฐ์ฒด๋ student๋ง ์์ฑ student๋ person ๊ฐ์ฒด์์ ๋ชจ๋ ์์ฑ์ ์์ ๋ฐ์โPerson ํด๋์ค์ ํ์ ํจ์๋ก ์ฝ์ ์ ์์
1 2 3 4 5 6 7 8 9 10
gcc -c ExtremeC_examples_chapter8_2_person.c -o person.o gcc -c ExtremeC_examples_chapter8_2_student.c -o student.o gcc -c ExtremeC_examples_chapter8_2_main.c -o main.o gcc person.o student.o main.o -o ex8_2.out ./ex8_2.out //First name: John //Last name: Doe //Birth year: 1987 //Student number: TA5667 //Passed credits: 134
โ๏ธ C์ ์์์ ๊ดํ ๋ ๋ฒ์งธ ์ ๊ทผ๋ฒ
๋ ๋ฒ์งธ ์ ๊ทผ๋ฒ์ ๋ํด ์์ 8-3์์ ์ค๋ช
๋ถ๋ชจ์ ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ์์ฑโ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค ๊ตฌํ๊ณผ ๋ ๋ฆฝ์ โ์ ๋ณด ์๋
์์ 8-3์ 8-2์ ๋งค์ฐ ๋น์ทํ์ง๋ง, Student๊ฐ Personํด๋์ค์ ๋น๊ณต๊ฐ ์ ์์๋ ์์กดํ์ง ์๋๋ค๋ ์ฐจ์ด ์กด์ฌโ์์ ํด๋์ค ๊ตฌํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ถ๋ชจ ํด๋์ค ๊ตฌํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
์์ 8-2๋ person_t์ ์ค์ ์ ์์ ์ ๊ทผโ์ ๋ณด ์๋ ์๋ฆฌ ์๋ฐ ๊ฐ๋ฅ์ฑ
์์ 8-3
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
// ์ ๋ฐฉ ์ ์ธ struct student_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ struct student_t* student_new(); // ์์ฑ์ void student_ctor(struct student_t*, const char* /* first name */, const char* /* last name */, unsigned int /* birth year */, const char* /* student number */, unsigned int /* passed credits */); // ์๋ฉธ์ void student_dtor(struct student_t*); // ํ์ ํจ์ void student_get_first_name(struct student_t*, char*); void student_get_last_name(struct student_t*, char*); unsigned int student_get_birth_year(struct student_t*); void student_get_student_number(struct student_t*, char*); unsigned int student_get_passed_credits(struct student_t*); #endif
Student ํด๋์ค์ ์๋ก์ด ๊ณต์ฉ ์ธํฐํ์ด์ค: ์ฒซ ๋ฒ์งธ ์ ๊ทผ๋ฒ๊ณผ ๋ฌ๋ฆฌ ๋ ๋ฒ์งธ ์ ๊ทผ๋ฒ์์๋ Student ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค. student_t ํฌ์ธํฐ๋ฅผ person_t ํฌ์ธํฐ๋ก ๋ณํํ ์ ์์โ์ ์บ์คํ ๋ถ๊ฐ๋ฅโStudent ํด๋์ค๋ Person ํด๋์ค์์ ์ ์ธํ ๋ชจ๋ ํ์ ํจ์๋ฅผ ๋ฐ๋ณตํด์ผ ํจ(p.323๊ณผ ๋น๊ต)
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 32 33 34 35 36 37 38 39 40 41 42
#include <stdlib.h> #include <string.h> // ๋น๊ณต๊ฐ ์ ์ typedef struct { char first_name[32]; char last_name[32]; unsigned int birth_year; } person_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ person_t* person_new() { return (person_t*)malloc(sizeof(person_t)); } // ์์ฑ์ void person_ctor(person_t* person, const char* first_name, const char* last_name, unsigned int birth_year) { strcpy(person->first_name, first_name); strcpy(person->last_name, last_name); person->birth_year = birth_year; } // ์๋ฉธ์ void person_dtor(person_t* person) { // ํ ์ผ ์์ } // ํ์ ํจ์ void person_get_first_name(person_t* person, char* buffer) { strcpy(buffer, person->first_name); } void person_get_last_name(person_t* person, char* buffer) { strcpy(buffer, person->last_name); } unsigned int person_get_birth_year(person_t* person) { return person->birth_year; }
Person ํด๋์ค์ ์๋ก์ด ๊ตฌํ: person_t์ ๋น๊ณต๊ฐ ์ ์๊ฐ ์์ค ๋ด์ ์กด์ฌ, ๋น๊ณต๊ฐ ํค๋ ํ์ผ์ด ์ฌ์ฉ๋์ง ์์(p.321๊ณผ ๋น๊ต)โStudent ํด๋์ค ๊ฐ์ ํ ํด๋์ค์ ์ ์๋ฅผ ๊ณต์ ํ์ง ์๊ฒ ๋ค๋ ๋ป(Person ํด๋์ค์ ๋ํ ์บก์ํ)
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
#include <stdlib.h> #include <string.h> // 1. person ํด๋์ค์ ๋ํ ๊ณต์ฉ ์ธํฐํ์ด์ค #include "ExtremeC_examples_chapter8_3_person.h" // ์ ๋ฐฉ ์ ์ธ typedef struct { char* student_number; unsigned int passed_credits; // 2. person_t๊ฐ ๋ถ์์ ํ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ํฌ์ธํฐ๊ฐ ์์ด์ผ ํฉ๋๋ค. struct person_t* person; } student_t; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ student_t* student_new() { return (student_t*)malloc(sizeof(student_t)); } // ์์ฑ์ void student_ctor(student_t* student, const char* first_name, const char* last_name, unsigned int birth_year, const char* student_number, unsigned int passed_credits) { // 3. ๋ถ๋ชจ ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๊ธฐ student->person = person_new(); person_ctor(student->person, first_name, last_name, birth_year); student->student_number = (char*)malloc(16 * sizeof(char)); strcpy(student->student_number, student_number); student->passed_credits = passed_credits; } // ์๋ฉธ์ void student_dtor(student_t* student) { // ๋จผ์ ์์ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์์ผ์ผ ํฉ๋๋ค. free(student->student_number); // ๊ทธ๋ฐ ๋ค์, ๋ถ๋ชจ ํด๋์ค์ ์๋ฉธ์ ํจ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. person_dtor(student->person); // ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ ๊ฐ์ฒด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํฉ๋๋ค. free(student->person); } // 4. ํ์ ํจ์ void student_get_first_name(student_t* student, char* buffer) { // person์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. person_get_first_name(student->person, buffer); } void student_get_last_name(student_t* student, char* buffer) { // person์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. person_get_last_name(student->person, buffer); } unsigned int student_get_birth_year(student_t* student) { // person์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. return person_get_birth_year(student->person); } void student_get_student_number(student_t* student, char* buffer) { strcpy(buffer, student->student_number); } unsigned int student_get_passed_credits(student_t* student) { return student->passed_credits; }
Student ํด๋์ค์ ์๋ก์ด ๊ตฌํ(p.324์ ๋น๊ต)
- Person ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ ํค๋ ํ์ผ์ ํฌํจ
- student_t์ ์ ์ ๋ถ๋ถ: ํฌ์ธํฐ ํ๋ ์ถ๊ฐ, ์ฒซ๋ฒ์งธ ํ๋์ผ ํ์๋ x, ์ํธ๋ณํ ํ ์ ์์
- ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ
- Student ํด๋์ค๋ ์์ ์ ํ์ ํจ์๋ค์ ๋ ธ์ถ, ๋ํผ ํจ์ ๋ ธ์ถโStudent ๊ฐ์ฒด ์์ฒด๋ก๋ Person ๊ฐ์ฒด์ ๋น๊ณต๊ฐ ์์ฑ์ ์ ์ ์์
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 32 33 34 35
#include <stdio.h> #include <stdlib.h> #include "ExtremeC_examples_chapter8_3_student.h" int main(int argc, char** argv) { // student ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์์ฑํ๊ธฐ struct student_t* student = student_new(); student_ctor(student, "John", "Doe", 1987, "TA5667", 134); // student ํฌ์ธํฐ๋ person ํฌ์ธํฐ๊ฐ ์๋๋ฉฐ // student ๊ฐ์ฒด์ ์๋ ๋น๊ณต๊ฐ ๋ถ๋ชจ ํฌ์ธํฐ์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก, // student์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. char buffer[32]; student_get_first_name(student, buffer); printf("First name: %s\n", buffer); student_get_last_name(student, buffer); printf("Last name: %s\n", buffer); printf("Birth year: %d\n", student_get_birth_year(student)); student_get_student_number(student, buffer); printf("Student number: %s\n", buffer); printf("Passed credits: %d\n", student_get_passed_credits(student)); // student ๊ฐ์ฒด ์๋ฉธ ๋ฐ ํด์ ํ๊ธฐ student_dtor(student); free(student); return 0; }
person.h ํฌํจxโPerson ํด๋์ค์ ํ์ ํจ์ ์ฌ์ฉx(p.325์ ๋น๊ต)
1 2 3 4 5 6 7 8 9 10
gcc -c ExtremeC_examples_chapter8_3_person.c -o person.o gcc -c ExtremeC_examples_chapter8_3_student.c -o student.o gcc -c ExtremeC_examples_chapter8_3_main.c -o main.o gcc person.o student.o main.o -o ex8_3.out ./ex8_3.out //First name: John //Last name: Doe //Birth year: 1987 //Student number: TA5667 //Passed credits: 134
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๊ฐ์
โ๏ธ ๋ ๊ฐ์ง ์ ๊ทผ๋ฒ ๋น๊ตํ๊ธฐ
์ฒซ ๋ฒ์งธ ์ ๊ทผ๋ฒ
- ํฉ์ฑ ๊ด๊ณ
- ์์์ ์์ฑ ๊ตฌ์กฐ์ฒด ์์ ๊ตฌ์กฐ์ฒด ๋ณ์ ์กด์ฌ
- ๋ถ๋ชจ ํด๋์ค๊ฐ ๋น๊ณต๊ฐ ๊ตฌํ์ ์ ๊ทผํ๋ ๋ฐ์ ์์กด
- ๋ถ๋ชจ์ ์์์ ์๋ฃํ์ ๋งค์ฐ ์์กด์
- ๋ถ๋ชจ๊ฐ ์ค์ง ํ๋
- C์ ๋จ์ผ ์์ sngle inertance์ ๊ตฌํ
- ๋ถ๋ชจ์ ๊ตฌ์กฐ์ฒด ๋ณ์๋ ์์ ํด๋์ค์ ์์ฑ ๊ตฌ์กฐ์ฒด์ ์ฒซ ๋ฒ์งธ ํ๋
- ๋ถ๋ชจ ํด๋์ค์ ํ์ ํจ์๋ฅผ ์ฌ์ฉ
๋ ๋ฒ์งธ ์ ๊ทผ๋ฒ
- ํฉ์ฑ ๊ด๊ณ
- ๋ถ๋ชจ์ ์์ฑ ๊ตฌ์กฐ์ฒด์ ๋ถ์์ ์๋ฃํ์ผ๋ก๋ถํฐ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ๋๋ฏ๋ก ๋ถ๋ชจ ํด๋์ค์ ๋น๊ณต๊ฐ ๊ตฌํ์ ์์กดํ์ง ์์
- ํด๋์ค๋ค์ ์๋ก์ ๋ํด ๋ ๋ฆฝ์
- ๋ถ๋ชจ์ ๊ตฌํ ๋ด๋ถ์ ์๋ ๋ชจ๋ ๊ฒ์ ์์์๊ฒ ์จ๊ฒจ์ ธ ์์
- ์ํ๋ ๋งํผ ๋ง์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๋ค์ค ์์mutpe nhertanceo๋ผ๋ ๊ฐ๋
- ๋ถ๋ชจ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ตฌ์กฐ์ฒด ๋ด์ ์ด๋๋
- ์์ ํด๋์ค์ ์๋ก์ด ํ์ ํจ์๋ฅผ ํตํด ๋ถ๋ชจ์ ํ์ ํจ์๋ฅผ ์ ๋ฌ
โญ 8.2 ๋คํฅ์ฑ ์๊ฐ
โ๋คํฅ์ฑ์ด๋ โ ์๋ก ๋ค๋ฅธ ํ์๋ฅผ ๊ฐ๋ ๊ฐ์ ์ฝ๋(๊ณต์ฉ ์ธํฐํ์ด์ค)๋ฅผ ๋๋ ๊ธฐ๋ฒ์ ๋๋ค.
โ ๋คํฅ์ฑ์ ํตํด ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ค์ ์ปดํ์ผํ์ง ์๊ณ ๋ ์ฝ๋๋ฅผ ์์ํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
Animal, Cat, Duck ์๋ฃํ์ ๋ํ ๊ฐ์ฒด ์ธ ๊ฐ๋ฅผ ์์ฑํ๊ธฐ
1 2 3 4 5 6 7 8 9
struct animal_t*animal = animal_malloc(); animal_ctor(animal); struct cat_t*cat = cat_malloc(); cat_ctor(cat); struct duck_t*duck = duck_malloc(); duck_ctor(aduck);
- cat๊ณผ duckํด๋์ค๋ animalํด๋์ค์ ์์์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ๋คํฅ์ฑ์ด ์๋ค๋ฉด sound ํจ์๋ฅผ ๊ฐ ๊ฐ์ฒด์์ ํธ์ถํ์ ๊ฒ๋๋ค.
1 2 3
animal_sound(animal); cat_sound(cat); duck_sound(duck);
- ํ์ง๋ง ๋คํ์ ํจ์๊ฐ ์คํ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ๋ฉ๋๋ค.
1 2 3
animal_sound(animal); animal_sound((struct animal_t*)cat); animal_sound((struct animal_t*)duck);
animal_sound๊ฐ ๋คํ์ ์ด๋ผ๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ์ ๋ ๊ฐ์ ๋ค๋ฅธ ์๋ฆฌ๊ฐ ์ถ๋ ฅ ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ animal_sound๋ฅผ ์ฌ์ฉํ์ง๋ง ํฌ์ธํฐ๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํจ์๋ค์ ๋ด๋ถ์์ ๋ถ๋ฌ์์ต๋๋ค.
์ด ์ฝ๋๋ ๋คํ์ ์ฝ๋๋ก Animal์ด๋ผ๋ ํด๋์ค์ ํจ๊ป Cat , Duck ํด๋์ค์ ์์ ๊ด๊ณ์ ๋๋ค. duck_t์ cat_t ํฌ์ธํฐ๋ฅผ animal_t ํฌ์ธํฐ๋ก ๋ณํํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13
typedef struct { ... }animal_t typedef struct { aniaml_t animal; ... }cat_t; typedef struct{ aniaml_t animal; ... }duck_t;
- ์์์ ๊ตฌํํ๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋น๊ณต๊ฐ ๊ตฌํ์ ์ ๊ทผํ์ผ๋ฉฐ, ์ฌ๊ธฐ์ duck_t์ cat_t ์์ฑ ๊ตฌ์กฐ์ฒด ์ ์์ ์ฒซ ๋ฒ์งธ ํ๋๋ก animal_t ์๋ฃํ์ธ ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ๋์ด์ผ ํ์ต๋๋ค.
- ์ด ์ค์ ์ ํตํด์ duck_t์ cat_t ํฌ์ธํฐ๋ฅผ animal_t ํฌ์ธํฐ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค ๋ ์์ ํด๋์ค์ ๋ํ ํ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ๏ธ ๋คํฅ์ฑ์ด ํ์ํ ์ด์
โ ํ์ฌ์ ๋ก์ง์ ์์ฃผ ์์ ํ๊ณ ์ถ์ง๋ ์์ ๋ ๋คํฅ์ฑ์ ์ด์ฉํ๋ฉด ํ์ํ ๋ณ๊ฒฝ ํ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
โ ์ถ์ํ ๋๋ฌธ์ ๋คํฅ์ฑ์ด ํ์ํฉ๋๋ค. ์ถ์์ ์ธ ์๋ฃํ(ํด๋์ค)๋ฅผ ๊ฐ์ง ๋, ์์ ํด๋์ค์์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด์ผ ํ๋ ํ์๋ฅผ ๊ฐ๋๋ฐ ์ด๋ ๋คํฅ์ฑ์ด ํต์ฌ์ ์ ๋๋ค.
โ๏ธ C์์ ๋คํ์ ํ์๋ฅผ ๊ฐ๋ ๋ฐฉ๋ฒ
C์์ ๋คํฅ์ฑ์ ๊ฐ์ง๋ ค๋ฉด ์์์ ๊ตฌํํ๋ ์ฒซ ๋ฒ์งธ ์ ๊ทผ๋ฒ์ ๊ฐ์ ธ์ผํฉ๋๋ค. ๋ํ ๋คํฅ์ ํ์๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ํจ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์ ํฌ์ธํฐ๋ฅผ ์์ฑ ๊ตฌ์กฐ์ฒด ๋ด์ ํ๋์ ๋์ด์ผ ํฉ๋๋ค.
์์ 8-4
Animal ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// File name: ExtremeC_examples_chapter8_4_animal.h // Description: Public interface of the animal class #ifndef EXTREME_C_EXAMPLES_CHAPTER_8_4_ANIMAL_H #define EXTREME_C_EXAMPLES_CHAPTER_8_4_ANIMAL_H // Forward declaration struct animal_t; // Memory allocator struct animal_t* animal_new(); // Constructor void animal_ctor(struct animal_t*); // Destructor void animal_dtor(struct animal_t*); // Behavior functions void animal_get_name(struct animal_t*, char*); void animal_sound(struct animal_t*); #endif
- Animal ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค์์๋ 2๊ฐ์ ํ์ํจ์๋ฅผ ๊ฐ์ง๋๋ค.
- animal_sound ํจ์๋ ๋คํ์ ์ผ๋ก, ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ ์ ์์ต๋๋ค.
- animal_get_name์ ๋คํ์ ์ด์ง ์์ผ๋ฉฐ ์์ ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ ์ ์์ต๋๋ค.
- Animal ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค์์๋ 2๊ฐ์ ํ์ํจ์๋ฅผ ๊ฐ์ง๋๋ค.
Animal ํด๋์ค์ ๋น๊ณต๊ฐ ํค๋ (Animal ํด๋์ค์ ์์ฑ ๊ตฌ์กฐ์ฒด์ ๊ดํ ์ค์ ์ ์ ํฌํจ)- ์์์ ๊ตฌํํ๋ ์ฒซ๋ฒ์งธ ์ ๊ทผ๋ฒ์ผ๋ก ์ทจํฉ๋๋ค
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// File name: ExtremeC_examples_chapter8_4_animal_p.h // Description: Private defintion of the attribute structure // of the animal class #ifndef EXTREME_C_EXAMPLES_CHAPTER_8_4_ANIMAL_P_H #define EXTREME_C_EXAMPLES_CHAPTER_8_4_ANIMAL_P_H // ๊ฐ๋ฆฌํค๋๋ฐ ํ์ํ ํจ์ ํฌ์ธํฐํ // different morphs of animal_sound typedef void (*sound_func_t)(void*); // Forward declaration typedef struct { char* name; // This member is a pointer to the function which // performs the actual sound behavior sound_func_t sound_func; } animal_t; #endif
- ๋ชจ๋ ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ์์ ๋ฐ์ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์์ต๋๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉํ๋ ค๋ ๊ฐ๊ฐ์ ์์ ํด๋์ค์ ๋ํ ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ์ด๋ฌํ ์ด์ ๋ก ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ฆ ๋ชจ๋ ์์ ํด๋์ค๋ animal_sound ํจ์์ ๋ํ ์์ ๋ง์ ๋ฒ์ ์ ์ ๊ณต ํ ์ ์๊ณ , ์์ ํด๋์ค๊ฐ animal_sound๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค๋ฉด, ์ค๋ฒ๋ผ์ด๋ฉ๋ ํจ์๊ฐ ํธ์ถ๋์ด์ผํ๊ณ ์ด๋ ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- animal_t์ ๊ฐ ์ธ์คํด์ค(ํด๋์ค์์ ํ์ฌ ์์ฑ๋ ๊ฐ์ฒด)๋ animal_sound ํ์ ์ ์ฉ์ ํจ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ๊ฒ์ด๊ณ , ๊ทธ ํฌ์ธํฐ๋ ํด๋์ค ๋ด์ ๋คํ์ ํจ์์ ๋ํ ์ค์ ์ ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
Animal ํด๋์ค์ ๋ํ ์ ์
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45
// File name: ExtremeC_examples_chapter8_4_animal.c // Description: Private definition of the behavior functions // of the animal class #include <stdlib.h> #include <string.h> #include <stdio.h> #include "ExtremeC_examples_chapter8_4_animal_p.h" // Default definition of the animal_sound at the parent level void __animal_sound(void* this_ptr) { //__animal_sound๋ animal_sound ํจ์์ ๊ธฐ๋ณธ ํ์๊ฐ ๋์ด์ผํจ. animal_t* animal = (animal_t*)this_ptr; printf("%s: Beeeep\n", animal->name); } // Memory allocator animal_t* animal_new() { return (animal_t*)malloc(sizeof(animal_t)); } // Constructor void animal_ctor(animal_t* animal) { animal->name = (char*)malloc(10 * sizeof(char)); strcpy(animal->name, "Animal"); // Set the function pointer to point to the default definition animal->sound_func = __animal_sound; } //__animal_sound์ ์ฃผ์๋ฅผ animal ๊ฐ์ฒด์ ํจ์ ํฌ์ธํฐ์ธ sound_func์ ์ ์ฅ // ์ด ์ค์ ์ผ๋ก ๋ชจ๋ ์์ ๊ฐ์ฒด๋ ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์์ํ๊ณ ํจ์ ํฌ์ธํฐ๋ __animal_sound์ ๊ธฐ๋ณธ ์ ์๋ฅผ ๊ฐ๋ฅดํต๋๋ค. // Destructor void animal_dtor(animal_t* animal) { free(animal->name); } // Behavior functions void animal_get_name(animal_t* animal, char* buffer) { strcpy(buffer, animal->name); } void animal_sound(animal_t* animal) { // ํจ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์ ํธ์ถํจ. animal->sound_func(animal); } //sound_func๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ๋ฆฌํฌ ๋ animal_sound๋ฅผ ๋ถ๋ฌ์ค๋ฉด sound_func๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์๊ฐ ํธ์ถ๋จ. //sound_func = __animal_sound์ ํด๋นํ๋ sound ํ์์ ์ค์ ์ ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํจ์ ํฌ์ธํฐ ํ๋
Cat ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// File name: ExtremeC_examples_chapter8_4_cat.h // Description: Public interface of the cat class #ifndef EXTREME_C_EXAMPLES_CHAPTER_8_4_CAT_H #define EXTREME_C_EXAMPLES_CHAPTER_8_4_CAT_H // Forward declaration struct cat_t; // Memory allocator struct cat_t* cat_new(); // Constructor void cat_ctor(struct cat_t*); // Destructor void cat_dtor(struct cat_t*); // All behavior functions are inherited from the animal class. #endif
- Cat ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ธ Animal ํด๋์ค๋ก๋ถํฐ sound๋ฅผ ์์ ๋ฐ์ต๋๋ค.
Cat ํด๋์ค์ ๋น๊ณต๊ฐ ๊ตฌํ
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 32 33 34 35 36 37 38
// File name: ExtremeC_examples_chapter8_4_cat.c // Description: Private defintions of the class cat #include <stdio.h> #include <stdlib.h> #include <string.h> #include "ExtremeC_examples_chapter8_4_animal.h" #include "ExtremeC_examples_chapter8_4_animal_p.h" typedef struct { animal_t animal; } cat_t; // Define a new behavior for the cat's sound void __cat_sound(void* ptr) { //cat์ sound๋ฅผ ์ํ ์๋ก์ด ํจ์์ธ __cat_sound๋ฅผ ์ ์ animal_t* animal = (animal_t*)ptr; printf("%s: Meow\n", animal->name); } // Memory allocator cat_t* cat_new() { return (cat_t*)malloc(sizeof(cat_t)); } // Constructor void cat_ctor(cat_t* cat) { animal_ctor((struct animal_t*)cat); strcpy(cat->animal.name, "Cat"); // Point to the new behavior function. Overriding // is actually happening here. cat->animal.sound_func = __cat_sound; //์ค๋ฒ๋ผ์ด๋ฉ ๋ฐ์ } // Destructor void cat_dtor(cat_t* cat) { animal_dtor((struct animal_t*)cat); }
- cat ๊ฐ์ฒด๋ **animal_sound ๋์ ์ ์ค์ ๋ก **cat_sound๋ฅผ ํธ์ถํ๊ฒ ๋ง๋๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ฐ์์์ผฐ์ต๋๋ค.
Duck ํด๋์ค์ ๊ณต์ฉ ์ธํฐํ์ด์ค
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// File name: ExtremeC_examples_chapter8_4_duck.h // Description: Public interface of the duck class #ifndef EXTREME_C_EXAMPLES_CHAPTER_8_4_DUCK_H #define EXTREME_C_EXAMPLES_CHAPTER_8_4_DUCK_H // Forward declaration struct duck_t; // Memory allocator struct duck_t* duck_new(); // Constructor void duck_ctor(struct duck_t*); // Destructor void duck_dtor(struct duck_t*); // All behavior functions are inherited from the animal class. #endif
Duck ํด๋์ค์ ๋น๊ณต๊ฐ ๊ตฌํ
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 32 33 34 35 36 37 38
// File name: ExtremeC_examples_chapter8_4_duck.c // Description: Private defintions of the class duck #include <stdio.h> #include <stdlib.h> #include <string.h> #include "ExtremeC_examples_chapter8_4_animal.h" #include "ExtremeC_examples_chapter8_4_animal_p.h" typedef struct { animal_t animal; } duck_t; // Define a new behavior for the duck's sound void __duck_sound(void* ptr) { animal_t* animal = (animal_t*)ptr; printf("%s: Quacks\n", animal->name); } // Memory allocator duck_t* duck_new() { return (duck_t*)malloc(sizeof(duck_t)); } // Constructor void duck_ctor(duck_t* duck) { animal_ctor((struct animal_t*)duck); strcpy(duck->animal.name, "Duck"); // Point to the new behavior function. Overriding // is actually happening here. duck->animal.sound_func = __duck_sound; } // Destructor void duck_dtor(duck_t* duck) { animal_dtor((struct animal_t*)duck); }
๋ฉ์ธ ์๋๋ฆฌ์ค
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 32 33 34 35
// File name: ExtremeC_examples_chapter8_4_main.c // Description: Main scenario which calls the // polymorphic functions #include <stdio.h> #include <stdlib.h> #include <string.h> // Only public interfaces #include "ExtremeC_examples_chapter8_4_animal.h" #include "ExtremeC_examples_chapter8_4_cat.h" #include "ExtremeC_examples_chapter8_4_duck.h" int main(int argc, char** argv) { struct animal_t* animal = animal_new(); struct cat_t* cat = cat_new(); struct duck_t* duck = duck_new(); animal_ctor(animal); cat_ctor(cat); duck_ctor(duck); animal_sound(animal); //๋ค๋ฅธ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํด ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋คํ์ ํ์๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋๋ค. animal_sound((struct animal_t*)cat); animal_sound((struct animal_t*)duck); animal_dtor(animal); cat_dtor(cat); duck_dtor(duck); free(duck); free(cat); free(animal); return 0; }
- mainํจ์๋ animal, Cat, Duck ํด๋์ค์ ๊ณต์ฉ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํฉ๋๋ค.
- mainํจ์๋ ์ด๋ค ํด๋์ค์ ๋ด๋ถ ๊ตฌํ์ ๊ดํด์๋ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํด animal_sound ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋คํ์ ํ์๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12
gcc -c ExtremeC_examples_chapter8_4_animal.c -o animal.o gcc -c ExtremeC_examples_chapter8_4_cat.c -o cat.o gcc -c ExtremeC_examples_chapter8_4_duck.c -o duck.o gcc -c ExtremeC_examples_chapter8_4_main.c -o main.o gcc animal.o cat.o duck.o main.o -o ex8_4.out ./ex8_4.out /******************************************************** Animal: Beeeep Cat: Meow Duck: Quacks *********************************************************/
- mainํจ์๋ animal, Cat, Duck ํด๋์ค์ ๊ณต์ฉ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํฉ๋๋ค.