Post

🐒 chap1. ν•„μˆ˜ μš”μ†Œ

⭐ λ©”λͺ¨λ¦¬

  • Cμ–Έμ–΄μ—μ„œ λ©”λͺ¨λ¦¬λŠ” μ™„μ „νžˆ μˆ˜λ™μœΌλ‘œ 관리

    • λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήν•˜κ±°λ‚˜, ν•΄μ œν•˜κΈ°

🀎 ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒ

  • μ‹€ν–‰νŒŒμΌμ„ μ—΄ λ•Œλ§ˆλ‹€ μš΄μ˜μ²΄μ œλŠ” μƒˆ ν”„λ‘œμ„ΈμŠ€ λ§Œλ“¦

    • ν”„λ‘œμ„ΈμŠ€ : 싀행쀑인 ν”„λ‘œκ·Έλž¨ (λ©”λͺ¨λ¦¬μ— λ‘œλ”©)
    • 고유의 ν”„λ‘œμ„ΈμŠ€ μ‹λ³„μž (PID) 가짐

      SIGTERM : μ’…λ£Œ μ‹ ν˜Έ (ν”„λ‘œμ„ΈμŠ€ μ²­μ†Œ)

      SIGINT : μΈν„°λŸ½νŠΈ μ‹ ν˜Έ (Ctrl + C 눌러 ν¬κ·ΈλΌμš΄λ“œ μ „λ°© ν”„λ‘œμ„ΈμŠ€λ‘œ 전달)

      SIGKILL : 킬 μ‹ ν˜Έ (ν”„λ‘œμ„ΈμŠ€ μ²­μ†Œν•˜μ§€ μ•Šκ³  κ°•μ œ μ’…λ£Œ)

  • ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 λ•Œ μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό κ°€μž₯ λ¨Όμ € ν• λ‹Ήν•œ λ‹€μŒ, 미리 μ •μ˜λœ λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜

    • ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒμ€ μ—¬λŸ¬ λΆ€λΆ„ (μ„Έκ·Έλ¨ΌνŠΈ)으둜 뢄할됨
      • μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 데이터 μ„Έκ·Έλ¨ΌνŠΈ (BSS)
      • 데이터 μ„Έκ·Έλ¨ΌνŠΈ
      • ν…μŠ€νŠΈ μ„Έκ·Έλ¨ΌνŠΈ
      • μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈ
      • νž™ μ„Έκ·Έλ¨ΌνŠΈ
    • 정적 λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒ
      • μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒμ—μ„œ λͺ‡λͺ‡ μ„Έκ·Έλ¨ΌνŠΈλŠ” ν† λŒ€κ°€ λ˜λŠ” μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ 직접 λ§Œλ“¦
      • μ†ŒμŠ€ μ½”λ“œλ₯Ό 컴파일 ν•  λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ— 미리 μž‘μ„±
    • 동적 λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒ
      • ν”„λ‘œμ„ΈμŠ€κ°€ λ‘œλ”©λ  λ•Œ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ™μ μœΌλ‘œ 생성
      • ν”„λ‘œκ·Έλž¨μ˜ λͺ…령어에 따라 μž‘μ„±
        • λ³€μˆ˜μ™€ 배열에 λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ή, ν”„λ‘œκ·Έλž¨μ˜ λ‘œμ§μ— 따라 λ³€μˆ˜μ™€ λ°°μ—΄ μˆ˜μ •

🀎 μŠ€νƒκ³Ό νž™

  • μŠ€νƒ
    • ν•¨μˆ˜ 호좜
    • μ†Œμœ μž ν”„λ‘œμ„ΈμŠ€λ§Œμ΄ 읽고 μˆ˜μ •ν•  κΆŒν•œμ„ κ°–λŠ” μ „μš© λ©”λͺ¨λ¦¬
      • 디버거 : 디버그 ν•˜λ €λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— λΆ™μ—¬μ„œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨
        • μ „μš© λ©”λͺ¨λ¦¬ 블둝 읽고 μˆ˜μ • κ°€λŠ₯
        • ν”„λ‘œκ·Έλž¨ λͺ…λ Ήμ–΄ μ‹€ν–‰ μˆœμ„œ μ œμ–΄ κ°€λŠ₯
    • μŠ€νƒμ˜ κ°€μž₯ μœ„μ— ν• λ‹Ήλœ 버퍼에 ν™•μΈλ˜μ§€ μ•Šμ€ 값을 μž‘μ„±ν•˜λŠ” 일은 취약점을 γ…—κ°„μ£Ό
      • 버퍼 μ˜€λ²„ν”Œλ‘œ β†’ μ΅μŠ€ν”Œλ‘œμž‡
    • 각 μŠ€νƒ λ³€μˆ˜λŠ” 고유의 μŠ€μ½”ν”„ κ°–κ³ , μŠ€μ½”ν”„λŠ” λ³€μˆ˜μ˜ 수λͺ… κ²°μ •
      • μŠ€νƒ λ³€μˆ˜ μ„ μ–Έν•  λ•Œλ§ˆλ‹€ μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈμ˜ κ°€μž₯ μœ—λΆ€λΆ„μ— ν• λ‹Ή
