Skip to content

Latest commit

Β 

History

History
110 lines (81 loc) Β· 4.06 KB

File metadata and controls

110 lines (81 loc) Β· 4.06 KB

Function

Component

  • argument(=parameter)

  • operation

  • return

  • declaration > invoke(=call)

// 이 경우 return의 결과둜 식(expression)이 λ°˜ν™˜λœλ‹€.
int add(int a, int b){return a+b;}

Signature

  • CλŠ” ν•¨μˆ˜λ₯Ό κ΅¬λ³„ν•˜λŠ” μœ μΌν•œ μ‹λ³„μžκ°€ ν•¨μˆ˜ 이름 뿐이닀.

** μ°Έκ³ , java의 경우 λ‹€μŒ μš”μ†Œλ“€μ΄ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜λ‘œ μ²˜λ¦¬ν•œλ‹€.

μ•„λž˜ λ„€ κ°€μ§€ ν•¨μˆ˜λŠ” signatureκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ ν•¨μˆ˜μ΄λ‹€.
ν•¨μˆ˜μ˜ 이름은 κ°™λ‹€. ν•˜μ§€λ§Œ μ„œλ‘œ λ‹€λ₯Έ return typeκ³Ό argumentλ₯Ό κ°€μ§€κΈ° λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜μ΄λ‹€.

int add(int a, int b){return a + b;}

int add(float a, float b){return a + b;}

float add(int a, int b){return a + b;}

float add(float a, float b){return a + b;}

How functions managed.

  • λ¨Όμ € 이 주제λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” stack frameμ΄λΌλŠ” κ°œλ…μ„ 이해할 ν•„μš”κ°€ μžˆλ‹€.
  • stack frame의 μ •μ˜λŠ” μŠ€νƒμ— μ €μž₯λ˜λŠ” ν•¨μˆ˜μ˜ 호좜 정보 이닀.
  • λ¨Όμ € 그림을 보자.

stack frame

  • stack frame에 ν•¨μˆ˜κ°€ 차곑차곑 μŒ“μΈλ‹€.

  • κ°€μž₯ μ΅œκ·Όμ— 호좜된 ν•¨μˆ˜κ°€ stack의 μ΅œμƒλ‹¨μ— μœ„μΉ˜ν•΄ 있게 λœλ‹€.

  • 컴파일 μ‹œμ μ—μ„œ 각 ν•¨μˆ˜κ°€ μ–΄λŠ μ •λ„μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ°¨μ§€ν•˜κ²Œ 될지에 λŒ€ν•΄μ„œ 미리 계산을 ν•΄ λ†“λŠ”λ‹€.

  • caller의 contextμ—μ„œ ν•¨μˆ˜κ°€ 호좜된 ν›„, ν•¨μˆ˜μ˜ operation이 μ’…λ£Œλ˜μ–΄ caller context의 λŒμ•„κ°€κ²Œ 되면,

    • ν•¨μˆ˜κ°€ 호좜된 μ‹œμ μ˜ μ½”λ“œμƒμ˜ μœ„μΉ˜λ‘œ λŒμ•„κ°€μ•Ό ν•œλ‹€.
    • return 값은 return값을 μ „μš©μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” 특수 λ ˆμ§€μŠ€ν„°μ— μž„μ‹œλ‘œ λ“€μ–΄κ°€κ²Œ λœλ‹€.
    • ν•¨μˆ˜κ°€ λλ‚œ μ‹œμ μ˜ λ³΅κ·€μ£Όμ†Œλ₯Ό μ•Œμ•„μ•Ό λŒμ•„κ°€κ²Œ λ˜λ―€λ‘œ, stack frameμ—λŠ” λ³΅κ·€μ£Όμ†Œλ„ μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.
  • 더 μžμ„Έν•œ 그림은 μ•„λž˜ 그림을 μ°Έμ‘°ν•œλ‹€.

Details of stack frame

  • μœ„ 그림은 ν•œ ν•¨μˆ˜κ°€ stack frame에 μ˜¬λΌκ°”μ„ λ•Œ(ram) μ–΄λ– ν•œ λ©”λͺ¨λ¦¬ 값듀이 λ“€μ–΄κ°€λŠ”μ§€μ— λŒ€ν•΄ μ„€λͺ…ν•œ 그림이닀.

