Post

🐒 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]λŠ” ν”Œλ ˆμ΄μ–΄ 객체와 총 객체λ₯Ό μƒμ„±ν•˜λŠ” 짧은 μ‹œλ‚˜λ¦¬μ˜€

  1. ν”Œλ ˆμ΄μ–΄λŠ” 총을 집어 λ“€κ³  탄약이 남지 μ•Šμ„ λ•ŒκΉŒμ§€ 총을 λ°œμ‚¬ν•©λ‹ˆλ‹€.

  2. κ·Έλ‹€μŒ ν”Œλ ˆμ΄μ–΄λŠ” 총을 재μž₯μ „ν•΄ 같은 ν–‰μœ„λ₯Ό ν•©λ‹ˆλ‹€.
  3. λ§ˆμ§€λ§‰μ—λŠ” 총을 λ‚΄λ €λ†“μŠ΅λ‹ˆλ‹€.

μ½”λ“œ λ°•μŠ€ 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 마무리

  • ν΄λž˜μŠ€μ™€ 객체 간에 κ°€λŠ₯ν•œ κ΄€κ³„μ˜ μœ ν˜•

  • 클래슀, 객체, μΈμŠ€ν„΄μŠ€, μ°Έμ‘° μ‚¬μ΄μ˜ 차이와 μœ μ‚¬μ„±

  • ν•©μ„±μ—μ„œ μ»¨ν…Œμ΄λ„ˆμ— ν¬ν•¨λœ κ°μ²΄λŠ” μžμ‹ μ„ ν¬ν•¨ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ 객체에 μ „μ μœΌλ‘œ μ˜μ‘΄ν•©λ‹ˆλ‹€.

  • μ§‘ν•©μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆμ— ν¬ν•¨λœ 객체가 μ»¨ν…Œμ΄λ„ˆ 객체에 μ–΄λ– ν•œ μ˜μ‘΄μ„±λ„ 갖지 μ•ŠμŠ΅λ‹ˆλ‹€.

  • 객체 μ‚¬μ΄μ—μ„œ 집합이 μΌμ‹œμ μΌ 수 μžˆμœΌλ‚˜ 객체의 μžλ£Œν˜•(λ˜λŠ” 클래슀) μ‚¬μ΄μ—μ„œλŠ” μ˜κ΅¬λΆˆλ³€ν•œ κ²ƒμœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.