1
2
3
4
5
6
7
8
πŸ’‘ **μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈ**
βœ… μŠ€νƒ λ©”λͺ¨λ¦¬λŠ” 크기가 μ œν•œμ  (큰 객체 μ €μž₯ν•˜λŠ”λ° 쒋은 μž₯μ†Œ X)
βœ… μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈμ˜ μ£Όμ†ŒλŠ” μž‘μ•„μ§
βœ… μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ 관리 (ν• λ‹Ή 및 ν•΄μ œ λͺ¨λ‘ ν•΄λ‹Ή)
βœ… λͺ¨λ“  μŠ€νƒ λ³€μˆ˜λŠ” μŠ€μ½”ν”„λ₯Ό 가지며 μŠ€μ½”ν”„λŠ” λ³€μˆ˜μ˜ 수λͺ…을 κ²°μ •
βœ… ν¬μΈν„°λŠ” 계속 μŠ€μ½”ν”„ 내에 μ‘΄μž¬ν•˜λŠ” μŠ€νƒ λ³€μˆ˜λ§Œμ„ κ°€λ¦¬μΌœμ•Ό 함
βœ… μŠ€νƒ λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ ν•΄μ œλŠ” μžλ™μœΌλ‘œ μˆ˜ν–‰λ¨
βœ… ν˜„μž¬ μŠ€μ½”ν”„μ— μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜μ— λŒ€ν•œ ν¬μΈν„°λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ— 인자둜 전달될 수 있음
  • νž™
    • μžλ™μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬ 블둝을 갖지 μ•ŠμŒ
      • malloc, calloc, realloc 같은 ν•¨μˆ˜λ‘œ νž™ λ©”λͺ¨λ¦¬ 블둝 μ–»κΈ°
        • malloc : λ©”λͺ¨λ¦¬ ν• λ‹Ή
        • calloc : μ²­μ†Œ 및 ν• λ‹Ή
        • realloc : μ΄μ „μ˜ 블둝에 μžˆλŠ” 데이터 λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©° 이미 ν• λ‹Ήλœ 블둝을 μƒˆλ‘œμš΄ λΈ”λ‘μœΌλ‘œ ν™•μž₯함
        • free : λ©”λͺ¨λ¦¬ 블둝을 ν•΄μ œν•¨
        • valgrind : μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ©”λͺ¨λ¦¬ 문제λ₯Ό κ°μ‹œν•  수 이쓴 μœ μš©ν•œ ν”„λ‘œκ·Έλž¨
    • νž™μ€ λ©”λͺ¨λ¦¬ 크기가 크닀
      • 큰 객체 μ €μž₯ν•  수 있음
    • νž™ λ©”λͺ¨λ¦¬ λ‚΄ μ—μ„œ λ©”λͺ¨λ¦¬μ˜ ν• λ‹Ήκ³Ό ν•΄μ œλŠ” κ°œλ°œμžκ°€ 관리함
      • κ°œλ°œμžκ°€ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ , ν•΄μ œν•˜λŠ” 일은 μœ μΌν•œ κ°œμ²΄λΌλŠ” 의미
      • νž™ 블둝을 λΉ„μš°λŠ” 일은 가비지 컬렉터가 μˆ˜ν–‰ν•˜μ§€λ§Œ C κΈ°λ°˜μ—μ„œλŠ” μ—†μŒ
      • μ‹€νŒ¨ν•˜λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°œμƒ
    • νž™μ— ν• λ‹Ήλœ λ³€μˆ˜λŠ” μŠ€μ½”ν”„λ₯Ό μ „ν˜€ 갖지 μ•ŠμŒ
    • νž™ λ©”λͺ¨λ¦¬ λΈ”λ‘μ˜ μ£Όμ†Œλ₯Ό μ§€μ •ν•˜λ €λ©΄ ν¬μΈν„°λ§Œ μ‚¬μš©ν•  수 있음
    • νž™ μ„Έκ·Έλ¨ΌνŠΈλŠ” μ†Œμœ μž ν”„λ‘œμ„ΈμŠ€μ˜ μ „μš©μ΄λ―€λ‘œ κ²€μ‚¬ν•˜λ €λ©΄ 디버거λ₯Ό μ‚¬μš©ν•΄μ•Όν•¨
1
2
3
4
5
6
7
πŸ’‘ **νž™ λ©”λͺ¨λ¦¬**
βœ… νž™ λ©”λͺ¨λ¦¬ 할당에 μΉ˜λŸ¬μ•Ό ν•  λ‚˜λ¦„μ˜ λΉ„μš©μ΄ 있음
βœ… νž™ 곡간에 ν• λ‹Ήλœ λͺ¨λ“  λ©”λͺ¨λ¦¬ 블둝은 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œλ‚˜ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ 직전에 ν•΄μ œλ˜μ–΄μ•Ό 함
βœ… νž™ λ©”λͺ¨λ¦¬ 블둝은 μŠ€μ½”ν”„λ₯Ό 갖지 μ•ŠμœΌλ―€λ‘œ, λ°˜λ“œμ‹œ λ©”λͺ¨λ¦¬ 관리할 수 μžˆμ–΄μ•Ό 함
βœ… 각각의 νž™ λ©”λͺ¨λ¦¬ 블둝에 λŒ€ν•œ λ©”λͺ¨λ¦¬ 관리 μ „λž΅μ„ κ³ μˆ˜ν•΄μ•Ό 함
βœ… μ„ νƒν•œ μ „λž΅κ³Ό μ „λž΅μ— κ΄€ν•œ 가정은 블둝에 μ ‘κ·Όν•  λ•Œλ§ˆλ‹€ μ½”λ“œμ— κΈ°λ‘λ˜μ–΄μ•Ό 함
βœ… RAII 객체λ₯Ό μ‚¬μš©ν•΄ νž™ λ©”λͺ¨λ¦¬ 블둝과 같은 λ¦¬μ†ŒμŠ€ 관리 κ°€λŠ₯

⭐ 객체지ν–₯

πŸ’™ OOP와 μΊ‘μŠν™”

  • κ°œλ… : ν˜„μ‹€ μ„Έκ³„μ˜ κ°œμ²΄μ— κ΄€ν•œ μΈμ‹μœΌλ‘œ ν˜•μ„±
  • OOP
    • ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ μ™„μ „νžˆ 동적인 객체 λͺ¨λΈλ‘œ μ΄μ–΄μ§ˆ 일련의 λͺ…λ Ήμ–΄ λ§Œλ“ λ‹€
    • OOD (κ°μ œμ§€ν–₯ 섀계)
  • 객체
    • 두 개 μ΄μƒμ˜ 속성 λ˜λŠ” μ†μ„±μ˜ 집합을 κ°€μ§ˆ 수 있음
  • μƒνƒœ
    • 속성에 ν• λ‹Ήλœ 값을 총괄해 객체의 μƒνƒœ
    • λ‹¨μˆœνžˆ 객체에 μ—°κ²°λœ νŠΉμ • 속성에 μ†ν•˜λŠ” κ°’μ˜ λͺ©λ‘μœΌλ‘œ 이해됨

