π’ chap6. OOPμ μΊ‘μν
β 6.1 κ°μ²΄μ§ν₯μ μ¬κ³
- μ°λ¦¬ μ£Όλ³μ λμμ μκ² λλμ΄ λΆμνλ λ°©λ² - ν μ΄λΈ μμ λ¬Όλ³
- μ£Όλ³μ κ°μ²΄μ§ν₯μ νμ€μ λ§μ λ°μ
- μΈκ°κ³Ό μνΈμμ©νλ λμobjectμ λͺ¨λ ν¬ν¨
- κ°μ²΄μ§ν₯μ μ¬κ³ λ μ°λ¦¬μ νκ²½μ μ²λ¦¬νλ κΈ°λ³Έ λ°©μμ΄λ©°, λ°λΌμ OOPλ μννΈμ¨μ΄ μμ±μ κ°μ₯ 보νΈμ μΌλ‘ μ¬μ©λ ν¨λ¬λ€μ
6.1.1 μ μ μ κ°λ
[μ½λ λ°μ€ 6-1] λͺ λͺ κ·μΉμ λ°λΌ student μ λμ΄λ₯Ό κ°κ³ νμ 10 λͺ μ μ 보λ₯Ό λ΄λ κ°μ λ°°μ΄
1 2 3 4
char* student_first_names[10]; char* student_surnames[10]; int student_ages[10]; double student_marks[10];
- student λΌλ λμΌν κ°λ μΌλ‘ λ³μ μ¬λ¬κ°λ₯Ό κ·Έλ£ΉμΌλ‘ λ¬Άλ λ²
μ½λ λ°μ€ 6-2 νμ 10 λͺ μ μ 보λ₯Ό μ μμ μ΄λ¦μ κ°λ κ°μ λ°°μ΄
1 2 3 4
char* aaa[l0]; char* bbb[l0]; int ccc[10]; double ddd[10];
1 2 π‘ κ°λ μ΄λ μ¬κ³ thought λλ μκ° ideaμΌλ‘, λ§μμμ μ‘΄μ¬νλ μ μ μ λλ μΆμμ μ΄λ―Έμ§μ λλ€. κ°λ concept μ νμ€ μΈκ³μ κ°μ²΄ entity μ κ΄ν μΈμμΌλ‘ νμ±λκ±°λ, λ¨μνκ²λ μμ ν κ°μμ imaginaryμ΄λ©° μΆμμ abstract μΌ μ μμ΅λλ€.
- κ°μ²΄μ§ν₯μ μ¬κ³ λ κ°λ κ³Ό κ°λ μ¬μ΄ κ΄κ³μ κ΄μ μμ μ¬κ³ νλ κ²
- μλ‘ μ°κ΄λ κ°μ²΄ λ° κ·Έμ λμνλ κ°λ κ³Ό κ΄κ³λ₯Ό μ λλ‘ μ΄ν΄
6.1.2 λ§μΈλ맡과 κ°μ²΄ λͺ¨λΈ
- μ΄ν΄ λ¨κ³ undstanding phase
- μμ±νλ νλ‘κ·Έλ¨μ λ§μμ κ°λ κ³Ό κ·Έ κ΄κ³λ₯Ό λͺ¨λ°© simulate.
- κ°μ²΄μ μΈ‘λ©΄μμ κ°λ μ λͺ¨λ°©
- μΈκ°κ³Ό κ°μ²΄μ§ν₯ νλ‘κ·Έλ¨μ λΉκ΅νλ©΄ κ°λ , λ§μ(mind), λ§μΈλ맡과 κ°μ μ©μ΄λ κ°μ²΄, λ©λͺ¨λ¦¬, κ°μ²΄ λͺ¨λΈμ κ°κ° λμ
6.1.3 μ½λμλ μλ κ°μ²΄
- κ°λ μ΄ μ΄μμλ λ§μμμλ§ μ‘΄μ¬ν μ μλ κ²μ²λΌ, κ°μ²΄λ μ€μ§ μ€ν μ€μΈ νλ‘κ·Έλ¨μλ§ μ‘΄μ¬
- OOP λ κ°μ²΄λ₯Ό μ€μ λ‘ λ§λ€μ§ μμ΅λλ€. OOPλ νλ‘κ·Έλ¨μ΄ μ€νλ λ μμ ν λμ μΈ κ°μ²΄λͺ¨λΈλ‘ μ΄μ΄μ§ μΌλ ¨μ λͺ λ Ήμ΄λ₯Ό λ§λλλ€.
- μμ§ λ§λ€μ΄μ§μ§ μμ κ²μ κ΄ν λ€μν μΈλΆ μ¬νμ μ€λͺ νκ³ μ μνλ κΈ°μ μ μΌλ°μ μΌλ‘ μ€κ³design - CLASS
- λͺ¨λ κ°μ²΄λ μ§μ λ μλͺ μ£ΌκΈ° lifecycle
- λΆλ³ κ°μ²΄ immutable objectλ‘ κ°λνλ°, λΆλ³ κ°μ²΄λ ν¨μν νλ‘κ·Έλλ°functionaI progranuning ν¨λ¬λ€μ
6.1.4 κ°μ²΄μμ±
- κ°μ²΄λ λ κ° μ΄μμ μμ± λλ μμ±μ μ§ν©μ κ°μ§ μ μλ€.
- μμ±μ ν λΉλ κ°μ μ΄κ΄ν΄ κ°μ²΄μ μν state
- κ°μ²΄λ μλͺ life time λμ μμ λ μ μμ΅λλ€. μ΄λ° κ°μ²΄λ₯Ό κ°λ³ (mutable κ°μ²΄)
- κ°μ²΄λ λΆλ³ immutable μΌ μλ μλ€. μ΄λ μ νν, λ³κ²½ν μ μλ μ«μ 2μ ν΄λΉνλ κ°λ
1 π‘ NOTE_ μνκ° μλ κ°μ²΄λ μλͺ λμ μνλ₯Ό λ³κ²½ν μ μμΌλ―λ‘ λΆλ³ κ°μ²΄λ‘ κ°μ£Ό νλ€.
6.1.5 λλ©μΈ
- λλ©μΈμ μννΈμ¨μ΄κ° κΈ°λ₯μ 곡κ°ν κ²½κ³λ₯Ό μ μ
- μννΈμ¨μ΄κ° λ€λ£¨μ΄μΌ νλ μꡬ μ¬νμ μ μ
- λλ©μΈμ 미리 μ μλ ꡬ체μ μΈ μ©μ΄μ§ terminology(gIossary) μ μ¬μ©ν΄ μ무λ₯Ό μννκ³ μμ§λμ΄κ° λλ©μΈμ κ²½κ³ λ΄μ μλλ‘ ν©λλ€.
- μν λλ©μΈ, μλ£λλ©μΈ, ν¬μ€μΌμ΄ λλ©μΈ
6.1.6 κ°μ²΄ μ¬μ΄μ κ΄κ³
- κ°μ²΄λ κ΄κ³λ₯Ό λνλ΄κ³ μ μλ‘λ₯Ό μ°Έμ‘°
- μμ€ν λ΄μ λͺ¨λ κ°μ²΄λ μλ‘λ₯Ό μ°Έμ‘°ν΄ κ°μ²΄ λͺ¨λΈμ΄λΌλ κ°μ²΄μ λ€νΈμν¬λ₯Ό νμ±
- λ κ°μ²΄κ° μ°κ΄λ λ νλμ μνκ° λ³νλ©΄ λ€λ₯Έ μνμλ μν₯
1
2
{x: 53, y: 345, red: 120, green: 45, blue: 178, adjacent_down_pixel:p2}
{x: 53: y: 346, red: 79, green: 162, blue: 23, adj acent_up_pixel : p1}
6.1.7 κ°μ²΄ μ§ν₯ μμ
- κ°μ²΄μ μμ±, κ°μ²΄μ μλ©Έ κ°μ²΄μ μν λ³κ²½
1 π‘ NOTE_ μμ±constructionμ΄λΌλ μ©μ΄λ μ μ€νκ² μ¬μ©ν΄μΌ νλ€.
1
2
3
μμ±μ λνλ΄λ μ©μ΄λ‘ creation μ΄λ buildingμ μ¬μ©ν λ μμ§λ§. μ΄ λ¨μ΄λ OOP κ΄λ ¨ λ¬Ένμμ νμ€ μ©μ΄λ‘ λ°μ λλ €μ§μ§ μμ΅λλ€.
creationμ κ°μ²΄μ λ©λͺ¨λ¦¬ ν λΉμ λ»νκ³ constructionμ μμ±μ μ΄κΈ°νλ₯Ό μλ―Έν©λλ€. >
- κ°μ²΄μ μμ± κ³ννλ λ°©λ²
- 첫 λ²μ§Έ μ κ·Όλ²μ λΉ κ°μ²΄λ₯Ό μμ±νκ±°λ λλ λ μΌλ°μ μΌλ‘ μ΅μ νμ μμ±μ μ§ν©μ κ°λ κ°μ²΄λ₯Ό μμ±νλ κ²
- μ½λκ° μ€νλλ λμ λ λ§μ μμ±μ΄ κ²°μ λκ³ μΆκ° μ΄ λ°©μμ μ¬μ©νλ©΄ μ£Όλ³ νκ²½μμ λ°κ²¬λλ λ³κ²½ μ¬νμ λ°λΌ κ°μ νλ‘κ·Έλ¨μ λ€λ₯΄κ² λ λ² μ€νν λ κ°μ κ°μ²΄λΌλ λ€λ₯Έ μμ±μ κ°μ§ μ μμ΅λλ€.
- κ°κ°μ κ°μ²΄λ λ³λμ κ°μ²΄entityλ‘ μ·¨κΈλ©λλ€. κ·Έλ¦¬κ³ μ΄λ€ λ κ°μ²΄κ° κ³΅ν΅ μμ±μ λͺ©λ‘μ κ°μ Έμ κ°μ κ·Έλ£Ή(νΉμ ν΄λμ€μ μνλ κ²μ²λΌ 보μ΄λλΌλ μ΄λ€ λ κ°μ²΄λ νλ‘κ·Έλ¨μ΄ μ§μλλ λμ μνμ λ€λ₯Έ μμ±μ κ°μ΅λλ€.
- λ λ²μ§Έ μ κ·Όλ²μ μμ±μ΄ 미리 μ ν΄μ Έ μμ΄μ μ€ν λμ€μ λ³κ²½λμ§ μλ κ°μ²΄λ₯Ό μμ±νλ κ²μ λλ€. μ΄ κ°μ²΄λ λ°νμ λμ μ΄λ ν μμ±λ μΆκ°λμ§ λͺ»ν΄ κ°μ²΄λ ꡬ쑰λ₯Ό μ μ§ν©λλ€. μμ±κ°λ§ λ³κ²½ν μ μμΌλ©° μ΄λ κ°μ²΄κ° κ°λ³μ mutableμΌ λλ§ κ°λ₯ν©λλ€.
- μ΄ μ κ·Όλ²μ μ μ©νλ €λ©΄. κ°λ°μλ λ°νμ λ κ°μ²΄μ μ‘΄μ¬ν΄μΌ νλ λͺ¨λ μμ±μ μΆμ νλ 미리 μ€κ³λ κ°μ²΄ ν νλ¦Ώ λλ ν΄λμ€λ₯Ό λ§λ€μ΄μΌ ν©λλ€. κ·Έλ° μ΄ ν νλ¦Ώμ μ»΄νμΌν΄μ λ°νμ μμ κ°μ²΄μ§ν₯ μΈμ΄λ‘ μ 곡 β’ λ§μ νλ‘ λλ° μΈμ΄μμ μ΄λ¬ν κ°μ²΄ ν νλ¦Ώμ ν΄λμ€λΌκ³ ν©λλ€. μλ°λ C++, νμ΄μ¬κ³Ό κ°μ νλ‘κ·Έλλ° μΈμ΄λ κ°μ²΄ ν νλ¦Ώμ λνλ΄λ μ©μ΄λ‘ ν΄λμ€λ₯Ό μ¬μ© μ΄ κΈ°μ μ λ³΄ν΅ ν΄λμ€ κΈ°λ°μ OOPλΌκ³ μλ €μ‘μ΅λλ€. νμ΄μ¬μ νλ‘ν νμ κΈ°λ° λ° ν΄λμ€ κΈ°λ°μ OOPλ₯Ό λͺ¨λ μ§μνλ€λ μ
1 π‘ NOTE_ ν΄λμ€λ κ°μ²΄μ μ‘΄μ¬νλ μμ±μ λͺ©λ‘μ κ²°μ ν λΏ. λ°νμ μ μ€μ λ‘ ν λΉλλ κ°μ μλλλ€.
- κ°μ²΄μ μΈμ€ν΄μ€instanceλ κ°μ κ²μ΄λ©° μλ‘ λ°κΏ μ¬μ©ν μ μμ΅λλ€.
- μ°Έμ‘° referece- κ°μ²΄ λλ μΈμ€ν΄μ€λΌλ μ©μ΄λ κ°μ²΄μ κ°μ΄ λ©λͺ¨λ¦¬μ ν λΉλ μ€μ μμΉλ₯Ό μ°Έμ‘°νλ λ° μ¬μ©λ©λλ€. λ°λ©΄ μ°Έμ‘°λ κ°μ²΄λ₯Ό μ°Έμ‘°νλ ν¬μΈν°μ κ°μ΅λλ€. κ·Έλ¬λ―λ‘ κ°μ κ°μ²΄λ₯Ό μ°Έμ‘°νλ μ¬λ¬ μ°Έμ‘°κ° μμ μ μμ΅λλ€. μΌλ°μ μΌλ‘
???
κ°μ²΄λ μ΄λ¦μ΄ μμ§λ§ μ°Έμ‘°λ μ΄λ¦μ΄ μμ΅λλ€.
1 π‘ NOTE_ μμλ μ°Έμ‘°μ λμνλ λ¬Έλ²μΌλ‘ ν¬μΈν°κ° μμ΅λλ€. μ€ν κ°μ²΄ λ° ν κ°μ²΄κ° μμ΅λλ€. ν κ°μ²΄λ μ΄λ¦μ΄ μμΌλ©° μ΄λ₯Ό μ°Έμ‘°νκΈ° μν΄ ν¬μΈν°λ₯Ό μ¬μ©ν©λλ€. λ°λ©΄ μ€ν κ°μ²΄λ μ€μ λ‘ λ³μμ΄λ©° λ°λΌμ μ΄λ¦μ΄ μμ΅λλ€.
- ν΄λμ€ λ° νλ‘ν νμ κΈ°λ°μ λ μ κ·Όλ²μ λͺ¨λ μ¬μ©ν μ μμ§λ§. C κ·Έλ¦¬κ³ νΉν C++μ 곡μμ μΌλ‘ ν΄λμ€ κΈ°λ°μ μ κ·Όλ²μ μ§μνλ λ°©μμΌλ‘ μ€κ³λμμ΅λλ€
- μΈκ°μ μ°μ μ‘΄μ¬ν λ€μ μΆμ κ²½νμΌλ‘λΆν° λ³Έμ§μ μ»λλ€λ λ»
- νλ‘ν νμ κΈ°λ°μ μ κ·Όλ²μμλ κ°μ²΄λ λΉμ΄ μλ μ±λ‘ μμ±λ λ€μ λ°νμ λμ λ°λ¬
- κ°μ²΄ μ°½μ‘°μλ‘μ ν΄λμ€λ₯Ό μ€λΉν λ€μ, νλ‘κ·Έλ¨μ ν΄λμ€μ λ°λΌ κ°μ²΄λ₯Ό λ§λ€κΈ° μμν©λλ€.
- κ°μ²΄ λͺ¨λΈμμ μ°Έμ‘° λ¬΄κ²°μ± referential integrity μ μμ΅λλ€.
6.1.8 νμλ₯Ό κ°λ κ°μ²΄
- λͺ¨λ κ°μ²΄λ μμ±κ³Ό λλΆμ΄ μνν μ μλ κΈ°λ₯μ κ΄ν νΉμ λͺ©λ‘
- μλμ°¨ κ°μ²΄ - μλ, λ°©ν₯
- κΈ°λ₯μ μΈμ λ λλ©μΈμ μꡬμ¬νμ λ°λ¦
β 6.2 Cκ° κ°μ²΄μ§ν₯μ΄ μλ μ΄μ
- μΈκ°μ κ°μ²΄μ§ν₯μ λ°©μμΌλ‘ μ¬κ³ νμ§λ§ CPUλ μ μ°¨μ§ν₯μ κΈ°κ³ λͺ λ Ήμ΄λ₯Ό μ€ν
- κ°μ²΄μ§ν₯μ μΈκ°μ΄ λ¬Έμ λ₯Ό μ΄ν΄νλ λ°©μμ΄λ©° μ μ°¨μ§ν₯μ μ€νμ CPU κ° ν μ μλ μΌ
- κ³ μμ€ λ‘μ§μ μ μμ€μ μ μ°¨μ§ν₯μ λͺ λ Ήμ΄λ‘ λ³ννλ λ‘μ΄μ΄κ° νμ
β 6.3 μΊ‘μν
- μμ±κ³Ό κΈ°λ₯μ κ°μ²΄λΌλ κ°μ²΄-entityμ λ£λ μμ
- μΊ‘μνλ κ°μ²΄λ₯Ό λνλ΄λ μΊ‘μμ μλ‘ μ°κ΄λ κ²μ μ§μ΄λ£λλ€λ μλ―Έ
6.3.1 μμ±μΊ‘μν
- μΊ‘μν νλ €λ©΄ νμ λ³μλͺ μ μ¬μ©ν΄μΌ νκ³ , μλ‘ λ€λ₯Έ λ³μλ₯Ό λ¬Άμ΄μ κ°μ κ° μ²΄ λ΄μ κ·Έλ£ΉμΌλ‘ λμ΄μΌ ν©λλ€.
μ½λ λ°μ€ 6-3 λ ν½μ μ λνλ΄λ μ¬λ¬ λ³μλ₯Ό μ΄λ¦μΌλ‘ 그루ννκΈ°
1 2 3 4 5 6 7 8 9 10 11
int pixel_p1_x = 56; int pixel_p1_y = 34; int pixel_p1_red = 123; int pixel_p1_green = 37; int pixel_p1_blue = 127; int pixel_p2_x = 212; int pixel_p2_y = 994; int pixel_p2_red = 127; int pixel_p2_green = 127; int pixel_p2_blue = 0;
- μ묡μ implicit κ°μ²΄μΈ plκ³Ό p2 μλμμ λ³μλ₯Ό 그루νν λ λ³μλͺ μ μ΄λ»κ² μ¬μ©
- μ묡μ μ΄λ, κ°λ°μκ° μ΄ κ°μ²΄μ μ‘΄μ¬λ₯Ό μλ μ μΌν μ¬λμ΄λΌλ λ»
- νλ‘κ·Έλλ° μΈμ΄λ μ΄ κ°μ²΄μ λν΄ μ무κ²λ λͺ¨λ¦
- λͺ μμ explicit μΊ‘μνλ₯Ό μ 곡νλ μ κ·Όλ²
- λͺ μμ μ΄λ, κ°λ°μμ νλ‘κ·Έλλ° μΈμ΄ λ λ€ μΊ‘μν, μΊ‘μ(λλ κ°μ²΄ μ μ‘΄μ¬λ₯Ό μλ€λ μλ―Έ)
- λͺ μμ κΈ°λ₯μ μμμ΄λ λ€νμ± κ°μ λ€λ₯Έ κ°μ²΄μ§ν₯μ κΈ°λ₯μΌλ‘ νμ₯λ μ μμ΅λλ€.
- Cμμλ κ΅¬μ‘°μ²΄κ° μΊ‘μνλ₯Ό μ 곡
[μ½λ λ°μ€ 6-4] pixel_t ꡬ쑰체μ pixel_t λ³μ 2κ°λ₯Ό μ μΈνκΈ°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
typedef struct { int x, y; int red, green, blue; } pixel_t; pixel_t p1, p2; p1.x = 56; p1.y = 34; p1.red = 123; p1.green = 37; p1.blue = 127; p2.x = 212; p2.y = 994; p2.red = 127; p2.green = 127; p2.blue = 0
- μμ± μΊ‘μνλ x, y, red, green, blue μμ±μ μ μλ£νμΈ pixel_t λ‘ λ£μ λ λ°μ
- μΊ‘μνλ μΈμ λ μλ‘μ΄ μλ£νμ λ§λ¦
_t
μ λ―Έμ΄κ° pixel μ λμ λΆμ not mandatory- p1κ³Ό p2λ μ€νλ λ λͺ μμ κ°μ²΄κ° λ¨.
- ꡬ쑰체λ μμ±λ§ κ°μ§λ―λ‘ κ΅¬μ‘°μ²΄λ ν΄λμ€μ λμλ¬Όμ΄ μλ.
- μμ±attributeκ³Ό κΈ°λ₯functionalμ΄ λ°λ‘λ°λ‘ μ‘΄μ¬νκ³ μ°λ¦¬λ μ΄ λμ μ묡μ μΌλ‘ μ½λμ μ°κ΄ μν΅λλ€.
- λͺ¨λ ν΄λμ€λ Cμμ μ묡μ μ΄λ©°, λͺ¨λ ν΄λμ€λ Cμ ν¨μ λͺ©λ‘μ κ°λ νλμ ꡬ쑰체μ ν΄λΉ???
- ν νλ¦Ώ (μ¬κΈ°μλ pixel_t ꡬ쑰체)μ κΈ°λ°ν κ°μ²΄λ₯Ό μμ±. <β νλ‘ν νμ
- μ΄ ν νλ¦Ώμ κ°μ²΄κ° μμ±λ λ 미리 κ²°μ λ μμ±μ κ°μ
- κ°μ²΄ μ μΈνλ λμ λμμ λ κ°μ§ μΌμ΄ λ°μ λ¨Όμ κ°μ²΄μ λ©λͺ¨λ¦¬κ° ν λΉ(λ§λ€κΈ° creation). μμ±μ κΈ°λ³Έκ° default valueμ μ¬μ©ν΄ μ΄κΈ°ν(μμ± construction) .
- κ°μ²΄ λ΄λΆμ μμ±μ μ κ·Όν λ μ (
.
οΌμ μ¬μ© ν¬μΈν°μ μ μ₯λ μ£Όμλ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ ꡬ쑰체 μμ±μ μ κ·Όν λλ νμ΄ν(β
) λ₯Ό μ¬μ©
6.3.2 νμ μΊ‘μν
- λ©μλλ κ°μ²΄ λ΄μ μ μ₯λλ λ‘μ§ λλ κΈ°λ₯μ λνλ΄κ³ μ μ¬μ©νλ νμ€ μ©μ΄
- λ©μλλ Cμ ν¨μλ‘ κ°μ£Όν μ μμΌλ©° μ΄λ¦, μΈμμ λͺ©λ‘, λ°νν
- μμ±μ value μ λ¬νλ©° λ©μλλ νμbehaviorλ₯Ό μ λ¬ν¨.
[μ½λ λ°μ€ 6-5] μλ°μ€ν¬λ¦½νΈ μμ client κ°μ²΄ μμ±νκΈ°
1 2 3 4 5 6 7 8 9 10 11 12
// λΉ κ°μ²΄ μμ± var clientObj = {}; // μμ± μμ± clientObj.name = "John"; clientObj.surname = "Doe" ; // clientObj.orderBankAccount = function () { β’ β’ β’ } β’ β’ β’ // λ©μ λ νΈμΆ clientObj.orderBankAccount();
- μ΅λͺ ν¨μanonymous functionκ° μλλ°, μ΅λͺ ν¨μλ μ΄λ¦μ κ°μ§ μμΌλ©° μΌμͺ½μ μλ κ°μ²΄μ orderBankAccount μμ±μ ν λΉ
[μ½λ λ°μ€ 6-6] C++μμ client κ°μ²΄ μμ±νκΈ°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class Client { public: void orderBankAccount () { β’ β’ β’ } std::string name; std::string surname; }; Client clientObj; clientObj.name = "John"; clientObj.surname = "Doe"; clientObj.orderBankAccount();
1 π‘ NOTE_ μΌλ°μ μΌλ‘ C++μμ λ©μλλ λ©€λ² member function. μμ±μ λ°μ΄ν° λ©€λ²data member
- μ묡μ μΊ‘μνimplicit capsulation
- Cλ λͺ μμ μΈ νμ μΊ‘μνλ₯Ό μ 곡νμ§ μμΌλ―λ‘ μ묡μ μΌλ‘ μ¬μ©.
- μ묡μ μΊ‘μν κΈ°λ²
- κ°μ²΄μ μμ±μ μ μ₯νκΈ° μν΄ Cμ ꡬ쑰체λ₯Ό μ΄μ©ν©λλ€(λͺ μμ μμ± μΊ‘μν). μ΄ κ΅¬μ‘°μ²΄λ μμ± κ΅¬μ‘°μ²΄attribute structureλΌκ³ ν©λλ€.
- νμ μΊ‘μνλ₯Ό μν΄ Cμ ν¨μκ° μ¬μ©λ©λλ€. μ΄ ν¨μλ νμ ν¨μbehavior function λΌκ³ ν©λλ€.
- ꡬ쑰체λ ν¨μλ₯Ό κ°μ§ μ μμ΅λλ€. κ·Έλ¬λ―λ‘ μ΄ ν¨μλ μμ± κ΅¬μ‘°μ²΄ λ°κΉ₯μ μ‘΄μ¬ν΄μΌ ν©λλ€(μ묡μ νμμΊ‘μν).
- νμ ν¨μλ μΈμ μ€ νλλ‘ λ°λμ ꡬ쑰체 ν¬μΈν°λ₯Ό λ°μμΌ ν©λλ€(μ£Όλ‘ μ²« λ²μ§Έ μΈμ λλ λ§μ§λ§ μΈμ)
- μ΄ ν¬μΈν°λ κ°μ²΄μ μμ± κ΅¬μ‘°μ²΄λ₯Ό κ°λ¦¬ν΅λλ€. νμ ν¨μλ μΌλ°μ μΌλ‘ κ°μ²΄μ μμ±μ μ½κ±°λ μμ ν΄μΌνκΈ°λλ¬Έμ λλ€.
- νμ ν¨μκ° κ°μ²΄μ λμΌν ν΄λμ€μ μλ‘ μ°κ΄λμμμ λνλ΄λ €λ©΄ μ μ ν μ΄λ¦μ΄ μμ΄μΌ ν©λλ€. κ·Έλ¬λ―λ‘ μ묡μ μΊ‘μν κΈ°λ²μ μ¬μ©ν λλ κΌ λͺ λͺ κ·μ°©μ μΌκ΄μ μΌλ‘ μ§μΌμΌ ν©λλ€.
- μΌλ°μ μΌλ‘ μμ± κ΅¬μ‘°μ²΄μ μ μΈμ΄ μλ ν€λ νμΌμμ νμ ν¨μμ λν΄ μ μΈν©λλ€. μ΄ ν€λ νμΌμ μ μΈ ν€λ declaration headerλΌκ³ ν©λλ€.
- μΌλ°μ μΌλ‘ μ μΈ ν€λλ₯Ό ν¬ν¨νλ νλ λλ μ¬λ¬ λ³λμ μμ€ νμΌμμ νμ ν¨μλ₯Ό μ μν©λλ€.
- μ묡μ μΊ‘μνμλ ν΄λμ€κ° μ‘΄μ¬νμ§λ§ μ묡μ μ΄λ©° κ°λ°μλ§ ν΄λμ€λ₯Ό μκ³ μλ€λ μ μ λͺ μ¬νμΈμ.
[μ½λ λ°μ€ 6-7] [μμ ] Car ν΄λμ€μ μμ± κ΅¬μ‘°μ²΄μ νμ ν¨μμ μ μΈ ExtremeC_examples_chapter6_1.h)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#ifndef EXTREME_C_EXAMPLES_CHAPTER_6_1_H #define EXTREME_C_EXAMPLES_CHAPTER_6_1_H // μ΄ κ΅¬μ‘°μ²΄λ μλμ°¨ car ) κ°μ²΄μ μ°κ΄λ λͺ¨λ μμ±μ κ°μ΅λλ€. typedef struct { char name [ 32]; double speed; double fuel; } car_t; // μ΄ ν¨μ μ μΈμ μλμ°¨ κ°μ²΄μ νμμ ν΄λΉν©λλ€. void car_construct(car_t*, const char*); void car_destruct(car_t*); void car_accelerate(car_t*); void car_brake (car_t*); void car_refuel(car_t*, double); #endif
- κ°κ°μ κ°μ²΄λ μμ λ§μ κ³ μ ν μμ± κ΅¬μ‘°μ²΄ λ³μλ₯Ό κ°μ΅λλ€.
- νμ§λ§ λͺ¨λ κ°μ²΄λ κ°μ νμ ν¨μλ₯Ό 곡μ ν©λλ€. κ°κ°μ κ°μ²΄μ μμ± κ΅¬μ‘°μ²΄ νμμλ μ§μ λ λ³μdedicated variable λ₯Ό λ§λ€μ΄μΌ νμ§λ§, νμ ν¨μλ λ¨ ν λ² μμ±ν΄ μλ‘ λ€λ₯Έ κ°μ²΄μμ νΈμΆν©λλ€.
- μ€κ°μ²΄μ§ν₯semi-object-0riented μ½λλ₯Ό μμ±ν μ λͺ μ€ν μμ€ νλ‘ μ νΈ - libcurl
[μ½λ λ°μ€ 6-8] [μμ 6-1 ] Car ν΄λμ€μ νμ ν¨μμ κ΄ν μ μ ExtremeC_examples_chapter6_1.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
// File name: ExtremeC_examples_chapter6_1.c // Description: Definitions of the behavior functions #include <string.h> #include "ExtremeC_examples_chapter6_1.h" // Definitions of the above functions void car_construct(car_t* car, const char* name) { strcpy(car->name, name); car->speed = 0.0; car->fuel = 0.0; } void car_destruct(car_t* car) { // Nothing to do here! } void car_accelerate(car_t* car) { car->speed += 0.05; car->fuel -= 1.0; if (car->fuel < 0.0) { car->fuel = 0.0; } } void car_brake(car_t* car) { car->speed -= 0.07; if (car->speed < 0.0) { car->speed = 0.0; } car->fuel -= 2.0; if (car->fuel < 0.0) { car->fuel = 0.0; } } void car_refuel(car_t* car, double amount) { car->fuel = amount; }
- λͺ¨λ ν¨μλ car_t ν¬μΈν°λ₯Ό 첫 λ²μ§Έ μΈμλ‘ λ°μ΅λλ€. μ΄λ‘μ¨ ν¨μκ° κ°μ²΄μ μμ±μ μ½κ³ μμ νλλ‘ ν©λλ€. λ§μ½ ν¨μκ° μμ± κ΅¬μ‘°μ²΄μ λν ν¬μΈν°λ₯Ό λ°μ§ λͺ»νλ€λ©΄, κ°μ²΄μ νμλ₯Ό λνλ΄μ§ λͺ»νλ νλ²ν ordinary C ν¨μλ‘ κ°μ£Όν΄μΌ ν©λλ€.
- νμ ν¨μμ μ μΈμ ν¨μμ λμνλ μμ± κ΅¬μ‘°μ²΄μ μ μΈμ μ΄μ΄μ μννλ€λ μ
- μμ± κ΅¬μ‘°μ²΄μ νμ ν¨μμ μ°κ΄μ±μ κ΄λ¦¬νλ μ μΌν λ΄λΉμκ° κ°λ°μμ΄κ³ , μ μ§ λ³΄μκ° λ§€μ° μ¬μμΌ νκΈ° λλ¬Έμ λλ€. μ΄λ° μ΄μ λ‘ μμ± κ΅¬μ‘°μ²΄μ νμ ν¨μμ μ§ν©μ μλ‘ κ°κΉμ΄, λκ°λ κ°μ ν€λ νμΌμ λλ©΄, ν΄λμ€μ μ λ°μ μΈ κ΅¬μ‘°λ₯Ό μ μ§νλ λ° λμμ΄ λκ³ λμ€μ λ€μ¬μΌν μκ³ λ₯Όλμ΄μ€λλ€.
[μ½λ λ°μ€ 6-9 ][μμ 6-1 ]μ main ν¨μ(ExtremeC_examples_chapter6_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 24 25 26 27 28 29 30 31 32 33
// File name: ExtremeC_examples_chapter6_1_main.c // Description: Main function #include "ExtremeC_examples_chapter6_1.h" // Main function int main(int argc, char** argv) { // Create the object variable car_t car; // Construct the object car_construct(&car, "Renault"); // Main algorithm car_refuel(&car, 1000.0); while (car.fuel > 0) { if (car.speed < 80) { car_accelerate(&car); } else { car_brake(&car); } } while (car.speed > 0) { car_brake(&car); } // Destruct the object car_destruct(&car); return 0; }
- main ν¨μκ° carμ μμ±μ μ κ·Όν μ μλ€λ μ
- μλ₯Ό λ€μ΄ fuelκ³Ό speed λΌλ μμ±μ 곡κ°public μμ±μ κ΄ν μμ
- κ³΅κ° μμ±μ νμ ν¨μ μ΄μΈμ ν¨μ μΈλΆ μ½λκ° μ κ·Ό
- main ν¨μλ₯Ό λ λ νλ‘κ·Έλ¨μ μ’ λ£νκΈ° μ μ car κ°μ²΄λ₯Ό μλ©Έ
- κ°μ²΄κ° ν λΉν 리μμ€κ° ν΄μ λμ΄μΌ ν¨
- ν ν λΉμ κ²½μ° μλ©Έ λ¨κ³λ μ무μ΄λ©° μ΄λ λ©λͺ¨λ¦¬ λμ λ°©μ§.
[μ½λ λ°μ€ 6-10] [μμ 6β2) C++μμ Car ν΄λμ€μ μ μΈ ExtremeC_examples_chapter6_2.h )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// File name: ExtremeC_examples_chapter6_2.h // Description: Declaration of the class Car #ifndef EXTREME_C_EXAMPLES_CHAPTER_6_2_H #define EXTREME_C_EXAMPLES_CHAPTER_6_2_H class Car { public: // Constructor Car(const char*); // Destructor ~Car(); void Accelerate(); void Brake(); void Refuel(double); // Data Members (Attributes in C) char name[32]; double speed; double fuel; }; #endif
- μ΄ μ½λμ μ£Όμ νΉμ§μ C++κ° ν΄λμ€λ₯Ό μ΄ν΄νλ€λ μ¬μ€
- μ½λλ λͺ μμ μΊ‘μνλ₯Ό λνλ΄λ©° μμ±κ³Ό ν¨μλ₯Ό λ λ€ μΊ‘μν
- κ²λ€κ° C++λ μμ±μλ μλ©Έμμ κ°μ λ κ°μ²΄μ§ν₯μ μΈ κ°λ μ μ§μ
- νμ ν¨μμλ 첫 λ²μ§Έ ν¬μΈν° μΈμκ° μμ΅λλ€.
[μ½λ λ°μ€ 6-11] [μμ 6-2] C++μμ Car ν΄λμ€μ μ μ ExtremeC_examples_chapter6_2.cpp)
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
// File name: ExtremeC_examples_chapter6_2.cpp // Description: Definition of the member functions in the Car class #include <string.h> #include "ExtremeC_examples_chapter6_2.h" Car::Car(const char* name) { strcpy(this->name, name); this->speed = 0.0; this->fuel = 0.0; } Car::~Car() { // Nothing to do } void Car::Accelerate() { this->speed += 0.05; this->fuel -= 1.0; if (this->fuel < 0.0) { this->fuel = 0.0; } } void Car::Brake() { this->speed -= 0.07; if (this->speed < 0.0) { this->speed = 0.0; } this->fuel -= 2.0; if (this->fuel < 0.0) { this->fuel = 0.0; } } void Car::Refuel(double amount) { this->fuel = amount; }
- C μ½λμ car ν¬μΈν°κ° μ ν€μλμΈ this ν¬μΈν°λ‘ λ체λμμ΅λλ€. thisλΌλ ν€μλλ λ¨μν νμ¬ κ°μ²΄λ₯Ό μλ―Έν©λλ€.
[μ½λ λ°μ€ 6-12] [μμ 6-2] main ν¨μ (ExtremeC_examples_chapter6_2_main.cpp)
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
// File name: ExtremeC_examples_chapter6_2_main.cpp // Description: Main function #include "ExtremeC_examples_chapter6_2.h" // Main function int main(int argc, char** argv) { Car car("Renault"); // Main algorithm car.Refuel(1000.0); while (car.fuel > 0) { if (car.speed < 80) { car.Accelerate(); } else { car.Brake(); } } while (car.speed > 0) { car.Brake(); } // When leaving the function, the object `car` gets // desructed automatically. return 0; }
- C++μμ μ΄ κ²κ³Ό λ§€μ° λΉμ·νμ§λ§ ꡬ쑰체 λ³μ λμ ν΄λμ€ λ³μμ λ©λͺ¨λ¦¬κ° ν λΉ
- νμΌμ μ΄μ©ν΄μ κ°μ΄
- car_accelerate(&car) λμ car.Accelerate( ) λ₯Ό μ¬μ©
- car_refuel(&car, 1000.00) λμ car.Refuel(1000.0) μ μ¬μ©
- C++ μ¬μ΄μλ κ°μ²΄ μλ©Έμ κ΄ν μ€μν μ°¨μ΄
- C++μμ μλ©Έμ ν¨μλ κ°μ²΄κ° μ€ν κ°μ₯ μμ ν λΉλμ΄ μ€μ½νλ₯Ό λ²μ΄λλ € ν λλ§λ€ λ€λ₯Έ μ€ν λ³μμ²λΌ μλμΌλ‘ νΈμΆ
- C++μ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° μ΄λ£©ν ν° μ±κ³Ό
- Cμμλ μλ©Έμ ν¨μλ₯Ό νΈμΆνλ κ²μ μκΈ° μ¬μμ κ²°κ΅ λ©λͺ¨λ¦¬ λμκ° λ°μ
6.3.3 μ 보μλ
- μΊ‘μνμ λ λ€λ₯Έ λͺ©μ λλ κ²°κ³Όλ λ°λ‘ μ 보 μλ infomation-hiding
- μ 보 μλμ μΈλΆ μΈκ³μ 보μ΄μ§ μμμΌ νλ μ΄λ ν μμ±μ΄λ νμλ₯Ό 보νΈνλ(λλ μ¨κΈ°λ) μν
- Car ν΄λμ€μμ car1μ΄λ car2μ²λΌ κ°μ μλ£νμΈ λ κ°μ²΄μ νμλ κ°μ μλ£νμ λͺ¨λ κ°μ²΄μ μμ±μ μ κ·Ό
- ν΄λμ€μ λͺ¨λ κ°μ²΄μ λν΄ νμ ν¨μλ λ¨ ν λ²λ§ μμ±
- μμ μμ main ν¨μλ car_t μμ± κ΅¬μ‘°μ²΄μ speedμ fuel μμ±μ μ½κ² μ κ·Ό
- car_t μλ£νμ λͺ¨λ μμ±μ΄ κ³΅κ° public μμ±
- κ³΅κ° μμ± λλ νμλ₯Ό κ°λ 건 λ°λμ§νμ§ λͺ»ν¨.
ꡬν implemantationμ μΈλΆ μ¬νμ΄ μ μΆ
- μ) μλμ°¨λ₯Ό κ°μνλ€λ νμ
- μ΄λ»κ² κ°μν μ μλμ§λ λ³λ‘ κΆκΈx
- κ°μ²΄ λ΄μλ κ°μ κ³Όμ μ μν₯μ μ£Όλ λ λ§μ λ΄λΆ μμ±
- μ¬μ©μ λ‘μ§μ μ΄λ¬ν μμ±μ΄ 보μ¬μΌ ν λ§λ ν μ΄μ λ μμ΅λλ€.
- μμ§ μ€νν°μ μ λ¬λλ μ λ₯λ μμ± (μ μ=μΉμ©12V, μ¬μ©μ°¨=24V) 100A,
- κ°μ²΄ μμ μκ² λΉκ³΅κ°
- κ°μ²΄ λ΄λΆμ νΉμ νμμλ μ μ©
- μ°μμ€μ μ°λ£λ₯Ό μ£Όμ νλ μΌμ λ΄λΆ νμ
- μ€νμ μΈλΆ μ¬ν(μλμ°¨κ° μ΄λ»κ² μλνλμ§ )μ μ μ‘°μ¬λ§λ€ λ€λ₯΄μ§λ§, μλμ°¨λ₯Ό κ°μν μ μλ€λ νμλ λͺ¨λ μλμ°¨ μ μ‘°μ¬κ° μ 곡
- μλμ°¨ κ°μν μ μλ νμλ₯Ό Car ν΄λμ€μ κ³΅κ° APl public API λλ κ³΅μ© μΈν°νμ΄μ€public interface
- κ°μ²΄μ κ³΅κ° μμ±κ³Ό νμμ μμ‘΄μ
- λ΄λΆ μμ±μ κ³΅κ° μμ±μΌλ‘ μ μΈν΄ μ μΆν λ€ λΉκ³΅κ°λ‘ λ°κΎΈλ©΄ μ’ μλ μ½λμ λΉλ κΉ¨μ§ μ μλ€.
- νμ νΈνμ± backward compatibilityμ΄ μμ
- 보μμ μΈ μ κ·Όλ²- μμ±μ 곡κ°λ‘ λμ΄μΌ ν ν©λ¦¬μ μΈ μ΄μ λ₯Ό μ°Ύμ λκΉμ§ κΈ°λ³Έμ μΌλ‘ λͺ¨λ μμ±μ λΉκ³΅κ°
- μμ±κ³Ό νμλ₯Ό κ°λ₯ν ν λΉκ³΅κ°
- μ¬λ¬ μ μ«κ°μ μ μ₯νλ List ν΄λμ€μ κ΄ν μμ
[μ½λ λ°μ€ 6-13] [μμ 6-3] List ν΄λμ€μ κ³΅μ© μΈν°νμ΄μ€ ExtreameC_examples_chapter6_3. h)
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
// File name: ExtremeC_examples_chapter6_3.h // Description: The header file which exposes public attributes // and behavior functions related to a list object. // As you see, the attribute structure does not // disclose any of its members. #ifndef EXTREME_C_EXAMPLES_CHAPTER_6_3_H #define EXTREME_C_EXAMPLES_CHAPTER_6_3_H #include <unistd.h> // The attribute structure with no disclosed attribute struct list_t; // Allocation function struct list_t* list_malloc(); // Constructor and destructor functions void list_init(struct list_t*); void list_destroy(struct list_t*); // Public behavior functions int list_add(struct list_t*, int); int list_get(struct list_t*, int, int*); void list_clear(struct list_t*); size_t list_size(struct list_t*); void list_print(struct list_t*); #endif
- μ΄ μ½λ λ°μ€λ μμ±μ λΉκ³΅κ°λ‘ λλ λ°©λ²μ 보μ¬μ€λλ€. main ν¨μλ₯Ό ν¬ν¨νλ νμΌμ²λΌ λ€λ₯Έ μμ€ νμΌμ΄ μμ ν€λλ₯Ό ν¬ν¨νλ κ²½μ°, list_t μλ£ν λ΄λΆμ μμ±μλ μ κ·Όνμ§ λͺ»ν©λλ€. μ΄μ λ κ°λ¨ν©λλ€. list λ μ μκ° μλ ꡬ쑰체 μ μΈμΌ λΏμ΄λ©° μ΄ κ΅¬μ‘°μ²΄μ νλμλ μ κ·Όν μ μμ΅λλ€. list_t λ‘λ λ³μλ₯Ό μ μΈν μλ μμ΅λλ€. μ΄λ¬ν λ°©μμΌλ‘ νμ€νκ² μ 보λ₯Ό μλν μ μμ΅λλ€.
- λ€μ νλ² λ§νμλ©΄ ν€λ νμΌμ λ§λ€κ³ λ΄λ³΄λ΄κΈ° μ μ 무μΈκ°λ₯Ό 곡κ°λ‘ λμ§ μλμ§λ₯Ό λ°λμ μ΄μ€ μ κ²ν΄μΌ ν©λλ€. κ³΅κ° νμ λλ κ³΅κ° μμ±μ λ ΈμΆνλ©΄ κ°μ²΄λ₯Ό μλ©Έ μν¬ λ μ’ μμ±μ΄ μκΉλλ€.
- λ€μ [μ½λ λ°μ€6-14]λ list_t μμ± κ΅¬μ‘°μ²΄μ μ€μ μ μλ₯Ό λνλ λλ€.
- ν€λ νμΌμ΄ μλλΌ μμ€ νμΌμμ μ μλμ΄μΌ νλ€λ μ μ λͺ μ¬νμΈμ.
[μ½λ λ°μ€ 6-14] [μμ 6-3] List ν΄λμ€μ μ μ (ExtremeC_examples_chapter6_3.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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
// File name: ExtremeC_examples_chapter6_3.c // Description: This file contains the actual definition of // the `list_t` attribute structure. It also // contains the implementations of the behavior // functions exposed by the header file. It has // also a private behavior functions which is // used internally. #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 // Define the alias type bool_t typedef int bool_t; // Define the type list_t typedef struct { size_t size; int* items; } list_t; // A private behavior which checks if list is full bool_t __list_is_full(list_t* list) { return (list->size == MAX_SIZE); } // Another private behavior which checks the index bool_t __check_index(list_t* list, const int index) { return (index >= 0 && index <= list->size); } // Allocates memory for a list object list_t* list_malloc() { return (list_t*)malloc(sizeof(list_t)); } // Constructor of a list object void list_init(list_t* list) { list->size = 0; // Allocates from the heap memory list->items = (int*)malloc(MAX_SIZE * sizeof(int)); } // Destructor of a list object void list_destroy(list_t* list) { // Deallocates the allocated memory free(list->items); } int list_add(list_t* list, const int item) { // The usage of the private behavior if (__list_is_full(list)) { return -1; } list->items[list->size++] = item; return 0; } int list_get(list_t* list, const int index, int* result) { if (__check_index(list, index)) { *result = list->items[index]; return 0; } return -1; } void list_clear(list_t* list) { list->size = 0; } size_t list_size(list_t* list) { return list->size; } void list_print(list_t* list) { printf("["); for (size_t i = 0; i < list->size; i++) { printf("%d ", list->items[i]); } printf("]\n"); }
- μ΄ μ½λ λ°μ€μμ λͺ¨λ μ μλ λΉκ³΅κ°μ λλ€. list_t κ°μ²΄λ₯Ό μ¬μ©ν μΈλΆ λ‘μ§μ μ½λμ μ€νμ λν΄μλ μ무κ²λ λͺ¨λ¦ λλ€.
- ν€λ νμΌμ΄ μΈλΆμ½λκ° μμ‘΄ν μ μΌν μ½λμ λλ€. μ΄ νμΌμ μ¬μ§μ΄ ν€λ νμΌμ‘°μ°¨ ν¬ν¨νμ§ μμ΅λλ€. μ μμ ν¨μ μκ·Έλμ² ν€λ νμΌμ μ μΈκ³Ό μΌμΉνκΈ°λ§ νλ©΄ λ©λλ€. κ·Έλ κΈ°λ ν΄λ μ μΈ λ° κ·Έμ ν΄λΉνλ μ μ μ¬μ΄μ νΈνμ±μ 보μ₯νλ―λ‘ μ΄λ κ² μμ±νκΈ°λ₯Ό κΆμ₯ν©λλ€.
- μ¬μ€ λ§μ»€λ λΉκ³΅κ° μ μλ₯Ό κ³΅κ° μ μΈμΌλ‘ κ°μ Έμμ μμ νλ‘κ·Έλ¨μ λ§λλ€.
- NOTE_ λΉκ³΅κ° νμ ν¨μμ λ€λ₯Έ ννλ²μ μ¬μ©ν μ μμ΅λλ€. μ΄λ¦μ λμ΄
__
λ₯Ό μ¬μ©νλ λ°©λ²μ λλ€. μλ₯Ό λ€λ ΄ __ check_index λ λΉκ³΅κ° ν¨μμ λλ€. λΉκ³΅κ° ν¨μμ λν μ μΈ λΆλΆλΆμ ν€λμ μμΌλ μ£ΌμνμΈμ.
- main ν¨μλ 리μ€νΈ κ°μ²΄ λ κ°λ₯Ό λ§λ€λ©°
- 첫 λ²μ§Έ 리μ€νΈ κ°μ²΄μ μ 보λ₯Ό μ λ ₯νκ³ ,
- λ λ²μ§Έ 리μ€νΈλ₯Ό μ¬μ©ν΄ 첫 λ²μ§Έ 리μ€νΈλ₯Ό λ€μ§μ΄μ μ μ₯
- λ§μ§λ§μΌλ‘λ 리μ€νΈ κ°μ²΄μ λ΄μ©μ μΆλ ₯
[μ½λ λ°μ€ 6-15 ][μμ 6-3 mainν¨μ ExtreameC_examples_chapter6_3_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 44 45 46 47 48 49
// File name: ExtremeC_examples_chapter6_3_main.c // Description: Contains the main function. The logics in // this file are only dependent on the // declarations made in the header file. #include <stdlib.h> #include "ExtremeC_examples_chapter6_3.h" int reverse(struct list_t* source, struct list_t* dest) { list_clear(dest); for (size_t i = list_size(source) - 1; i >= 0 ; i--) { int item; if(list_get(source, i, &item)) { return -1; } list_add(dest, item); } return 0; } int main(int argc, char** argv) { struct list_t* list1 = list_malloc(); struct list_t* list2 = list_malloc(); // Construction list_init(list1); list_init(list2); list_add(list1, 4); list_add(list1, 6); list_add(list1, 1); list_add(list1, 5); list_add(list2, 9); reverse(list1, list2); list_print(list1); list_print(list2); // Destruction list_destroy(list1); list_destroy(list2); free(list1); free(list2); return 0; }
- μ΄ μ½λ λ°μ€μμ mainκ³Ό reverse ν¨μλ ν€λ νμΌμμ μ μΈν λ΄μ©λ§μ ν λλ‘ μμ±νμ΅λλ€. μ¦, μ΄λ€ ν¨μλ List ν΄λμ€μ κ³΅κ° API (λλ κ³΅μ© μΈν°νμ΄μ€)λ§μ μ¬μ©ν©λλ€. μ΄ κ³΅κ° APIλ μμ± κ΅¬μ‘°μ²΄ list_t μ μ μΈκ³Ό νμ ν¨μμ κ΄ν κ²μ λλ€. μ΄λ μ’ μμ±μ μμ κ³ μ½λμ λ€λ₯Έ λΆλΆμΌλ‘λΆν° ꡬνμ μΈλΆ μ¬νμ μλ νλ μ’μ μ¬λ‘μ λλ€.
1 2 π‘ NOTE_ κ³΅κ° API λ₯Ό μ¬μ©νλ©΄ μ»΄νμΌν νλ‘κ·Έλ¨μ μμ±ν μλ μμ΅λλ€. νμ§λ§ λΉκ³΅κ° λΆμ ν΄λΉνλ κ°μ²΄ νμΌμ μ 곡νμ§ μκ±°λ ν¨κ» νμ§ μμΌλ©΄. μ€μ μμ νλ‘κ·Έλ¨μΌλ‘ λ³νν μ μμ΅λλ€.
- list_t κ°μ²΄μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ €λ©΄ list_malloc ν¨μκ° νμν©λλ€. κ·Έλ¦¬κ³ κ°μ²΄μμ ν λΉνλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νλ €λ©΄ free ν¨μλ₯Ό μ¬μ©ν©λλ€.
- μμ μμ μμ mallocμ μ§μ μ¬μ©ν μλ μμ΅λλ€. main ν¨μ μμμ mallocμ μ¬μ©ν λλ ν λΉμ νμν λ°μ΄νΈμ μ«μλ₯Ό sizeof(list_t )λ‘ μ λ¬ν΄μΌ ν©λλ€. νμ§λ§ λΆμμ ν νμμλ sizeofλ₯Ό μ¬μ©ν μ μμ΅λλ€.
- ν€λ νμΌμμ ν¬ν¨νλ list_t μλ£νμ λΆμμ ν νμ incomplete type μ λλ€. λ΄λΆ νλμ μ무 μ 보λ μ 곡νμ§ μλ λ¨μν μ μΈμΌ λΏμ΄κ³ , μ»΄νμΌν λ μ΄ μλ£νμ ν¬κΈ°λ₯Ό λͺ¨λ₯΄κΈ° λλ¬Έμ λλ€.
- μ€μ ν¬κΈ°λ ꡬνμ μΈλΆ μ¬νμ μκ² λλ λ§ν¬ μμλ§ κ²°μ λ©λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ list_mallocμ μ μν΄ sizeof(list_t) κ° κ²°μ λλ κ³³μ mallocμ μ¬μ©ν΄μΌ νμ΅λλ€.
μ Έλ°μ€ 6-1 [μμ 6-3] μ»΄νμΌνκΈ°
1 2
$ gee - e ExtremeC_examples_ehapter6_3.e -o private.o $ gee -e ExtremeC_examples_ehapter6_3_main.e -o main.o
- λΉκ³΅κ° λΆλΆμ privateλ‘ μ»΄νμΌνμΌλ©° main ν¨μλ main.o λ‘ μ»΄νμΌνμ΅λλ€. ν€λνμΌμ μ»΄νμΌνμ§ μλλ€λ μ μ κΈ°μ΅νμΈμ. ν€λ νμΌμ κ³΅κ° μ μΈμ main.a λͺ©μ νμΌμ ν¬ν¨λμμ΅λλ€.
- μ΄μ μ΄ λͺ©μ νμΌμ λͺ¨λ λ§ν¬ ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ main.o νλλ§μΌλ‘λ μ€ν κ°λ₯ν νλ‘κ·Έλ¨μ΄ λ μ μμ΅λλ€. main.o λ§μΌλ‘ μ€ν κ°λ₯ν νμΌμ λ§λ€λ €κ³ νλ©΄ λ€μκ³Ό κ°μ μ€λ₯κ° μκΉλλ€.
μ Έ λ°μ€ 6-2 main.o λ§μΌλ‘ [μμ 6-3] λ§ν¬νκΈ°
1 2 3 4 5 6 7 8 9 10 11
$ **gcc main.o -o ex6_3.out** main . o : In function ' reverse ' : ExtremeC_examples_ehapter6_3_main . e:( .text+0x27): undefined referenee to 'list_clear' β’ β’ β’ main .o: In function 'main': ExtremeC_examples_chapter6_3_main . c:( .text+0xaS): undefined reference to 'list_malloc' β’ β’ β’ collect2: error: ld returned 1 exit status $
- λ§μ»€κ° ν€λ νμΌμ μ μΈλ ν¨μμ μ μλ₯Ό μ°Ύμ μ μλ€κ³ ν©λλ€. μμ λ₯Ό λ§ν¬νλ μλ§μ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
μ Έ λ°μ€ 6-3 μμ 6-3 λ§ν¬νκ³ μ€ννκΈ°
1 2 3 4 5
$ gcc main.o private.o -o ex6_3.out $ ./ex6_3.out [4 6 1 5 ] [5 1 6 4 ] $
- List ν΄λμ€ λ€μμ λμ€λ ꡬνμ λ³κ²½νλ€λ©΄ λ¬΄μ¨ μΌμ΄ λ°μν κΉμ? λ°°μ΄μ μ¬μ©νλ λμ μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νλ€κ³ ν΄λ΄ μλ€. main.oλ₯Ό λ€μ λ§λ€ νμλ μμ΄ λ³΄μ λλ€. main.oκ° μ¬μ©νλ 리μ€νΈ ꡬν λ΄μ©κ³Ό λ 립μ μ΄κΈ° λλ¬Έμ λλ€. λ°λΌμ private2.o μ²λΌ μλ‘μ΄ κ΅¬νμ κ΄ν μλ‘μ΄ κ°μ²΄ νμΌλ§μ μ»΄νμΌνκ³ μμ±ν΄λ΄ μλ€. κ·Έλ° λ€μ λͺ©μ νμΌμ λ€μ λ§ν¬ν΄ μλ‘μ΄ μ€ν νμΌμ λ§λ€μ΄λ΄ λλ€.
μ Έλ° μ€ 6-4 List μ λ€λ₯Έ ꡬνμ μ¬μ©ν΄ [μμ 6-3] λ§ν¬νκ³ μ€ννκΈ°
1 2 3 4 5
$ gcc main.o private2.o -o ex6_3.out $ ./ ex6_3.out [4 6 1 5 ] [5 1 6 4 ] $
- μ¬μ©μ κ΄μ μμλ μ무κ²λ λ³νμ§ μμμ΅λλ€. νμ§λ§ κ·Όλ³Έμ μΈ κ΅¬νμ λ°λμμ΅λλ€. μ΄λ λλ¨ν μ±κ³Όμ΄λ©° νλ‘μ νΈμμ λ§μ΄ μ¬μ©λλμ κ·Όλ²μ λλ€.
- μλ‘μ΄ λ¦¬μ€νΈ ꡬνμ κ΄ν κ²½μ°μμ λ§ν¬ λ¨κ³λ₯Ό λ°λ³΅νκ³ μΆμ§ μλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ? κ·Έλλ λΉκ³΅κ° λͺ©μ νμΌμ ν¬ν¨νλ 곡μ λ¬μ΄λΈλ¬λ¦¬ (λλ . so νμΌ )λ₯Ό μ¬μ©ν©λλ€. κ·Έλ¬λ©΄ λ°νμ μ λμ μΌλ‘ λ‘λν μ μμΌλ©° μ€ν νμΌμ λ€μ λ§ν¬νμ§ μμλ λ©λλ€.