π’ chap7. ν©μ±κ³Ό μ§ν©
β 7.1 ν΄λμ€ κ°μ κ΄κ³
- κ°μ²΄ λͺ¨λΈμ κ΄λ ¨λ κ°μ²΄μ λν μ§ν©μ λλ€.
- κ΄κ³μ μλ λ§λλΌλ λ κ°μ²΄ κ° κ΄κ³μ μ νμ λͺ κ°μ§ μ λκ° μ‘΄μ¬ν©λλ€. μΌλ°μ μΌλ‘ κ°μ²΄ (λλ κ·Έμ ν΄λΉνλ ν΄λμ€)
- λ κ°μ²΄ μ¬μ΄μ μ‘΄μ¬νλ κ΄κ³μ μ ν typeκ³Ό κ·Έμ ν΄λΉνλ ν΄λμ€ : to-haveμ to-be λ κ°μ§ κ΄κ³
- ν©μ± μ§ν©
- to-have κ΄κ³ μ€ μ²« λ²μ§ΈμΈ ν©μ± : λ ν΄λμ€ μ¬μ΄μ μ€μ ν©μ± κ΄κ³λ₯Ό λνλ΄λ μμ κ° μ 곡λ©λλ€. μ΄ μμ λ‘ ν©μ± μ μΌλ°μ μΌλ‘ κ°κ² λλ λ©λͺ¨λ¦¬ ꡬ쑰λ₯Ό μ΄ν΄λ΄ λλ€.
- to-have κ΄κ³ μ€ λ λ²μ§ΈμΈ μ§ν©aggregation: μ§ν©μ ν©μ±κ³Ό λΉμ·ν©λλ€. λ λ€ to-have κ΄κ³λ₯Ό λ€λ£¨κΈ° λλ¬Έμ λλ€.
β 7.2 κ°μ²΄ λ ν΄λμ€
- κ°μ²΄ = μΈμ€ν΄μ€λ€. β κ²°κ³Όλ¬Ό (μ°¨λ₯Ό λ§λλ μ¬λ£)
- κ°μ²΄λ λͺ¨λ μΈμ€ν΄μ€λ₯Ό ν¬κ΄νλ λμ μλ―Έλ₯Ό κ°μ§κ³ , μΈμ€ν΄μ€λ ν΄λΉ κ°μ²΄κ° μ΄λ€ ν΄λμ€λ‘ λ§λ€μ΄ μ λ
- ν΄λμ€ β μ°μ΄λ΄λ κΈ°κ³ (μ°¨λ₯Ό λ§λ€μ΄ λ΄λ κΈ°κ³ ν)
- κ°μ²΄λ₯Ό μ μν μ€κ³λ λλ ν
- ꡬ쑰체 : λͺ μμ μΊ‘μν
- κ΅¬μ‘°μ²΄κ° μλ λ¬Έλ² : μ묡μ μΊ‘μν
βοΈ κ°μ²΄ λ ν΄λμ€
- κ° κ°μ²΄λ κ°μ ν΄λμ€μμ μΈμ€ν΄μ€ν λμ΄ μλ‘ λ€λ₯Έ κ°μ²΄κ° μ‘΄μ¬νλ λμΌν μμ±μ κ°μ§λ€
μ¬λ(ν΄λμ€)
- β λ¨μ (μΈμ€ν΄μ€) : μ μ¬μ, μ νλ (μ¬λμ΄λΌλ μμ±)
- β μ¬μ (μΈμ€ν΄μ€) : μ΄μμ§, μ΄μ μ (μ¬λμ΄λΌλ μμ±)
- Personμ΄λΌλ ν΄λμ€λ₯Ό μ μνλ€κ³ κ°μ ν΄λ΄ μλ€. (κ°μ²΄ μμ )
1
2
3
4
5
6
7
typedef struct
{
char name[32];
char surname[32];
unsigned int age;
} Person_t;
- ν΄λμ€λ name, surname, ageλΌλ μμ±μ κ°μ΅λλ€. (ν΄λμ€ μμ )
1
2
3
4
5
6
7
8
class MyClass
{
public:
std::string name;
std::string family;
uint32_t age;
};
νλ‘ν νμ μ μΈμ΄μ κ·Έλ μ§ μμ μΈμ΄λ λ¬Έλ²μ λ€λ₯Όμ§ λͺ°λΌλ λ΄λΆ ꡬ쑰λ κ°λ€.(c λ‘ κ΅¬νν μ½λμ λΉμ· ν κ²μ΄λ€. νλ‘ν νμ μ μΈμ΄λ λ©λͺ¨λ¦¬κ΄λ¦¬μ μΈ λΆλΆμ μ½λλ‘ μ μ±νμ§ μλλ€.)
- νλ‘ν νμ μ κ·Όλ²μ ν΄λμ€λ₯Ό 곡μ νλ λ°©λ² λλ κ°μ²΄κΈ°λ°λ₯Ό 곡μ νλ λ°©λ²
- ν΄λμ€ κΈ°λ°μ μ κ·Όλ²μμλ ν΄λμ€λΌλ μμ± μμ΄λ κ°μ²΄λ₯Ό μμ±ν μ μμ
1
2
3
4
5
6
μ½λ μμμ μ μν name, family κ° κ³ μ νΉμ±μ κ°μ§λ νμμ΄ μλλ€.
μ»΄ν¨ν° λ©λͺ¨λ¦¬μ§ name, familyμ νΉμ±μ΄ μλλ€.
μ»΄ν¨ν° λ©λͺ¨λ¦¬λ₯Ό μμ±νκ³ μλ©Ένλ λ°©λ²
μμ±μ(λ©λͺ¨λ¦¬): ν¨μλ₯Ό μμ± μ§μ λλ νΈμΆ
μλ©Έμ(λ©λͺ¨λ¦¬): 리μμ€λ₯Ό ν΄μ νλ μν μ ν©λλ€.
μμ±μ (construction) : μμ± λ¨κ³λ₯Ό μννλλ‘ μ§μ λ ν¨μ
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
μμ±μ
1. ν¨μ μ§μ
2. μ¬μ©μ car_construct(&car, "Renault");
3. νμμ ν λΉν΄μ£Όκ³
// ν¨μλ₯Ό μ§μ ν΄μ£Όκ³
void car_construct(car_t* car, const char* name)
{
strcpy(car->name, name);
car->speed = 0.0;
car->fuel = 0.0;
}
// mainμμ μ¬μ©μ (μ¬μ©μ)
car_construct(&car, "Renault");
//286 νμ΄μ§ ν λΉνλλ²
list_t* list_malloc()
{
return (list_t*)malloc(sizeof(list_t));
}
// main ν λΉ
car_construct->make = malloc(strlen(make) + 1);
car_construct->model = malloc(strlen(model) + 1);
- μμ μμ ν¨μ car_constructκ° μμ±μ ν¨μμμ΅λλ€. κ°μ²΄λ₯Ό μμ±νλ κ³Όμ μμλ ν΄λΉ κ°μ²΄μ νμν λ€λ₯Έ κ°μ²΄λ λ²νΌ, λ°°μ΄, μ€νΈλ¦Ό λ±κ³Ό κ°μ 리μμ€μ λν΄ ν¨μ¬ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄μΌ ν μλ μμ΅λλ€.
- μλ©Έμ
- κ°μ²΄κ° μλ©Έν λ€ ν λΉλ λ©λͺ¨λ¦¬κ° ν΄μ νλ©΄μ κ°μ²΄κ° μμ ν λͺ¨λ 리μμ€μ κ·Έμ ν΄λΉνλ λ©λͺ¨λ¦¬κ° λ¨Όμ λΉμμ Έ μλ©Ένλ νμ
1
2
3
4
5
6
7
8
9
μλ©Έμ
void list_destroy(list_t* list)
{
// Deallocates the allocated memory
free(list->items);
}
car_destruct(&car);
- μμμμ λ§μ°¬κ°μ§λ‘ μ΄μ μ₯μ μμ μμ ν¨μ list_destoryμ car_destructλ μλ©Έμμ ν΄λΉν©λλ€.
- κ°μ²΄κ° μλ©Έν λ€ ν λΉλ λ©λͺ¨λ¦¬κ° ν΄μ λ©λλ€.
νμ§λ§ κ·Έ μ μ κ°μ²΄κ° μμ ν λͺ¨λ 리μμ€μ κ·Έμ ν΄λΉνλ λ©λͺ¨λ¦¬κ° λ¨Όμ λΉμμ ΈμΌ ν©λλ€.
- ν΄λμ€λ κ°μ²΄λ₯Ό λ§λ€κΈ° μν μ§λλ‘ μ¬μ©λλ μ²μ¬μ§μ λλ€.
- κ°μ ν΄λμ€μμ μ¬λ¬ κ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€. ( μ°¨ : μλν, κ·Έλμ )
- ν΄λμ€λ ν΄λΉ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ λ§λ€ λͺ¨λ κ°μ²΄μ μ‘΄μ¬ν΄μΌ ν μμ±μ΄ μ΄λ κ²μΈμ§ κ²°μ ν©λλ€.
- ν΄λμ€λ μμ±μ΄ κ°μ§ κ°μ κ΄ν΄μλ μ무κ²λ μ€λͺ νμ§ μμ΅λλ€.
- ν΄λμ€ μ체λ‘λ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νμ§ μμ΅λλ€(Cλ C++κ° μλ λͺλͺ μΈμ΄λ μ μΈ).
- ν΄λμ€λ μμ€ νμΌ λ¨κ³ λ° μ»΄νμΌ μμλ§ μ‘΄μ¬ν©λλ€.
κ°μ²΄λ λ°νμ μμ μ‘΄μ¬νκ³ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν©λλ€.
- κ°μ²΄λ₯Ό λ§λ€ λλ λ¨Όμ λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄μΌ ν©λλ€.
- λ§λΆμ¬ λ©λͺ¨λ¦¬ ν΄μ λ κ°μ²΄μ λν λ§μ§λ§ μμ μ λλ€.
- κ°μ²΄λ₯Ό λ§λ€ λ, κ°μ²΄λ λ©λͺ¨λ¦¬ ν λΉ μ§νμ μμ±ν΄μΌ ν©λλ€.
- λν λ©λͺ¨λ¦¬ ν΄μ μ§μ μ κ°μ²΄κ° μλ©Έν΄μΌν©λλ€
1
2
κ°μ²΄λ μ€νΈλ¦Ό, λ²νΌ, λ°°μ΄ λ±κ³Ό κ°μ 리μμ€λ₯Ό μμ ν©λλ€.
μ΄λ€μ κ°μ²΄κ° μλ©ΈνκΈ° μ μ λ°λμ ν΄μ λμ΄μΌ ν©λλ€
β 7.3 ν©μ±
β ν©μ± (composition)
- ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ₯Ό ν¬ν¨νκ±°λ μμ ν λ, μ¦ ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ€λ‘ ꡬμ±λ λ
- μ΄λ€ κ°μ²΄ μ¬μ΄μ ν©μ± κ΄κ³κ° μλ€κ³ ν λ μ¬μ©λλ€.
- ex) μλμ°¨λ μμ§μ κ°μ§λ€.
- β μλμ°¨λ μμ§ κ°μ²΄λ₯Ό ν¬ν¨νλ κ°μ²΄ μ¦ ν©μ±κ΄κ³
β ν©μ±κ΄κ³κ° κ°μ§λ 쑰건
- 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄μ μλͺ μ 컨ν μ΄λ κ°μ²΄μ μλͺ μ λ°μΈλ©λ©λλ€.
- 컨ν μ΄λ κ°μ²΄κ° μ‘΄μ¬νλ ν, 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄λ λ°λμ μ‘΄μ¬ν΄μΌ ν©λλ€.
- 컨ν
μ΄λ κ°μ²΄κ° μλ©Έν λλ ν¬ν¨λ κ°μ²΄κ° λ¨Όμ μλ©Έν΄μΌ ν©λλ€.
- β ν¬ν¨λ κ°μ²΄κ° 컨ν μ΄λμ λΉν΄ λ λ΄λΆμ μ΄κ³ λΉκ³΅κ°μ
- ν¬ν¨λ κ°μ²΄μ μΌλΆλ 컨ν μ΄λ ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€(νΉμ νμ ν¨μ)λ₯Ό ν΅ν΄ μ¬μ ν μ κ·Όν μλ μμ΅λλ€. νμ§λ§ ν¬ν¨λ κ°μ²΄μ μλͺ μ 컨ν μ΄λ κ°μ²΄μ μν΄ λ΄λΆμ μΌλ‘ λ°λμ κ΄λ¦¬λμ΄μΌ ν©λλ€.
- μ½λκ° μ»¨ν μ΄λμ ν¬ν¨λ κ°μ²΄λ₯Ό λ¨Όμ μλ©Έμν€μ§ μκ³ λ 컨ν μ΄λ κ°μ²΄λ₯Ό μλ©Έμν¬ μ μλ€λ©΄, μ΄λ ν©μ± κ΄κ³λ₯Ό μλ°νλ κ²μ΄λ©° λ μ΄μ μ΄ κ΄κ³λ ν©μ±μ΄ μλλλ€.
- μ½λ λ°μ€ 7-3 [μμ 7-1] Car ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€(ExtremeC_examples_chapter7_1_car.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef EXTREME_C_EXAMPLES_CHAPTER_7_1_CAR_H
#define EXTREME_C_EXAMPLES_CHAPTER_7_1_CAR_H
struct car_t;
// λ©λͺ¨λ¦¬ ν λΉμ
struct car_t* car_new();
// μμ±μ
void car_ctor(struct car_t*);
// μλ©Έμ
void car_dtor(struct car_t*);
// νμ ν¨μ
void car_start(struct car_t*);
void car_stop(struct car_t*);
double car_get_engine_temperature(struct car_t*);
#endif
μμ± κ΅¬μ‘°μ²΄ car_tλ§μ μ μΈ. μ΄ κ΅¬μ‘°μ²΄μ νλλ μ μνμ§ μμμΌλ©°, μ΄λ
- μ λ°© μ μΈ forward declarationμ΄λΌκ³ ν©λλ€. μ λ°© μ μΈμ μλ³μ (μ: ν΄λμ€, ν¨μ λλ λ³μ)μ μ 체 μ μλ₯Ό μ 곡νκΈ° μ μ κ·Έ μ‘΄μ¬λ₯Ό μ μΈνλ λ¬Έ
μ½λ λ°μ€ 7-3 [μμ 7-1] Engine ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€(ExtremeC_examples_chapter7_1_car.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef EXTREME_C_EXAMPLES_CHAPTER_7_1_ENGINE_H
#define EXTREME_C_EXAMPLES_CHAPTER_7_1_ENGINE_H
struct engine_t;
// λ©λͺ¨λ¦¬ ν λΉμ
struct engine_t* engine_new();
// μμ±μ
void engine_ctor(struct engine_t*);
// μλ©Έμ
void engine_dtor(struct engine_t);
// νμ ν¨μ
void engine_turn_on(struct engine_t*);
void engine_turn_off(struct engine_t*);
double engine_get_temperature(struct engine_t*);
#endif
- μ½λλ°μ€ 7-5 [μμ 7-1] Car ν΄λμ€μ λν μ μ(ExtremeC_examples_chapter7_1.car.c)
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
#include <stdlib.h>
// Car Engineμ λν κ³΅μ© μΈν°νμ΄μ€λ‘λ§ μλν μ μμ΅λλ€.
#include "ExtremeC_examples_chapter7_1_engine.h"
typedef struct {
// μ΄ μμ±μΌλ‘ μΈν΄ ν©μ±μ΄ λ°μ
struct engine_t* engine;
} car_t;
car_t* car_new() {
return (car_t*)malloc(sizeof(car_t));
}
void car_ctor(car_te car) {
// μμ§ κ°μ²΄μ λν΄ λ©λͺ¨λ¦¬ ν λΉνκΈ°
car->engine = engine_new();
// μμ§ κ°μ²΄ μμ±νκΈ°
engine_ctor(car->engine);
}
void car_dtor(car_t* car) {
// μμ§ κ°μ²΄ μλ©Έμν€κΈ°
engine_dtor(car->engine);
// μμ§ κ°μ²΄μ ν λΉλ λ©λͺ¨λ¦¬ λΉμ°κΈ°
free(car->engine);
}
void car_start(car_t* car) {
engine_turn_on(car->engine);
}
void car_stop(car_t* car) {
engine_turn_off (car->engine);
}
double car_get_engine_temperature(car_t* car) {
return engine_get_temperature(car->engine);
}
μμ μ½λ λ°μ€λ μλμ°¨κ° μμ§μ ν¬ν¨νλ λ°©μ
car_t μμ± κ΅¬μ‘°μ²΄μ μλ‘μ΄ μμ±μ΄ μλλ° μ΄λ struct engine_tνμ λλ€.
1
β *μ΄ μμ± λλ¬Έμ ν©μ±μ΄ λ°μ*
struct engine_t
struct engine_tλ μμ€ νμΌ λ΄μμ μ¬μ ν λΆμμ ν νμμ΄μ§λ§, λ°νμ μμ μμ ν νμμΈ engine_t μ κ°μ²΄λ₯Ό κ°λ¦¬ν¬ μ μμ΅λλ€. μ΄ μμ±μ Car ν΄λμ€μ μμ±μμμ μμ± ν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ©°, Car ν΄λμ€μ μλ©Έμ λ΄λΆμμ ν΄μ λ©λλ€. μμ± λ° ν΄μ λΆλΆμλ λ λ€ car κ°μ²΄κ° μ‘΄μ¬νλ©°, μ΄λ μλμ°¨μ μλͺ μ μμ§μ μλͺ μ΄ ν¬ν¨λλ€λ λ»μ λλ€.
- engine ν¬μΈν°λ λΉκ³΅κ°μ΄κ³ , ꡬνμμλ μ΄λ ν¬μΈν°λ μ μΆλμ§ μμ΅λλ€.
β ν©μ± κ΄κ³λ₯Ό ꡬνν λ ν¬μΈν°κ° μ μΆλλ©΄ μ λ©λλ€.
λ§μ½ μ μΆλλ€ λ©΄, ν¬ν¨λ κ°μ²΄μ μνλ₯Ό μΈλΆ μ½λκ° λ³κ²½ν μ μκ² λ©λλ€. μΊ‘μνμ λ§μ°¬κ°μ§λ‘ ν¬μΈν°κ° μ΄λ€ κ°μ²΄μ λΉκ³΅κ° λΆλΆμ μ§μ μ κ·Όνλλ‘ ν κ²½μ°μλ μ μΆλλ©΄ μ λ©λλ€. λΉκ³΅κ° λΆλΆμ μΈμ λ νμ ν¨μλ‘ κ°μ μ μΌλ‘ μ κ·Όν΄μΌ ν©λλ€.
- μ½λ λ°μ€μμ car_get_engine_temperature ν¨μλ μμ§μ temperature μμ±μ λν μ κ·Όμ νμ©
- λν μ΄ ν¨μλ μμ§μ κ³΅μ© μΈν°νμ΄μ€λ₯Ό μ¬μ©ν©λλ€. μ μ΄ν΄λ³΄λ©΄,
- μλμ°¨μ λν λΉκ³΅κ° ꡬνμ μμ§μ κ³΅μ© μΈν°νμ΄μ€λ₯Ό μ¬μ©
- β μλμ°¨ κ·Έ μ체λ‘λ μμ§μ λν ꡬνμ μΈλΆ μ¬νμ λν΄μλ λͺ¨λ₯Έλ€λ μλ―Έ μ¦
- κ°μ μλ£νμ΄ μλ λ κ°μ²΄λ μλμ ꡬνμ λν μΈλΆμ¬νμ λͺ°λΌμΌ νλ€!
μ΄μ Engine ν΄λμ€μ λν ꡬνμ μ΄ν΄λ΄ μλ€. μ½λλ°μ€ 7-6[ μμ 7-1] Engine ν΄λμ€μ λν μ μ(ExtremeC_examples_chapter7_1_engine.c)
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
#include <stdlib.h>
typedef enum {
ON, // 0
OFF // 1
} state_t;
typedef struct {
state_t state;
double temperature;
} engine_t;
// λ©λͺ¨λ¦¬ ν λΉμ
engine_t* engine_new() {
return (engine_t*)malloc(sizeof(engine_t));
}
// μμ±μ
void engine_ctor (engine_t* engine) {
engine->state = OFF;
engine->temperature = 15;
}
// μλ©Έμ
void engine_dtor(engine_t* engine) {
// ν μΌ μμ
}
// νμ ν¨μ
void engine_turn_on (engine_t* engine) {
if (engine->state == ON) {
return;
}
engine->state = ON;
engine->temperature = 75;
}
void engine_turn_off (engine_t* engine) {
if (engine->state == OFF) {
return;
}
engine->state = OFF;
engine->temperature = 15;
}
double engine_get_temperature(engine_t* engine) {
return engine->temperature;
}
μ μ½λλ μ묡μ μΊ‘μν μ κ·Όλ²!
κ·Έλ λ€λ©΄ engine κ°μ²΄λ carμ λν΄ μκ³ μμκΉ? νμ¬κ° μμ§μ λ§λ€λ μ΄λ μμ§μ΄ μ°¨μ μ λ§μμ§ νμ€μΉ μμ κ²μ²λΌ μΈλΆ κ°μ²΄λ λͺ¨λ₯Έλ€
- λ€μ [μ½λ λ°μ€ 7-7]μ car κ°μ²΄λ₯Ό λ§λ€κ³ μλμ°¨ μμ§κ³Ό κ΄λ ¨λ μ 보λ₯Ό μΆμΆνκΈ° μν΄ κ³΅μ© APIλ₯Ό νΈμΆνλ μλ리μ€μ λλ€.
- μ½λλ°μ€ 7-7 [μμ 7-1]μ main ν¨μ(ExtremeC_examples_chapter7_1_main.c)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include "ExtremeC_examples_chapter7_1_car.h"
int main(int argc, char** argv) {
// μλμ°¨ κ°μ²΄μ λν΄ λ©λͺ¨λ¦¬ ν λΉ
struct car_t *car = car_new();
// μλμ°¨ κ°μ²΄λ₯Ό μμ±
car_ctor(car);
printf("μλμ°¨ κ°μ²΄κ° μμλκΈ° μ μ μμ§ μ¨λ: %f\n", car_get_engine_temperature(car));
car_start(car);
printf("μλμ°¨ κ°μ²΄κ° μμλ λ€μ μμ§ μ¨λ: %f\n", car_get_engine_temperature(car));
car_stop(car);
printf("μλμ°¨κ° λ©μΆ λ€μ μμ§ μ¨λ: %f\n", car_get_engine_temperature(car));
// μλμ°¨ κ°μ²΄ μλ©Έ
car_dtor(car);
// μλμ°¨ κ°μ²΄μ λν΄ ν λΉλ λ©λͺ¨λ¦¬ ν΄μ
free(car);
return 0;
}
- μ Έ λ°μ€ 7-1 [μμ 7-1]μ μ»΄νμΌ, λ§ν¬, μ€ν
1
2
3
4
5
6
7
8
$ gcc -c ExtremeC_examples_chapter7_1_engine.c -o engine.o
$ gcc -c ExtremeC_examples_chapter7_1_car.c -o car.o
$ gcc -c ExtremeC_examples_chapter7_1_main.c -o main.o
$ gcc engine.o car.o main.o -o ex7_1.out
$ ./ex7_1.out
Engine temperature before starting the car: 15.000000
Engine temperature after starting the car: 75.000000
Engine temperature after stopping the car: 15.000000
1 .μμ μμ λ₯Ό λΉλνλ €λ©΄ μ°μ μ΄μ μ μμ€ νμΌ 3κ°λ₯Ό μ»΄νμΌ
2 .κ·Έλ€μ ν¨κ» λ§ν¬ν΄ μ΅μ’ μ€ν κ°λ₯ν λͺ©μ νμΌμ λ§λ€κΈ°
- λ©μΈ μμ€ νμΌ(main ν¨μλ₯Ό ν¬ν¨νλ μμ€ νμΌ)μ carμ κ³΅μ© μΈν°νμ΄μ€μλ§ μμ‘΄νλ μ£ΌμνμΈμ. κ·Έλ¬λ―λ‘ λ§ν¬ μ λ©μΈ μμ€ νμΌ μ car κ°μ²΄μ λΉκ³΅κ° ꡬνλ§ νμν©λλ€.
- νμ§λ§ car κ°μ²΄μ λν λΉκ³΅κ° ꡬνμ engine μΈν°νμ΄μ€μ κ³΅μ© μΈν°νμ΄μ€μ μμ‘΄ν©λλ€. κ·Έλ¬λ―λ‘ λ§ν¬ λ¨κ³μμ engine κ°μ²΄μ λν λΉ κ³΅κ° κ΅¬νμ μ 곡ν΄μΌ ν©λλ€.
- λ°λΌμ μ΅μ’ μ€ν νμΌμ λ§λ€λ €λ©΄ κ°μ²΄ νμΌ 3κ°λ₯Ό λͺ¨λ λ§ν¬ ν΄μΌν©λλ€.
β 7.4 μ§ν©
β μ§ν©(aggregation)
- μ§ν©μ λ€λ₯Έ κ°μ²΄λ₯Ό ν¬ν¨νλ 컨ν μ΄λ κ°μ²΄λ₯Ό λλ°
- μ§ν© κ΄κ³μμλ 컨ν μ΄λμ ν¬ν¨ λ κ°μ²΄μ μλͺ μ΄ μ»¨ν μ΄λ κ°μ²΄μ μλͺ μ λ 립μ μ΄λΌλ μ μ΄ ν©μ±κ³Όμ μ£Όλ μ°¨μ΄μ μ λλ€.
- μ§ν©μμ 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄λ 컨ν μ΄λ κ°μ²΄κ° μμ±λκΈ° μ΄μ μλ μμ±λ μ μμ΅λλ€. μ΄λ ν©μ±κ³Ό μ λ°λμ λλ€. ν©μ±μ κ²½μ° μ»¨ν μ΄λμ ν¬ν¨λ κ°μ²΄κ° 컨ν μ΄λ κ°μ²΄μ μλͺ λ³΄λ€ λ 짧거λ κ°μμΌ ν©λλ€.
λ€μ [μμ 7-2]λ μ§ν© κ΄κ³
- player κ°μ²΄λ μ μ 컨ν μ΄λ κ°μ²΄κ° λ©λλ€.
- gun κ°μ²΄λ νλ μ΄μ΄ κ°μ²΄κ° μ΄μ λ€κ³ μλ λμμλ 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄κ° λ©λλ€. gun κ°μ²΄μ μλͺ μ player κ°μ²΄μ μλͺ μ λ 립μ μ λλ€.
λ€μ [μ½λ λ°μ€ 7-8]μ Gun ν΄λμ€μ ν€λ νμΌμ λνλ λλ€. μ½λ λ°μ€ 7-8 [μμ 7-2] Gun ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€(ExtremeC_examples_chapter7_2.gun.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef EXTREME_C_EXAMPLES_CHAPTER_7_2_GUN_H
#define EXTREME_C_EXAMPLES_CHAPTER_7_2_GUN_H
typedef int bool_t; // int == bool_tλ‘ μ°κ² λ€
// μ λ°© μ μΈ
struct gun_t;
// λ©λͺ¨λ¦¬ ν λΉμ
struct gun_t* gun_new();
// μμ±μ
void gun_ctor(struct gun_t*, int);
// μλ©Έμ
void gun_dtor(struct gun_t*);
// νμ ν¨μ
bool_t gun_has_bullets(struct gun_t*);
void gun_trigger(struct gun_t*);
void gun_refill(struct gun_t*);
#endif
λ€μ μ½λ λ°μ€7-μ΄λ Player ν΄λμ€μ ν€λ νμΌμ λλ€. μ½λ λ°μ€ 7-9[μμ 7-2] Player ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€(ExtremeC_examples_chapter7_2_player.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef EXTREME_C_EXAMPLES_CHAPTER_7_2_PLAYER_H
#define EXTREME_C_EXAMPLES_CHAPTER_7_2_PLAYER_H
// μ λ°© μ μΈ
struct player_t;
struct gun_t;
// λ©λͺ¨λ¦¬ ν λΉμ
struct player_t* player_new();
// μμ±μ
void player_ctor(struct player_t*, const char*);
// μλ©Έμ
void player_dtor(struct player_t*);
// νμ ν¨μ
void player_pickup_gun(struct player_t*, struct gun_t*);
void player_shoot(struct player_t*);
void player_drop_gun(struct player_t*);
#endif
- μ΄ μ½λλ λͺ¨λ νλ μ΄μ΄ κ°μ²΄μ κ³΅μ© μΈν°νμ΄μ€ μ¦, Player ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€λ₯Ό μ μ
- λ€μ κ°μ‘°νμ§λ§ gun_t λ° player_t ꡬ쑰체μ λν΄ μ λ°© μ μΈν΄μΌ ν©λλ€.
β gun_tνμ μ μΈ ν΄μΌ Player ν΄λμ€μμ νμ ν¨μκ° gun_tνμ λν μΈμλ₯Ό κ°κΈ° λλ¬Έ
Player ν΄λμ€μ λν ꡬνμ λ€μκ³Ό κ°μ΅λλ€.
μ½λ λ°μ€ 7-10 [μμ 72] Player ν΄λμ€μ λν μ μ(ExtremeC_examples_chapter7_2_player.c)
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
# μ½λ λ°μ€ 7-10 [μμ 72] Player ν΄λμ€μ λν μ μ(ExtremeC_examples_chapter7_2_player.c)
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "ExtremeC_examples_chapter7_2_gun.h"
// μμ± κ΅¬μ‘°μ²΄
typedef struct {
char* name;
struct gun_t* gun;
} player_t;
// λ©λͺ¨λ¦¬ ν λΉμ
player_te player_new() {
return (player_t*)malloc(sizeof(player_t));
}
// μμ±μ
void player_ctor(player_t* player, const char* name) {
player->name =
(char*)malloc((strlen(name) + 1) * sizeof(char));
strcpy(player->name, name);
// μ€μν λΆλΆμ
λλ€. μμ±μμμ μ§ν© ν¬μΈν°κ° μ€μ λμ§ μλ κ²½μ°,
// μ§ν© ν¬μΈν°λ₯Ό NULLλ‘ λμ΄μΌ ν©λλ€.
player->gun = NULL;
}
// μλ©Έμ
void player_dtor(player_t* player) {
free(player->name);
}
// νμ ν¨μ
void player_pickup_gun(player_t* player, struct gun_t* gun) {
//λ€μ ν μ΄ν, ν©μ± κ΄κ³κ° μμλ©λλ€.
player->gun = gun;
}
void player_shoot(player_t* player) {
// νλ μ΄μ΄κ° μΆ€μ λ€μλμ§ νμΈν΄μΌ ν©λλ€.
// μ΄μ λ€μ§ μμλ€λ©΄, λ°μ¬κ° 무μλ―Έν©λλ€.
if (player->gun) {
gun_trigger(player->gun);
} else {
printf("νλ μ΄μ΄λ μκ³ μΆμ§λ§ μ΄μ΄ μμ΅λλ€!");
exit(1);
}
}
void player_drop_gun(player_t* player) {
// λ€μ ν μ΄ν λ κ°μ²΄ κ° ν©μ± κ΄κ³κ° μ’
λ£λ©λλ€.
// μ΄ κ°μ²΄λ ν΄μ νλ©΄ μ λ©λλ€.
// νλ μ΄μ΄ κ°μ²΄λ ν©μ± λμ²λΌ μ΄ κ°μ²΄μ μμ μκ° μλκΈ° λλ¬Έμ
λλ€.
player->gun = NULL;
}
player_t ꡬ쑰체 λ΄λΆμμ ν¬μΈν° μμ±μΈ gunμ μ μΈνλλ° μ΄ μμ±μ 곧 gun κ°μ²΄λ₯Ό κ°λ¦¬ν΄ β μμ±μμμλ μ΄ μμ±μ NULLλ‘ λμ΄μΌ νλλ°, ν©μ±κ³Όλ λ¬λ¦¬ μ΄ μμ±μ΄ μμ±μμμ μ€μ
1
**λμ§ μκΈ° λλ¬Έ**
- μ무μ μ§ν©mandatory aggregation
- λ§μ½ μ§ν© ν¬μΈν°κ° μμ± μ μ€μ λμ΄μΌ νλ€λ©΄, λμ κ°μ²΄μ μ£Όμλ₯Ό μμ±μμ μΈμλ‘ μ λ¬ν΄μΌ ν©λλ€. μ΄λ¬ν μν©μ μ무μ μ§ν©mandatory aggregationμ΄λΌκ³ ν©λλ€.
μ νμ μ§ν©optional aggregation
- λ§μ½ μ§ν© ν¬μΈν°κ° μμ±μμμ NULLλ‘ λ¨μ μμ μ μλ€λ©΄ μ νμ μ§ν©optional aggregationμ΄λ©° μμ μ½λκ° μ΄μ ν΄λΉν©λλ€. μμ±μμμ μ νμ μ§ν© ν¬μΈν°λ₯Ό NULLλ‘ λλ κ²μ΄ μ€μν©λλ€.
- player_pickup_gun ν¨μμμλ μ§ν© κ΄κ³κ° μμλλ©° player_drop_gun ν¨μμμ μ΄ κ΄κ³κ° μ’ λ£
- μ§ν© κ΄κ³κ° μ’ λ£λ λ€ gun ν¬μΈν°λ₯Ό NULLλ‘ λμ΄μΌ νλ€λ μ μ λͺ μ¬
- ν©μ±κ³Ό λ¬λ¦¬ 컨ν μ΄λ κ°μ²΄λ 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄μ μμ μκ° μλλλ€. κ·Έλ¬λ―λ‘ ν¬ν¨λ κ° μ²΄μ λν ν΅μ κΆνμ΄ μμ΅λλ€. λ°λΌμ playerμ ꡬν μ½λ λ΄μμ μ΄λμμλ gun κ°μ²΄λ₯Ό ν΄μ νλ©΄ μ λ©λλ€.
- μ νμ μ§ν© κ΄κ³μμλ νλ‘κ·Έλ¨μ μ΄λ μ§μ μμ ν¬ν¨λ κ°μ²΄λ₯Ό μ€μ νμ§ μμμ μ μμ΅λ λ€. κ·Έλ¬λ―λ‘ μ§ν© ν¬μΈν°λ₯Ό μ¬μ©ν λλ μ‘°μ¬ν΄μΌ ν©λλ€. ν¬μΈν°μ λν μ΄λ€ μ κ·Όλ μ€μ λμ§ μμκ³ , λμΈ ν¬μΈν°λ μΈκ·Έλ©ν μ΄μ μ€λ₯λ₯Ό μΌμΌν¬ μ μκΈ° λλ¬Έμ λλ€. κΈ°λ³Έμ μΌλ‘ μ΄λ¬ν μ΄μ λ‘ player_shoot ν¨μμμ gun ν¬μΈν°κ° μ ν¨νμ§ μ²΄ν¬ν΄μΌ ν©λλ€.
- μ§ν© ν¬μΈν°κ° NULLμ΄λΌλ©΄, player κ°μ²΄λ₯Ό μ¬μ©νλ μ½λλ μ΄ κ°μ²΄λ₯Ό μλͺ» μ¬μ©νλ€λ μλ―Έκ° λ©λλ€. μ΄λλ νλ‘μΈμ€μ exit μ½λλ‘ 1μ λ°νν΄ μ€νμ μ€λ¨ν©λλ€.
μ½λλ°μ€ 7-11 [μμ 7-2] Gun ν΄λμ€μ λν μ μ(ExtremeC_examples_chapter7_2_gun.c)
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 <stdlib.h>
typedef int bool_t;
// μμ± κ΅¬μ‘°μ²΄
typedef struct {
int bullets;
} gun_t;
// λ©λͺ¨λ¦¬ ν λΉμ
gun_t* gun_new() {
return (gun_t*)malloc(sizeof(gun_t));
}
// μμ±μ
void gun_ctor(gun_t* gun, int initial_bullets) {
gun->bullets = 0;
if (initial_bullets > 0) {
gun->bullets = initial_bullets;
}
}
// μλ©Έμ
void gun_dtor(gun_t* gun) {
// ν μΌ μμ
}
// νμ ν¨μ
bool_t gun_has_bullets(gun_t* gun) {
return (gun-> bullets > 0);
}
void gun_trigger(gun_t* gun){
gun->bullets--;
}
void gun_refill(gun_t* gun) {
gun->bullets = 7;
}
λ§μ§λ§μΌλ‘ λ€μ μ½λ λ°μ€ 7-12]λ νλ μ΄μ΄ κ°μ²΄μ μ΄ κ°μ²΄λ₯Ό μμ±νλ 짧μ μλ리μ€
νλ μ΄μ΄λ μ΄μ μ§μ΄ λ€κ³ νμ½μ΄ λ¨μ§ μμ λκΉμ§ μ΄μ λ°μ¬ν©λλ€.
- κ·Έλ€μ νλ μ΄μ΄λ μ΄μ μ¬μ₯μ ν΄ κ°μ νμλ₯Ό ν©λλ€.
- λ§μ§λ§μλ μ΄μ λ΄λ €λμ΅λλ€.
μ½λ λ°μ€ 7-12 [μμ 7-2]μ main ν¨μ(ExtremeC_examples_chapter7_2_main.c)
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
#include <stdio.h>
#include <stdlib.h>
#include "ExtremeC_examples_chapter7_2_player.h"
#include "ExtremeC_examples_chapter7_2_gun.h"
int main(int argc, char** argv) {
// μ΄(gun) κ°μ²΄λ₯Ό λ§λ€κ³ μμ±νκΈ°
struct gun_t* gun = gun_new();
gun_ctor(gun, 3);
// νλ μ΄μ΄(player) κ°μ²΄λ₯Ό λ§λ€κ³ μμ±νκΈ°
struct player_t* player = player_new();
player_ctor(player, "Billy");
// μ§ν© κ΄κ³κ° μμλ©λλ€.
player_pickup_gun(player, gun);
// μ΄μμ΄ λ¨μ§ μμ λκΉμ§ μλλ€.
while (gun_has_bullets(gun)) {
player_shoot(player);
}
// μ΄μ μ¬μ₯μ (refill)ν©λλ€.
gun_refill(gun);
// μ΄μμ΄ λ¨μ§ μμ λκΉμ§ μλλ€.
while (gun_has_bullets(gun)) {
player_shoot(player);
}
// ν©μ± κ΄κ³λ₯Ό μ’
λ£ν©λλ€.
player_drop_gun(player);
// μ΄ κ°μ²΄λ₯Ό μλ©Έ λ° ν΄μ ν©λλ€.
gun_dtor(gun);
free(gun);
// νλ μ΄μ΄ κ°μ²΄λ₯Ό μλ©Έ λ° ν΄μ ν©λλ€.
player_dtor(player);
free(player);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
// ν©μ± κ΄κ³λ₯Ό μ’
λ£ν©λλ€.
//player_drop_gun(player);
// μ΄ κ°μ²΄λ₯Ό μλ©Έ λ° ν΄μ ν©λλ€.
gun_dtor(gun);
free(gun);
// νλ μ΄μ΄ κ°μ²΄λ₯Ό μλ©Έ λ° ν΄μ ν©λλ€.
player_shoot(player);
player_dtor(player);
free(player);
gunκ³Ό player κ°μ²΄λ μλ‘μ λν΄ λ 립μ μ λλ€.
μ§ν©μμ μ€μν μ μ ν¬ν¨λ κ°μ²΄μ μλͺ μ 컨ν μ΄λ κ°μ²΄κ° λ³κ²½νμ§ λͺ»νλ€λ μ μ λλ€.
1
2
3
4
5
6
7
8
9
10
void gun_dtor(gun_t* gun) {
// ν μΌ μμ
}
.
.
.
gun_dtor(gun);
free(gun);
-> μ΄ λκ°λ₯Ό ν©μΉμ§ μμ μ΄μ λ..?
λ€μ [μ Έ λ°μ€7-2]λ μ€ν νμΌμ λΉλνκ³ μ€ννλ λ°©λ²μ λνλ λλ€. 보λ€μνΌ [μ½λ λ°μ€ 7-12]μ main ν¨μλ μ무κ²λ μΆλ ₯νμ§ μμ΅λλ€.
μ Έ λ°μ€ 7-2 [μμ 7-2]μ μ»΄νμΌ, λ§ν¬, μ€ν
1
2
3
4
5
6
7
$ gcc -c ExtremeC_examples_chapter7_2_gun.c -o gun.o
$ gcc -c ExtremeC_examples_chapter7_2_player.c -o player.o
$ gcc -c ExtremeC_examples_chapter7_2_main.c -o main.o
$ gcc gun.o player.o main.o -o ex7_2.out
$ ./ex7_2.out
$
- μ€μ νλ‘μ νΈμμ μμ±λ κ°μ²΄ λͺ¨λΈμμ, μ§ν© κ΄κ³λ ν©μ± κ΄κ³μ μλ³΄λ€ μΌλ°μ μΌλ‘ λ λ§λ€.
- μ§ν© κ΄κ³λ μΈλΆ μ½λμμ λ λ§μ΄ λ³Ό μ μλ€
β μ§ν© κ΄κ³λ₯Ό λ§λ€λ €λ©΄ μ΅μν 컨ν μ΄λ κ°μ²΄μ κ³΅μ© μΈν°νμ΄μ€μμ μ§μ λ μΌλΆ νμ ν¨μκ° ν¬ ν¨λ κ°μ²΄λ₯Ό μ€μ λ° μ¬μ€μ ν΄μΌ νκΈ° λλ¬Έ
- μμ μμ μμμ²λΌ gunκ³Ό player κ°μ²΄λ μ²μμλ λΆλ¦¬ β μ μ μ°κ΄ β 곧 λ€μ λΆλ¦¬λ©λλ€.
μ΄λ μ§ν© κ΄κ³κ° μꡬμ μΈ κ΄κ³μΈ ν©μ± κ΄κ³μλ λ¬λ¦¬ μΌμμ μ΄λΌλ μλ―Έ.
μ΄λ ν©μ±μ΄ κ°μ²΄ κ° μμ possession (to-have) κ΄κ³μ λ κ°ν ννμ΄λ©°, λ°λ©΄ μ§ν©μ λ μ½ν κ΄κ³μμ λνλ λλ€.
- λ§μ½ μ§ν© κ΄κ³κ° λ κ°μ²΄ μ¬μ΄μμ μΌμμ μ΄λΌλ©΄, κ°μ²΄μ ν΄λΉνλ ν΄λμ€ μ¬μ΄μμλ κ΄κ³κ° μΌμμ μΌκΉμ?
- β μλλλ€. μ§ν© κ΄κ³λ ν΄λμ€μμλ μꡬμ μ λλ€. λ§μ½ λμ€μ μλ‘ λ€λ₯Έ μλ£νμ λ κ°μ²΄κ° μ§ν© κ΄κ³λ₯Ό κΈ°λ°μΌλ‘ κ΄κ³κ° μκΈΈ μ‘°κΈμ μ¬μ§κ° μλ€λ©΄, μ΄ μλ£νμ μꡬμ μΌλ‘ μ§ν© κ΄κ³μ¬μΌ ν©λλ€. ν©μ±λ λ§μ°¬κ°μ§μ λλ€.
β 7.5 λ§λ¬΄λ¦¬
ν΄λμ€μ κ°μ²΄ κ°μ κ°λ₯ν κ΄κ³μ μ ν
ν΄λμ€, κ°μ²΄, μΈμ€ν΄μ€, μ°Έμ‘° μ¬μ΄μ μ°¨μ΄μ μ μ¬μ±
ν©μ±μμ 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄λ μμ μ ν¬ν¨νλ 컨ν μ΄λ κ°μ²΄μ μ μ μΌλ‘ μμ‘΄ν©λλ€.
μ§ν©μμλ 컨ν μ΄λμ ν¬ν¨λ κ°μ²΄κ° 컨ν μ΄λ κ°μ²΄μ μ΄λ ν μμ‘΄μ±λ κ°μ§ μμ΅λλ€.
κ°μ²΄ μ¬μ΄μμ μ§ν©μ΄ μΌμμ μΌ μ μμΌλ κ°μ²΄μ μλ£ν(λλ ν΄λμ€) μ¬μ΄μμλ μꡬλΆλ³ν κ²μΌλ‘ μ μλ©λλ€.