πŸ’™ 도메인

  • μ†Œν”„νŠΈμ›¨μ–΄ κΈ°λŠ₯을 κ³΅κ°œν•  경계λ₯Ό μ •μ˜ν•¨
  • 미리 μ •μ˜λœ ꡬ체적인 μš©μ–΄μ§‘μ„ μ‚¬μš©ν•΄ μž„λ¬΄λ₯Ό μˆ˜ν–‰ν•¨

πŸ’™ 객체의 생성 κ³„νš 방법

  • 빈 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ 일반적으둜 μ΅œμ†Œν•œμ˜ μ†μ„±μ˜ 집합을 κ°–λŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” 것
  • μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ 더 λ§Žμ€ 속성이 κ²°μ •λ˜κ³  좔가됨
  • 각각의 κ°μ²΄λŠ” λ³„λ„μ˜ 개체둜 취급됨
  • 속성이 미리 μ •ν•΄μ Έ μžˆμ–΄μ„œ μ‹€ν–‰ 도쀑에 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” 것
    • λŸ°νƒ€μž„ λ™μ•ˆ μ–΄λ– ν•œ 속성도 μΆ”κ°€λ˜μ§€ λͺ»ν•΄ κ°μ²΄λŠ” ꡬ쑰λ₯Ό μœ μ§€ν•¨
    • μ†μ„±κ°’λ§Œ λ³€κ²½ν•  수 있으며, 객첡 가변적일 λ•Œλ§Œ κ°€λŠ₯
    • λͺ¨λ“  속성을 μΆ”μ ν•˜λŠ” 미리 μ„€κ³„λœ 객체 ν…œν”Œλ¦Ώ λ˜λŠ” 클래슀 생성해야 함
  • λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ΄λŸ¬ν•œ 객체 ν…œν”Œλ¦Ώμ„ 클래슀라 함
  • μ°Έμ‘°
    • 객체의 값이 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ μ‹€μ œ μœ„μΉ˜λ₯Ό μ°Έμ‘°ν•˜λŠ”λ° μ‚¬μš©ν•¨
    • 객체와 μΈμŠ€ν„΄μŠ€λŠ” 같은 것

πŸ’™ μΊ‘μŠν™”

  • 객체λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μΊ‘μŠμ— μ„œλ‘œ μ—°κ΄€λœ 것을 μ§‘μ–΄λ„£λŠ”λ‹€
  • κ°μ²΄μ—μ„œ μ–΄λ–€ μ†μ„±μ΄λ‚˜ κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€κ³  λŠλ‚€ μˆœκ°„ λ§ˆμŒμ†μ—μ„œ μΊ‘μŠν™” ν•˜λŠ” 것
  • κ°μ²΄λŠ” μ†μ„±μ˜ 집합, κΈ°λŠ₯의 μ§‘ν•©μœΌλ‘œ λ§Œλ“€μ–΄μ§
  • 속성과 κΈ°λŠ₯ λ‘˜λ‹€ 객체 캑슐둜 μΊ‘μŠν™” λ˜μ–΄μ•Ό 함
  • 속성 μΊ‘μŠν™”
    • λͺ…μ‹œμ  μΊ‘μŠν™”λ₯Ό μ œκ³΅ν•¨
    • κ°œλ°œμžμ™€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ λ‘˜λ‹€ μΊ‘μŠν™”, 캑슐의 쑴재λ₯Ό μ•ˆλ‹€λŠ” 것
  • ν–‰μœ„ μΊ‘μŠν™”
    • λ©”μ„œλ“œλŠ” 객체 내에 μ €μž₯λ˜λŠ” 둜직, κΈ°λŠ₯, ν–‰μœ„μ„ λ‚˜νƒ€λƒ„
    • 속성은 값을 전달함
    • 암묡적 μΊ‘μŠν™”λŠ” λͺ…μ‹œμ μΈ ν–‰μœ„ μΊ‘μŠν™”λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμŒ
    • ν–‰μœ„ ν•¨μˆ˜λŠ” 인자 쀑 ν•˜λ‚˜λ‘œ λ°˜λ“œμ‹œ ꡬ쑰체 포인터λ₯Ό λ°›μ•„μ•Ό 함
      • 객체의 λ™μΌν•œ ν΄λž˜μŠ€μ— μ„œλ‘œ μ—°κ΄€λ˜μ–΄μžˆμŒμ„ λ‚˜νƒ€λ‚΄λ €λ©΄ μ μ ˆν•œ 이름이 μžˆμ–΄μ•Ό 함

πŸ’™ 정보 은닉

  • μ™ΈλΆ€ 세계에 보이지 μ•Šμ•„μ•Ό ν•˜λŠ” μ–΄λ– ν•œ μ†μ„±μ΄λ‚˜ ν–‰μœ„λ₯Ό λ³΄ν˜Έν•˜λŠ” μ—­ν• 
    • μ™ΈλΆ€ 세계 : 객체의 ν–‰μœ„μ— μ†ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μ½”λ“œ
  • λΉ„κ³΅κ°œ ν–‰μœ„ ν•¨μˆ˜λŠ” __접두어 뢙인닀

⭐ 1.1 μ „μ²˜λ¦¬κΈ° μ§€μ‹œμž

μ „μ²˜λ¦¬ : preprocssing

μˆ˜ν–‰: 일련의 μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•΄ ν†΅μ œν•˜κ³  영ν–₯을 쀌

C μ§€μ‹œμž: 헀더와 μ†ŒμŠ€ νŒŒμΌμ—μ„œ #으둜 μ‹œμž‘ν•˜λŠ” μ½”λ“œ(맀크둜, 쑰건뢀 컴파일)

1.1.1 맀크둜

