Post

🐒 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 파일 )λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 그러면 λŸ°νƒ€μž„ μ‹œ λ™μ μœΌλ‘œ λ‘œλ“œν•  수 있으며 μ‹€ν–‰ νŒŒμΌμ„ λ‹€μ‹œ λ§ν¬ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.
This post is licensed under CC BY 4.0 by the author.