Terms

  • function
    1. νŠΉμ • 계산을 μˆ˜ν–‰ν•˜λ©° 리턴값이 μžˆλ‹€.
    2. λ°˜λ“œμ‹œ μˆ˜μ‹ λ‚΄μ—μ„œλ§Œ μ‚¬μš©.
    3. ν•¨μˆ˜ λ‹¨λ…μœΌλ‘œ λ¬Έμž₯ꡬ성 λΆˆκ°€.
  • procedure
    1. νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©° 리턴값이 μ—†λ‹€.
    2. μˆ˜μ‹ λ‚΄μ—μ„œ μ‚¬μš©ν•  수 μ—†μŒ.
    3. void ν•¨μˆ˜κ°€ 이에 ν•΄λ‹Ή.
  • Prototype
    • main ν•¨μˆ˜ 이전에 ν•¨μˆ˜μ˜ μ›ν˜•μ„ μ„ μ–Έν•΄λ†“λŠ”λ‹€.

*μ°Έκ³ 

// μ›ν˜• μ„ μ–Έμ‹œμ— λ‹€μŒ μ„Έ λ¬Έμž₯은 μ •ν™•νžˆ 같은 역할을 ν•œλ‹€.

int age(int);
int age(int a);
int age(int age); // μ’‹μ§€ μ•Šμ€ 넀이밍.
 .
 .
 .
int age(int age){
    return age;
}

Features

  • c ν•¨μˆ˜μ˜ νŠΉμ§•

    1. call by valueκ°€ κΈ°λ³Έ.
    2. μ„ μ–Έμ˜ λμ—λŠ” ; λ₯Ό 뢙이지 μ•ŠλŠ”λ‹€. (normally semicolon is appended when expression is declared)
  • ν—€λ”νŒŒμΌ

    • ν‘œμ€€ ν•¨μˆ˜μ˜ μ›ν˜•μ„ 미리 μž‘μ„±ν•΄ 놓은 것을 ν—€λ”νŒŒμΌ(Header File)이라고 ν•œλ‹€.
    • #include 문을 ν†΅ν•΄μ„œ ν—€λ”νŒŒμΌμ„ μ†ŒμŠ€ μ•ˆμœΌλ‘œ 읽어 λ“€μ΄λŠ” 역할을 ν•œλ‹€.
    • ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ° 전에 μ›ν˜•λ§Œ μ„ μ–Έν•œλ‹€λ©΄ ν•¨μˆ˜μ˜ λ³Έμ²΄λŠ” 어디에 μžˆλ”λΌλ„ 상관이 μ—†λ‹€.
    • ν•˜λ‚˜μ˜ μ‹€ν–‰ νŒŒμΌμ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œ μ†ŒμŠ€λ₯Ό μ—¬λŸ¬κ°œλ‘œ λ‚˜λˆ„μ–΄ κ°œλ°œν•˜λŠ” 방식을 λͺ¨λ“ˆλΆ„ν•  컴파일 방식이라고 ν•œλ‹€.

Calling Convention

  • λ‹€μŒμ˜ μ½”λ“œλ₯Ό 보자.
  void main(){
    int i = 3;
    printf("%d %d\n", i, ++i); // 4, 4
  }
  • μœ„ μ—°μ‚°μ˜ κ²°κ³Όκ°€ 3, 4κ°€ λ‚˜μ˜¬κΊΌλΌκ³  μ˜ˆμƒμ„ ν–ˆμ§€λ§Œ, 싀은 4,4κ°€ λ‚˜μ˜¨λ‹€.
  • κ·Έ μ΄μœ λŠ” C μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜μ‹μ„ 평가할 λ•Œ, λ’€μͺ½ μΈμˆ˜λΆ€ν„° ν‰κ°€ν•˜λ©° λ“€μ–΄μ˜¨λ‹€. (κ·Έ μ΄μœ λŠ” κ°€λ³€μΈμˆ˜λ₯Ό 닀루기가 νŽΈν•΄μ„œ.)
  • μ•„μ‰½κ²Œλ„, C ν‘œμ€€μ— ν•¨μˆ˜ ν˜ΈμΆœμ‹œ, 인수λ₯Ό μ „λ‹¬ν•˜λŠ” μˆœμ„œλŠ” μ •ν•΄μ Έ μžˆμ§€ μ•Šλ‹€. 이 말은, μ»΄νŒŒμΌλŸ¬λ§ˆλ‹€ λ‹€λ₯΄κ²Œ 해석할 수 μžˆμ„ μ—¬μ§€κ°€ μžˆλ‹€λŠ” 말이닀.
  • μ΄λŸ¬ν•œ ν•¨μˆ˜μ˜ 호좜과 κ΄€λ ¨λœ κ·œμ—­μ„ Calling Convetion 이라고 ν•œλ‹€.