πŸ’™ 맀크둜의 ν™œμš©

  • μƒμˆ˜ μ •μ˜ν•˜κΈ°
  • C ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜κΈ°
  • 루프 ν’€κΈ°
  • 헀더 κ°€λ“œ
  • μ½”λ“œ 생성
  • 쑰건뢀 컴파일

πŸ’™ 맀크둜 μ •μ˜ν•˜κΈ°

#define μ§€μ‹œμžλ₯Ό μ΄μš©ν•΄ μ •μ˜: 각 λ§€ν¬λ‘œλŠ” 이름과 νŒŒλΌλ―Έν„°, 값을 가짐

#undef μ§€μ‹œμžλ‘œ μ •μ˜λ₯Ό 제거

  • 예제 1-1

    1
    2
    3
    4
    5
    6
    7
    8
    
    #define ABC 5
    
    int main(int argc, char** argv) {
    	int x = 2;
    	int y = ABC;
    	int z = x + y;
    	return 0;
    }
    

    ABCλŠ” λ³€μˆ˜κ°€ μ•„λ‹Œ 맀크둜, μ•„λž˜λŠ” 맀크둜 ν™•μž₯ ν›„ μ½”λ“œ

    1
    2
    3
    4
    5
    6
    
    int main(int argc, char** argv) {
    	int x = 2;
    	int y = 5;
    	int z = x + y;
    	return 0;
    }
    
  • 예제 1-2

    1
    2
    3
    4
    5
    6
    7
    8
    
    #define ADD(a, b) a + b
    
    int main(int argc, char** argv) {
      int x = 2;
      int y = 3;
      int z = ADD(x, y);
      return 0;
    }
    

    ADDλŠ” ν•¨μˆ˜κ°€ μ•„λ‹Œ μœ μ‚¬ ν•¨μˆ˜ 맀크둜, μ•„λž˜λŠ” μ „μ²˜λ¦¬ ν›„ μ½”λ“œ

    1
    2
    3
    4
    5
    6
    
    int main(int argc, char** argv) {
      int x = 2;
      int y = 3;
      int z = x + y;
      return 0;
    }
    

λ§€ν¬λ‘œλŠ” 컴파일 단계 μ΄μ „μ—λ§Œ 쑴재, μ΄λ‘ μ μœΌλ‘œλŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ§€ν¬λ‘œμ— κ΄€ν•΄ λͺ¨λ₯Έλ‹€λŠ” 뜻

but ,ν˜„λŒ€μ˜ C μ»΄νŒŒμΌλŸ¬λŠ” μ „μ²˜λ¦¬ 단계λ₯Ό μ•Œκ³  있음

