[C] ν¨μ
π λ€μ΄κ°λ©°
κ°μ μ½λλ₯Ό μ¬κΈ°μ κΈ° λ°λ³΅ν΄μ μ°λ 건 λΉν¨μ¨μ μ΄λ€. μμ£Ό μ°λ μ½λ λ©μ΄λ¦¬λ₯Ό νλλ‘ λ¬Άμ΄ μ΄λ¦μ λΆμ¬λκ³ , νμν λλ§λ€ λΆλ¬ μ°λ κ²μ΄ ν¨μ(function)λ€.
ν¨μλ? μμ£Ό λ°λ³΅ μνν μ½λ λ©μ΄λ¦¬λ₯Ό β ν¨μλ‘ βμ μβνκ³ , β‘ νμν λλ§λ€ βνΈμΆβνμ¬ μ¬μ©νλ κ².
1. ν¨μμ μ μΒ·νΈμΆΒ·λ¦¬ν΄
ν¨μ μ μ (function definition)
1
2
3
4
리ν΄νμ
ν¨μμ΄λ¦(λ§€κ°λ³μλ€ ...)
{
ν¨μ 본체 (μν μ½λλ€)
}
- ν¨μ μν(function prototype) =
리ν΄νμ ν¨μμ΄λ¦(λ§€κ°λ³μλ€). ν¨μλ₯Ό μ μΈλ§ ν λ μ΄ μνμ μ΄λ€.
π‘ Visual Studio μμ€ νμΌ μΌμͺ½μ μΌκ°ν λ²νΌμ μ΄κ³ λ«μΌλ©΄, κ·Έ νμΌμ μ΄λ€ ν¨μκ° μν ννλ‘ μ°μλμ§ λ³Ό μ μλ€.
ν¨μ νΈμΆ (function call)
1
ν¨μμ΄λ¦(λ§€κ°λ³μμ λ£μ κ°);
μ°λ¦¬κ° λ μ°λ main()λ μ¬μ€ ν¨μμ μΌμ’
μ΄λ€.
ν¨μμ μ€ν νλ¦
μ»΄νμΌλ¬κ° νΈμΆ μ½λλ₯Ό λ§λλ©΄ μ κΉ λ©μΆκ³ νΈμΆλ ν¨μλ₯Ό μ€ννλ€. λ€ μ½μΌλ©΄ λ©μ·λ κ³³μΌλ‘ λμμ¨λ€(return).
1
2
3
4
main() μ€ν μ€ ββνΈμΆβββΊ oper() μ€ν
β² β
βββββββ return βββββββββββ
(λ©μ·λ μ§μ λΆν° κ³μ)
TMI: νΈμΆν ν¨μλ₯Ό caller, νΈμΆλ ν¨μλ₯Ό calleeλΌκ³ νλ€.
λ§€κ°λ³μ vs μΈμ
| μ©μ΄ | μ μ |
|---|---|
| λ§€κ°λ³μ(parameter) | ν¨μλ₯Ό μ μν λ λͺ μνλ λ³μ (κ·Έ ν¨μμ μ§μλ³μλ‘ λμ) |
| μΈμ(argument) | ν¨μλ₯Ό νΈμΆν λ μ λ¬νλ κ° |
ν¨μ νΈμΆ μ μΈμκ° λ§€κ°λ³μλ‘ β볡μ¬βλμ΄ μ€νλλ€. (λ μ©μ΄λ μ€λ¬΄μμ νΌμ©λκΈ°λ νλ€.)
2. μμ λ‘ λ³΄λ ν¨μ
oper ν¨μλ₯Ό λ§λ€μ΄ 보μ. λ§€κ°λ³μλ int 2κ°, 리ν΄νμ
μ void(리ν΄κ° μμ)λ€. 본체μμ μ¬μΉμ°μ°μ μννλ€.
main λ°μ ν¨μλ₯Ό λ§λ€μλ€. κ·Έλ°λ° μ΄λλ‘ μ€ννλ©΄ oper μμ λ¬Έμ₯μ΄ μ€νλ κΉ? μλλ€. mainμμ νΈμΆν΄μΌ νλ€.
oper(100, 10)μ βkμλ 100, vμλ 10μ λ£μ΄ μ€νβνλ€λ λ»μ΄λ€.
β οΈ μ€λ¬΄μμλ ν¨μλ€μ΄ μλ‘λ₯Ό νΈμΆνλ©° 볡μ‘νκ² μ½νλ€.
mainμ΄aaa()λ₯Ό νΈμΆνκ³ ,aaa()μμμ λ€μbbb()λ₯Ό νΈμΆνλ μμ΄λ€. λ°λΌμ ν¨μμ λ Όλ¦¬μ μΈ νΈμΆ μμλ₯Ό μ μ€κ³ν΄μΌ νλ€.
3. 리ν΄(return)
리ν΄κ°: μκΈ°λ₯Ό νΈμΆν ν¨μμκ² λλ €μ£Όλ μ΅μ’ κ° 1κ°. λ§€κ°λ³μλ‘ μμ μνν λ€ λμ¨ κ²°κ³Όκ°μ΄λ€.
λ κ°μ§ λ°©μμ λΉκ΅νμ.
1
2
3
4
5
6
7
8
9
10
11
// β λ³μμ λ΄μ 리ν΄
int add(int a, int b) {
int sum = a + b;
return sum;
}
int result = add(10, 5); // result = 15
// β‘ μμ κ·Έλλ‘ λ¦¬ν΄
int sub(int a, int b) {
return a - b; // κ²°κ³Όλ λμΌ
}
add(10, 5)μ 리ν΄κ°μ 15μ΄λ―λ‘,int result = add(10, 5);μμresultμ 15κ° λμ λλ€.voidνμ μ 리ν΄κ°μ΄ μμΌλ,printfκ°μ λ¬Έμ₯μΌλ‘ κ²°κ³Όλ₯Ό μ²λ¦¬νλ©΄ λλ€.
4. μμ β βμ μΈβκ³Ό βμ μβ
λ³μλ₯Ό μ μΈ νμ μ°λ―, ν¨μλ μ μ(λλ μ΅μν μ μΈ)κ° νΈμΆλ³΄λ€ μμ μμ΄μΌ νλ€. μ»΄νμΌλ¬κ° μβμλλ‘ μ½κΈ° λλ¬Έμ΄λ€.
main μλμ half ν¨μλ₯Ό μ μνλ©΄ μ€λ₯κ° λλ€. νμ§λ§ λ°©λ²μ΄ μλ€. βμ μβλ μλμμ νλ, βμ μΈβλ§ μμμ ν΄μ£Όλ©΄ λλ€.
1
2
3
4
5
6
7
8
9
double half(int n); // μμμ 'μ μΈ' (ν¨μ μν)
int main() {
... half(10) ... // νΈμΆ κ°λ₯!
}
double half(int n) { // μλμμ 'μ μ'
return n / 2.0;
}
μ μ€νλλ€.
5. ν€λ νμΌλ‘ μ μΈ λΆλ¦¬νκΈ°
μ¬λ¬ μμ€ νμΌλ§λ€ ν¨μλ₯Ό μΌμΌμ΄ μ μΈΒ·μ μνλ 건 λ²κ±°λ‘λ€. κ·Έλμ ν€λ νμΌ(.h)μ ν¨μμ μ μΈμ λͺ¨μλλ€.
ν€λ νμΌμ΄λ? ν¨μμ μ μΈ, λ§€ν¬λ‘, μμ λ±μ λͺ¨μλ νμΌ. μ°λ¦¬κ° λ μ°λ
#include <stdio.h>λ ν€λ νμΌμ΄λ€. κΈ°λ³Έ ν¨μλ€μ μ μΈμ΄ κ±°κΈ° μμ΄μ, κ·Έκ±Έ ν¬ν¨ν΄μΌ κ·Έ ν¨μλ€μ μΈ μ μλ€.
| κ΅¬λΆ | ν¬ν¨ λ°©μ | μ |
|---|---|---|
| νμ€ ν€λ | #include <...> | #include <stdio.h> |
| μ§μ λ§λ ν€λ | #include "..." | #include "myfunction.h" |
μν λΆλ¦¬λ₯Ό κ·Έλ¦ΌμΌλ‘ μ 리νλ©΄ μ΄λ λ€.
1
2
3
myfunction.h β ν¨μ 'μ μΈ'λ§ λͺ¨μ
myfunction.c β ν¨μ 'μ μ'λ§ λͺ¨μ
test.c(main) β #include "myfunction.h" ν 'νΈμΆ'λ§
νλ‘μ νΈμ μμ€ νμΌ λͺ©λ‘μ 보면, λΉλμμ μ μΈ(κΈμ§ νμ)λ νμΌλ€μ΄ μλ€. νμ±νλ κ²μ β mainμ ν¬ν¨ν νμΌκ³Ό β‘ ν¨μ μ μλ₯Ό λͺ¨μ νμΌ λ κ°λ€. (μ μ νμΌμλ mainμ΄ μλ€.)
μ 리νλ©΄ μ΄λ λ€.
ν μμ€ νμΌμ ν¨μλ₯Ό βμ μβνκ³ , ν€λ νμΌμ ν¨μλ₯Ό βμ μΈβνκ³ ,
mainμ΄ μλ μμ€ νμΌμ κ·Έ ν€λλ₯Ό#includeνλ©΄ βmainνμΌμμλ κ·Έλ₯ βνΈμΆβλ§ νλ©΄ λλ€.
power(3, 4) (3μ 4μ κ³± = 81)λ₯Ό μλ‘ νμΈν΄ 보μ. μ μλ myfunction.c, μ μΈμ ν€λμ, νΈμΆμ test.cμμ.
mainμ μ μΈλ μ μλ μμ΄ νΈμΆλ§μΌλ‘ μ λμνλ€.
6. μ¬κ· νΈμΆ (recursive call)
μ¬κ· νΈμΆ: ν¨μκ° μ€ν μ€μ μκΈ° μμ μ λ€μ νΈμΆνλ κ².
| νΉμ§ | μ€λͺ |
|---|---|
| μ₯μ | 볡μ‘ν λ¬Έμ λ₯Ό λ¨μννμ¬ κ΅¬ν κ°λ₯ |
| μ μ½ | 무ν μ¬κ·λ λΆκ° (λ°λμ μ’ λ£ μ‘°κ±΄ νμ) |
func1μ 리ν΄κ°μ΄ λ func1(n+1)μ΄λ€. mainμμ func1(1)μ νΈμΆνλ©΄ μ΄λ»κ² λ κΉ? 무νν νΈμΆλλ€.
β οΈ κ·Έλμ ν¨μ μμ
if (n == ?)κ°μ μ’ λ£ μ‘°κ±΄(base case)μ λκ³ , κ·Έλμ 리ν΄κ°μ μ§μ ν΄ λ¬΄ν νΈμΆμ λ§μμΌ νλ€.
π μ 리
1
2
3
4
5
6
7
8
ν¨μ(function)
ββ μ μ 리ν΄νμ
μ΄λ¦(λ§€κ°λ³μ) { 본체 }
ββ νΈμΆ μ΄λ¦(μΈμ); β callerκ° λ©μΆκ³ callee μ€ν ν return
ββ λ§€κ°λ³μ/μΈμ μ μ μ λ³μ / νΈμΆ μ μ λ¬κ° (볡μ¬λ¨)
ββ return νΈμΆμμκ² μ΅μ’
κ° 1κ° λ°ν
ββ μμ μ μΈ(μν)λ§ μμ μμΌλ©΄ μ μλ μλμ¬λ OK
ββ ν€λ .hμ 'μ μΈ' λͺ¨μ β #include λ‘ μ¬μ¬μ©
ββ μ¬κ· μκΈ° μμ νΈμΆ, λ°λμ μ’
λ£ μ‘°κ±΄ νμ
| κ°λ | ν μ€ μ μ |
|---|---|
| ν¨μ | λ°λ³΅ μ½λλ₯Ό μ μνκ³ νΈμΆν΄ μ¬μ¬μ©νλ λ¨μ |
| μν(prototype) | 리ν΄νμ
μ΄λ¦(λ§€κ°λ³μ), μ μΈμ μ¬μ© |
| λ§€κ°λ³μ/μΈμ | μ μ μ λ³μ / νΈμΆ μ μ λ¬κ° |
| ν€λ νμΌ | ν¨μ μ μΈΒ·λ§€ν¬λ‘Β·μμλ₯Ό λͺ¨μ μ¬μ¬μ© |
| μ¬κ· νΈμΆ | μκΈ° μμ μ νΈμΆ, μ’ λ£ μ‘°κ±΄ νμ |
ν¨μλ νλ‘κ·Έλλ°μ βν¨μ¨κ³Ό μ¬μ¬μ©βμ λ΄λΉνλ ν΅μ¬ λꡬλ€. μ μΈκ³Ό μ μμ λΆλ¦¬, κ·Έλ¦¬κ³ ν€λ νμΌλ‘ μ΄μ΄μ§λ νλ¦μ μ΄ν΄νλ©΄ κ·λͺ¨κ° ν° νλ‘μ νΈλ κΉλνκ² κ΅¬μ±ν μ μλ€.















Comments powered by Disqus.