πŸ’™ κ°€λ³€ 인자 맀크둜

  • 예제 1-5

    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
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define VERSION "2.3.4"
    
    #define LOG_ERROR(format, ...) \
      fprintf(stderr, format, __VA_ARGS__)
    
    int main(int argc, char** argv) {
    
      if (argc < 3) {
        LOG_ERROR("Invalid number of arguments for version %s\n.",
                VERSION);
        exit(1);
      }
    
      if (strcmp(argv[1], "-n") != 0) {
        LOG_ERROR("%s is a wrong param at index %d for version %s.",
                argv[1], 1, VERSION);
        exit(1);
      }
    
      // ...
    
      return 0;
    }
    

    VA_ARGS μ‹λ³„μž: 아직 λ§€κ°œλ³€μˆ˜λ‘œ ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ μž…λ ₯ 인수둜 λͺ¨λ‘ ꡐ체 fprintf ν•¨μˆ˜λŠ” 파일 μ„œμˆ μž stderrλ₯Ό μž‘μ„±, μ•„λž˜λŠ” μ΅œμ’… 좜λ ₯ μ½”λ“œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    int main(int argc, char** argv) {
        if (argc < 3) {
            fprintf(stderr, "Invalid number of arguments for version %s\n.", "2.3.4");
            exit(1);
        }
        if (strcmp(argv[1], "-n") != 0) {
            fprintf(stderr, "%s is a wrong param at index %d for version %s.", argv[1],
                1, "2.3.4");
            exit(1);
        }
        // ...
        return 0;
    }
    
  • 예제 1-6

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    #include <stdio.h>
    
    #define LOOP_3(X, ...) \
      printf("%s\n", #X);
    
    #define LOOP_2(X, ...) \
      printf("%s\n", #X); \
      LOOP_3(__VA_ARGS__)
    
    #define LOOP_1(X, ...) \
      printf("%s\n", #X); \
      LOOP_2(__VA_ARGS__)
    
    #define LOOP(...) \
      LOOP_1(__VA_ARGS__)
    
    int main(int argc, char** argv) {
    
      LOOP(copy paste cut)
      LOOP(copy, paste, cut)
      LOOP(copy, paste, cut, select)
    
      return 0;
    }
    

    C++ Boost ν”„λ ˆμž„μ›Œν¬μ˜ foreach μ°Έκ³ ν•˜κΈ°, μ•„λž˜λŠ” μ΅œμ’… μ½”λ“œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    int main(int argc, char** argv) {
    
      printf("%s\n", "copy paste cut"); printf("%s\n", "");
      printf("%s\n", "");
      printf("%s\n", "copy"); printf("%s\n", "paste"); printf("%s\n", "cut");
      printf("%s\n", "copy"); printf("%s\n", "paste"); printf("%s\n", "cut");
    
      return 0;
    }
    

    루프 ν’€κΈ°: λͺ…λ Ήμ–΄λ₯Ό 루프에 넣지 μ•Šκ³  ν•˜λ‚˜ν•˜λ‚˜ λ‘λŠ” 것 μœ„ λ§€ν¬λ‘œλŠ” 리슀트 μš”μ†Œλ₯Ό μ„Έ κ°œκΉŒμ§€λ§Œ 처리

πŸ’™ 맀크둜의 μž₯점과 단점

λ§€ν¬λ‘œλŠ” 컴파일 ν›„ ν•œ μ€„μ˜ κΈ΄ μ½”λ“œλ‘œ κ΅μ²΄λ˜μ–΄ λͺ¨λ“ˆμ„±x

C ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ 맀크둜 λŒ€μ‹  C ν•¨μˆ˜λ‘œ μž‘μ„±

μ†Œν”„νŠΈμ›¨μ–΄ 섀계와 디버깅 문제

루프 풀기와 μ„±λŠ₯ μ΅œμ ν™”

DSL μ •μ˜

1.1.2 쑰건뢀 컴파일

쑰건뢀 컴파일 μ§€μ‹œμž λͺ©λ‘

  • #ifdef
  • #ifndef
  • #else
  • #elif
  • #endif

⭐ 1.2 포인터 λ³€μˆ˜

1.2.1 문법

포인터: λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ‹¨μˆœν•œ λ³€μˆ˜

  • 예제 1-9
    1
    2
    3
    4
    5
    6
    7
    
    int main(int argc, char** argv) {
      int var = 100;
      int* ptr = 0;
      ptr = &var;
      *ptr = 200;
      return 0;
    }
    

    널 포인터 μ„ μ–Έ, μ°Έμ‘° μ—°μ‚°μž&, μ—­μ°Έμ‘° μ—°μ‚°μž* NULL 맀크둜 μ‚¬μš©: λ³€μˆ˜μ™€ 포인터λ₯Ό 더 μ‰½κ²Œ ꡬ뢄

1.2.2 포인터 λ³€μˆ˜μ˜ μ‚°μˆ μ—°μ‚°

μ‚°μˆ μ—°μ‚° 간격: 포인터가 1μ”© 증감할 λ•Œ μ›€μ§μ΄λŠ” λ°”μ΄νŠΈμ˜ 숫자, C μžλ£Œν˜•μ— μ˜ν•΄ 결정됨

  • 예제 1-10

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include <stdio.h>
    
    int main(int argc, char** argv) {
      int var = 1;
    
      int* int_ptr = NULL; // 포인터λ₯Ό λ„λ‘œ λ§Œλ“€κΈ°
      int_ptr = &var;
    
      char* char_ptr = NULL;
      char_ptr = (char*)&var;
    
      printf("Before arithmetic: int_ptr: %u, char_ptr: %u\n",
              (unsigned int)int_ptr, (unsigned int)char_ptr);
    
      int_ptr++;    // 일반적으둜 μ‚°μˆ μ—°μ‚° 간격은 4λ°”μ΄νŠΈ
      char_ptr++;   // 1λ°”μ΄νŠΈμ˜ μ‚°μˆ μ—°μ‚° 간격
    
      printf("After arithmetic: int_ptr: %u, char_ptr: %u\n",
              (unsigned int)int_ptr, (unsigned int)char_ptr);
    
      return 0;
    }
    

    μ‹€ν–‰ κ²°κ³Ό μ •μˆ˜ ν¬μΈν„°μ˜ μ—°μ‚° 간격은 4λ°”μ΄νŠΈ, λ¬Έμžμ—΄ ν¬μΈν„°λŠ” 1λ°”μ΄νŠΈ

1.2.3 μ œλ„€λ¦­ 포인터

μ œλ„€λ¦­ 포인터: void* μžλ£Œν˜•μ˜ 포인터, μ—­μ°Έμ‘° λΆˆκ°€λŠ₯

  • 예제 1-13

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    #include <stdio.h>
    
    int main(int argc, char** argv) {
     int var = 9;
     int* ptr = &var;
     void* gptr = ptr;
    
     printf("%d\n", *gptr);
    
     return 0;
    }
    

    μ œλ„€λ¦­ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜λ©΄ 컴파일 였λ₯˜κ°€ 생성됨

1.2.4 ν¬μΈν„°μ˜ 크기

μ•„ν‚€ν…μ²˜μ— 따라 ν¬μΈν„°μ˜ 크기가 닀름

λŒ€μƒ μ•„ν‚€ν…μ²˜μ—μ„œ sizeof ν•¨μˆ˜ μ‚¬μš©

1.2.5 ν—ˆμƒ 포인터

좩돌 λ˜λŠ” μ„Έκ·Έλ©˜ν…Œμ΄μ…˜ 였λ₯˜ λ°œμƒ

  • 예제 1-15

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    #include <stdio.h>
    
    int* create_an_integer(int default_value) {
      int var = default_value;
      return &var;
    }
    
    int main() {
      int* ptr = NULL;
      ptr = create_an_integer(10);
      printf("%d\n", *ptr);
      return 0;
    }
    

    μ„Έκ·Έλ©˜ν…Œμ΄μ…˜ 였λ₯˜ 상황, ptr 포인터가 할당이 ν•΄μ œλœ var의 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 가리킴(ν—ˆμƒ 포인터)

⭐ 1.3 ν•¨μˆ˜

β˜‘οΈ ν•¨μˆ˜μ˜ ꡬ쑰

ν•¨μˆ˜: 이름과 μž…λ ₯ λ§€κ°œλ³€μˆ˜μ˜ λͺ©λ‘, 좜λ ₯ 결과의 λͺ©λ‘μ„ 가진 논리 μƒμž

C μ–Έμ–΄μ—μ„œ ν•¨μˆ˜λŠ” 단 ν•˜λ‚˜μ˜ κ°’λ§Œμ„ λ°˜ν™˜

λΈ”λ‘œν‚Ή ν•¨μˆ˜: 호좜된 ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ–΄μ•Όλ§Œ λ°˜ν™˜κ°’μ„ 호좜자 ν•¨μˆ˜κ°€ 받을 수 있음

λ…ΌλΈ”λ‘œν‚Ή ν•¨μˆ˜: 콜백 λ©”μ»€λ‹ˆμ¦˜, 비동기 ν•¨μˆ˜, 사건 기반 ν”„λ‘œκ·Έλž˜λ°(EDP)

β˜‘οΈ μ„€κ³„μ˜ μ€‘μš”μ„±

λ‘œμ§μ„ μž‘μ„± ν›„ λ‹€μ–‘ν•œ κ³³μ—μ„œ μ—¬λŸ¬ 번 μ‚¬μš© κ°€λŠ₯

좔상화: 기쑴의 λ‹€λ₯Έ λ‘œμ§μœΌλ‘œλΆ€ν„° 일뢀λ₯Ό μˆ¨κΉ€

β˜‘οΈ μŠ€νƒ 관리

μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈ β†’ λͺ¨λ“  지역 λ³€μˆ˜, λ°°μ—΄, ꡬ쑰체가 ν• λ‹Ήλ˜λŠ” κΈ°λ³Έ λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜.

μŠ€νƒ ν”„λ ˆμž„ β†’ μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈμ˜ κ°€μž₯ μœ„μ— 놓이고, ν•¨μˆ˜ 둜직이 μ‹€ν–‰λ©λ‹ˆλ‹€. 호좜이 λλ‚˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ€ 제거되며 직전 호좜 ν•¨μˆ˜λ‘œ 계속 μ΄μ–΄μ§‘λ‹ˆλ‹€.

  • μŠ€νƒ ν”„λ ˆμž„ μ˜ˆμ‹œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    int main()
    {
    	func1();
    }
    
    void func1()
    {
    	func2();
    }
    
    void func2()
    {
    
    }
    

μŠ€νƒ μ˜€λ²„ν”Œλ‘œ β†’ μŠ€νƒμ—μ„œλŠ” λ©”λͺ¨λ¦¬κ°€ ν•œμ •μ μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜ ν˜ΈμΆœμ„ λ„ˆλ¬΄ 많이 μ‹€ν–‰ν•΄ μŠ€ν… ν”„λ ˆμž„μ˜ λͺ¨λ“  μŠ€νƒ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό λ‹€ 써버린 κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€.

β˜‘οΈ 값에 μ˜ν•œ 전달 vs 참쑰에 μ˜ν•œ 전달

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
    
    #include <stdio.h>
    
    void swap(int, int);
    
    int main(void)
    {
    	int a = 5, b = 3;
    	printf("before) a = %d, b = %d\n", a, b);
    	swap(a, b);
    	printf("after) a= %d , b = %d\n", a, b);
    	return 0;
    }
    
    void swap(int num1, int num2)
    {
    	int temp = num1;
    	num1 = num2;
    	num2 = temp;
    
    	printf("swap) a = %d , b = %d\n", num1, num2);
    }
    
    /******************************************************
    before) a = 5, b = 3
    swap) a = 3 , b = 5
    after) a= 5 , b = 3
    *******************************************************/
    

포인터λ₯Ό λ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 것이 포인터에 μ˜ν•œ μ „λ‹¬μž…λ‹ˆλ‹€.

  • 포인터에 μ˜ν•œ ν•¨μˆ˜ 호좜의 예

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    #include <stdio.h>
    
    void func(int* a)
    {
    	int b = 9;
    	*a = 5;     //포인터 μ—­μ°Έμ‘°
    	a = &b;
    }
    
    int main(void)
    {
    	int x = 3;
    	int* xptr = &x;
    	printf("the value before the call = %d \n", x);
    	printf("pointer value before the call = %p\n", xptr);
    	func(xptr);
    	printf("the value after the call = %d \n", x);
    	printf("pointer value after the call=%p \n", xptr);
    	return 0;
    }
    
    /******************************************************
    the value before the call = 3
    pointer value before the call = 0000007032AFF624
    the value after the call = 5
    pointer value after the call=0000007032AFF624
    *******************************************************/
    

    μœ„μ˜ κ²°κ³Όλ₯Ό 보면 ν¬μΈν„°μ˜ 값은 ν•¨μˆ˜ 호좜 이후에도 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” 포인터가 값에 μ˜ν•œ 전달 인수둜 μ „λ‹¬λ˜μ—ˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜λ©΄ ν˜ΈμΆœν•˜λŠ” μͺ½μ˜ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μˆ˜μ •ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

⭐ 1.4 ν•¨μˆ˜ 포인터

β˜‘οΈ ν•¨μˆ˜ 포인터

β†’ ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λ©° ν•¨μˆ˜λ₯Ό κ°„μ ‘μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

β†’ μ΄λ‘œμΈν•΄ 각각의 κΈ°λŠ₯듀을 νŒŒμΌλ³„λ‘œ λ‚˜λ‰˜μ–΄ λ†“λŠ” μž‘μ—…μΈ λͺ¨λ“ˆν™”κ°€ κ°€λŠ₯ν•΄ μ‘ŒμŠ΅λ‹ˆλ‹€.

1
2
3
4
ν•¨μˆ˜ 포인터 λ³€μˆ˜ μ„ μ–Έ = int (*fptr) (int);
int - ν•΄λ‹Ή ν•¨μˆ˜μ˜ λ°˜ν™˜ν˜•
(*fptr) - 포인터 λ³€μˆ˜
(int) - ν•΄λ‹Ήν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ˜ ν˜•νƒœ
  • λ‹€λ₯Έ ν•¨μˆ˜ μ—¬λŸ¬ 개λ₯Ό ν˜ΈμΆœν•˜λŠ” ν•˜λ‚˜μ˜ ν•¨μˆ˜ 포인터

    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
    
    #include <stdio.h>
    
    int sum(int a, int b)     // νƒ€μž… λ³„μΉ­μœΌλ‘œ ν•΄λ‘λŠ” 편이 μ’‹μŠ΅λ‹ˆλ‹€.
    {
    	return a + b;
    }
    
    int subtract(int a, int b)
    {
    	return a - b;
    }
    
    int main()
    {
    
    	int(*func_ptr)(int, int);
    	func_ptr = NULL;          // ν•¨μˆ˜ 포인터도 NULL둜 μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£Όμ–΄μ•Όν•©λ‹ˆλ‹€.
    
    	func_ptr = &sum;
    	int result = func_ptr(5, 4);
    	printf("Sum = %d\n", result);
    
    	func_ptr = &subtract;
    	result = func_ptr(5, 4);
    	printf("subtract = %d\n", result);
    
    	return 0;
    }
    
    Sum = 9
    subtract = 1
    
  • μ—¬λŸ¬κ°œμ˜ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” ν•˜λ‚˜μ˜ ν•¨μˆ˜ 포인터

    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
    
    #include <stdio.h>
    
    typedef int bool_t;
    typedef bool_t(*less_than_func_t)(int, int);
    
    bool_t less_than(int a, int b)
    {
    	return a < b ? 1 : 0;
    }
    
    bool_t less_than_modular(int a, int b)
    {
    	return (a % 5) < (b % 5) ? 1 : 0;
    }
    
    int main(void)
    {
    	less_than_func_t func_ptr = NULL;
    
    	func_ptr = &less_than;
    	bool_t result = func_ptr(3, 7);
    	printf("%d\n", result);
    
    	func_ptr = &less_than_modular;
    	result = func_ptr(3, 7);
    	printf("%d\n", result);
    	return 0;
    }
    
    1
    0
    

⭐ 1.5 ꡬ쑰체

β˜‘οΈ μ™œ ꡬ쑰체인가?

β†’ μ›μ‹œ μžλ£Œν˜• (PDT) = 자료ꡬ쑰λ₯Ό 섀계할 수 있고, μ•Œκ³ λ¦¬μ¦˜μ„ μž‘μ„± ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ex) int, double

β†’ μ‚¬μš©μž μ •μ˜ μžλ£Œν˜• (UDT) = 직접 μ •μ˜ν•œ μžλ£Œν˜•μ΄ ν•„μš”ν•˜κ³ , ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ μžλ£Œν˜•μœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•Šμ„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. struct ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

ex) ꡬ쑰체

(κ΅¬μ‘°μ²΄λŠ” ν•˜λ‚˜ μ΄μƒμ˜ λ³€μˆ˜λ₯Ό ν•˜λ‚˜λ‘œ 묢을 수 μžˆλŠ” 볡합 μžλ£Œν˜•μ΄λ―€λ‘œ κΈ°λ³Έ μžλ£Œν˜• λ³€μˆ˜λ₯Ό λ¬Άμ–΄μ„œ μƒˆλ‘œμš΄ μžλ£Œν˜•μ„ λ§Œλ“  것이기 λ•Œλ¬Έμ— μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μœΌλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.)

β†’ λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

β˜‘οΈ μ™œ μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μΈκ°€?

같은 λŒ€μƒμ— μ„œλ‘œ μ—°κ΄€λœ 속성을 그룹으둜 λ¬ΆλŠ”κ²ƒμ΄ 가독성이 μ’‹μŠ΅λ‹ˆλ‹€. 더 κ³ μˆ˜μ€€μ˜ 둜직, 인간 μˆ˜μ€€μ˜ 둜직과 μΆ©λΆ„νžˆ λΉ„μŠ·ν•˜κ²Œ 문제λ₯Ό λΆ„μ„ν•˜λ €λ©΄ μƒˆλ‘œμš΄ μžλ£Œν˜•μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

ex) λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 -은행(고객, μž”κ³ , 돈, ν˜„κΈˆ, μ§€λΆˆ) κ°œλ…μ„ λ§ˆμ£Όν•˜κ³ , 은행 λ‘œμ§μ„ κ°œλ°œν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°œλ°œμžμ™€ λΉ„μ¦ˆλ‹ˆμŠ€ λΆ„μ„κ°€λŠ” ν˜‘λ ₯ν•˜λ©° κ·œμΉ™, 둜직, μš©μ–΄μ§‘λ“±μ„ κ³΅μœ ν•΄μ•Όν•©λ‹ˆλ‹€.

β˜‘οΈ ꡬ쑰체의 μ—­ν• 

κ΅¬μ‘°μ²΄λŠ” ν•˜λ‚˜μ˜ ν†΅ν•©λœ νƒ€μž…μ•„λž˜ κ΄€λ ¨λœ 값을 κ°­μŠν™” ν•©λ‹ˆλ‹€.

ex) color_t (red, green,blue)

1
2
3
4
5
struct color_t {
	int red;
	int green;
	int blue;
};

β†’ μƒˆλ‘œμš΄ μžλ£Œν˜• μ•„λž˜μ— μ„œλ‘œ 관련이 μžˆλŠ” ν•„λ“œλ₯Ό 그룹으둜 λ¬ΆλŠ” μΊ‘μŠν™” ν•©λ‹ˆλ‹€. 그리고 λ‚˜μ„œ ν•„μš”ν•œ λ³€μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ 이 μƒˆλ‘œμš΄ μžλ£Œν˜•μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

β˜‘οΈ λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒ

λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒμ΄ ν•„μš”ν•œ 이유 β†’ 값은 λ©”λͺ¨λ¦¬μ— μ €μž₯되고, cpuλŠ” 이 값을 μΆ©λΆ„νžˆ λΉ λ₯΄κ²Œ 읽고 μ“Έ 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

  • ꡬ쑰체 λ³€μˆ˜μ— ν• λ‹Ήλœ λ°”μ΄νŠΈ 수 좜λ ₯ν•˜κΈ°

    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
    
    #include <stdio.h>
    
    struct sample_t {
        char first;
        char second;
        char third;
        short fourth;
    };
    
    void print_size(struct sample_t* var) {
        printf("Size: %lu bytes\n", sizeof(*var));
    }
    
    void print_bytes(struct sample_t* var) {
        unsigned char* ptr = (unsigned char*)var;
        for (int i = 0; i < sizeof(*var); i++, ptr++) {
            printf("%d ", (unsigned int)*ptr);
        }
        printf("\n");
    }
    
    int main(int argc, char** argv) {
        struct sample_t var;
        var.first = 'A';
        var.second = 'B';
        var.third = 'C';
        var.fourth = 765;
        print_size(&var);
        print_bytes(&var);
        return 0;
    }
    
    Size: 6 bytes
    65 66 67 0 253 2
    

    sizeof(sample_t)λŠ” 6λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • charν˜• 3개 shortν˜• 1개 총 5λ°”μ΄νŠΈ μž…λ‹ˆλ‹€. μ΄λŠ” λ©”λͺ¨λ¦¬ 정렬을 μœ„ν•΄ λ°”μ΄νŠΈ 67뒀에 0이 보이게 ν•©λ‹ˆλ‹€. 0λ°”μ΄νŠΈλŠ” ν˜„μž¬ μ›Œλ“œ(cpuκ°€ λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•  λ•Œ μ½λŠ” νŠΉμ • λ°”μ΄νŠΈμ˜ 수)λ₯Ό μ™„μ„±ν•˜κΈ° μœ„ν•΄ μΆ”κ°€λ˜λ©°, λ„€ 번째 ν•„λ“œκ°€ λ‹€μŒ μ›Œλ“œμ—μ„œ μ‹œμž‘ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
    • μ΄λ•Œ λ©”λͺ¨λ¦¬ μ •λ ¬μ΄λž€ μ‹œμž‘ν•˜λŠ” λ°”μ΄νŠΈκ°€ μ›Œλ“œμ˜ μ‹œμž‘μ μ— μžˆμ„ λ•Œ, 이 λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬μ— μ •λ ¬ λ˜μ—ˆλ‹€κ³  ν•©λ‹ˆλ‹€. ex) charν˜•μΈ first, second, thirdλŠ” 각각 1λ°”μ΄νŠΈμ΄λ©° 이듀은 ꡬ쑰체 λ ˆμ΄μ•„μ›ƒμ˜ 첫번째 μ›Œλ“œμ— νƒ‘μž¬ λ©λ‹ˆλ‹€. 이후 fouth λŠ” 2λ°”μ΄νŠΈ μž…λ‹ˆλ‹€. 만일 λ©”λͺ¨λ¦¬ 정렬이 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 첫번째 λ°”μ΄νŠΈλŠ” 첫번째 μ›Œλ“œμ˜ λ§ˆμ§€λ§‰ λ°”μ΄νŠΈκ°€ 되게 λ©λ‹ˆλ‹€.

      1
      
      이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 첫번째 μ›Œλ“œλŠ” 0λ°”μ΄νŠΈ ν•˜λ‚˜κ°€ νŒ¨ν‚Ή(λ©”λͺ¨λ¦¬ 값을 μ •λ ¬)λ˜μ–΄ μžˆλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      
    • λ©”λͺ¨λ¦¬ 정렬은 기본적으둜 ν™œμ„±ν™”κ°€ λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

β˜‘οΈ 쀑첩 ꡬ쑰체

볡합 μžλ£Œν˜• = μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μ΄κ³ , λͺ‡ 개의 ꡬ쑰체λ₯Ό μ€‘μ²©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

  • λͺ‡κ°€μ§€ 쀑첩 ꡬ쑰체

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    #include <stdio.h>
    
    typedef struct {
    	int x;			//4byte
    	int y;			//4byte
    }point_t;			//8byte
    
    typedef struct {
    	point_t center;	//8byte
    	int radius;		//4byte
    }circle_t;			//12byte
    
    typedef struct {
    	point_t start;	//8byte
    	point_t end;	//8byte
    }line_t;			//16byte
    

    3개의 ꡬ쑰체인 point_t와 circle_t, line_tκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. point_t κ΅¬μ‘°μ²΄λŠ” 였직 μ›μ‹œμžλ£Œν˜•μœΌλ‘œλ§Œ κ΅¬μ„±λœ λ‹¨μˆœν•œ μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μ΄μ§€λ§Œ λ‹€λ₯Έ ꡬ쑰체듀은 point_t μžλ£Œν˜•μ˜ λ³€μˆ˜λ₯Ό ν¬ν•¨ν•œ 볡합 μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μž…λ‹ˆλ‹€.

β˜‘οΈ ꡬ쑰체 포인터

β†’ μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μ˜ ν¬μΈν„°λŠ” μ›μ‹œ μžλ£Œν˜•μ˜ 포인터와 λ™μΌν•©λ‹ˆλ‹€.

β†’ ꡬ쑰체 λ³€μˆ˜ 포인터가 ꡬ쑰체 λ³€μˆ˜μ˜ 첫 번째 ν•„λ“œμ˜ μ£Όμ†Œλ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€.

  • λ©”λͺ¨λ¦¬μ—μ„œ λ™μΌν•œ λ°”μ΄νŠΈ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ„Έ 가지 μžλ£Œν˜•μœΌλ‘œλΆ€ν„° μ–»λŠ” 3개의 포인터

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include <stdio.h>
    
    typedef struct {
    	int x;
    	int y;
    }point_t;
    
    typedef struct {
    	point_t center;
    	int raduus;
    }circle_t;
    
    int main(void)
    {
    	circle_t c;
    
    	circle_t* p1 = &c;
    	point_t* p2 = (point_t*)&c;
    	int* p3 = (int*)&c;
    
    	printf("p1 = %p\n", (void*)p1);
    	printf("p2 = %p\n", (void*)p2);
    	printf("p3 = %p\n", (void*)p3);
    	return 0;
    }
    
    p1 = 00000039EEB9F738
    p2 = 00000039EEB9F738
    p3 = 00000039EEB9F738
    

    point_t와 circle_t μžλ£Œν˜•μ˜ ν¬μΈν„°λŠ” ꡬ쑰체의 λ³€μˆ˜μ˜ 첫번째 ν•„λ“œμΈ x의 μ£Όμ†Œλ₯Ό κ°€λ¦¬μΌ°μŠ΅λ‹ˆλ‹€. typedefλ₯Ό μ‚¬μš©ν•˜λ©΄ ꡬ쑰체의 μƒˆ 별칭 νƒ€μž…μ„ μ„ μ–Έ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 좔후에 struct ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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