ํจ์ ํฌ์ธํฐ๋ผ๋ ๊ฐ๋ ์ ์ ํ๋ฉด ์ด๋ฐ ์๊ฐ์ด ๋ค ์ ์์ต๋๋ค. "ํจ์๋ฅผ ์ง์ ํธ์ถํ๋ฉด ๊ฐ๋จํ๋ฐ, ์ ๊ตณ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์จ์ผ ํ ๊น?" ์ ๋ ์ฒ์์๋ ์ด ์ง๋ฌธ์ด ๋จธ๋ฆฟ์์ ๋ ๋์ง ์์์ต๋๋ค. ํ์ง๋ง ํจ์ ํฌ์ธํฐ๋ฅผ ์ดํดํ๊ณ ๋๋, ์ผ๋ง๋ ์ ์ฉํ์ง ๊นจ๋ซ๊ฒ ๋์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํจ์ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๊ทธ ํ์์ฑ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํจ์ ํฌ์ธํฐ๋ ๋ฌด์์ผ๊น?
ํจ์ ํฌ์ธํฐ๋ ํจ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ณ์์
๋๋ค. ๋ค์ ๋งํด, ์ผ๋ฐ ํฌ์ธํฐ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ์ง๋ง, ๊ทธ ์ฃผ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ด ํจ์์ธ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค.
ํจ์ํฌ์ธํฐ์ ์ฃผ์ ํน์ง
- ํจ์ ํฌ์ธํฐ๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํ ์ฃผ์๊ฐ์ ์ ์ฅํฉ๋๋ค.
- ํฌ์ธํฐ๋ฅผ ํตํด ํจ์ ํธ์ถ์ ๊ฐ์ ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
ํจ์ ํฌ์ธํฐ์ ์ ์ธ
ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค:
์๋ฃํ (*ํจ์ํฌ์ธํฐ์ด๋ฆ)(์ธ์๋ชฉ๋ก);
๐ซง ์์ : ํจ์ํฌ์ธํฐ ์ ์ธ
int (*func)(int a);
- ํจ์๋ช ์์ (*)๋ฅผ ๋ถ์ด๋ฉด ํจ์ ํฌ์ธํฐ๊ฐ ๋ฉ๋๋ค.
- ์ ์ ์ธ์์ func๋ int a ํ์์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ ์ฃผ์๋ฅผ ์ ์ฅํ ์ ์๋ ํจ์ ํฌ์ธํฐ ์ ๋๋ค.
ํจ์ ํฌ์ธํฐ์ ์ฌ์ฉ ์ด์ ๐ฅธ
Q. ์ง์ ํจ์ ํธ์ถ์ ํ๋ฉด ๋๋๋ฐ, ์ ๊ตณ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊น?
ํจ์ ํฌ์ธํฐ๋ ์ฃผ๋ก ํ๋ก๊ทธ๋จ ์คํ ์ค์ ํธ์ถํ ํจ์๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ(๋์ ๋ฐ์ธ๋ฉ) ๋ง๋ค๊ณ , ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋ ์ ์ฐํ๊ฒ ์ค๊ณ ํ ์ ์๋๋ก ๋์์ค๋๋ค.
์๋ฅผ ๋ค์ด, ํ์์๋ ํน์ ํจ์๋ง ํธ์ถํ๋๋ก ๊ณ ์ ๋์ด ์๋ค๋ฉด ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ค์๋ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋์์ ๋ณ๊ฒฝํ ๋ ์ฝ๋ ์์ ์ด ํจ์ฌ ๊ฐ๋จํด์ง๋๋ค.
์ฝ๊ฒ ๋งํด, ํจ์ํฌ์ธํฐ๋ ์ํฉ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํ๋์ ๋ฐ๊ฟ์ ์๊ฒ ํด์ค๋๋ค.
1. ์ ์ ๋ฐ์ธ๋ฉ๊ณผ ๋์ ๋ฐ์ธ๋ฉ
1. ์ ์ ๋ฐ์ธ๋ฉ(Static Binding)
์ปดํ์ผ ํ์์ ํจ์ ํธ์ถ์ด ๊ณ ์ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ ๋ฐฉ์์์ ํธ์ถํ ํจ์๊ฐ ์ปดํ์ผ ์ ์ด๋ฏธ ๊ฒฐ์ ๋ฉ๋๋ค.
int result = Plus(3, 5); // ์ปดํ์ผ ์ Plus ํจ์๋ก ๊ณ ์
- ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋์์ ํธ์ถํ ํจ์๋ฅผ ์ ํํ ์๊ณ , ํด๋น ํจ์์ ์ฃผ์๋ฅผ ์ปดํ์ผ ์ ๊ฒฐ์ ํฉ๋๋ค.
- ์คํ ์ค์๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ ์ ๋ฐ์ธ๋ฉ๊ณผ ์
๋ ฅ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋ฆฌ ํ์๋ฉด:
- ์ ์ ๋ฐ์ธ๋ฉ์ ํต์ฌ์ "ํธ์ถํ ํจ์๊ฐ ๊ณ ์ "๋๋ค๋ ๊ฒ
- ์ ์ ๋ฐ์ธ๋ฉ์์ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋ ์ง๊ฐ ์ปดํ์ผ ์์ ๊ฒฐ์ โญ ๋ฉ๋๋ค.
- ์ฝ๋์์ Plus(x, y)๋ผ๋ ํจ์ ํธ์ถ์ด ์๋ค๋ฉด, ์ปดํ์ผ๋ฌ๋ ์ด ํธ์ถ์ด ๋ฌด์กฐ๊ฑด Plus ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์๊ณ , ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ ์ฝ๋์ ๋ฐ์ํฉ๋๋ค.
- ์ ๋ ฅ๊ฐ(x,y)์ ๋ฐํ์์ ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์์ ๋ณํ ์ ์์ง๋ง, ํธ์ถ๋๋ ํจ์๋ ์ฌ์ ํ ์ปดํ์ผ ํ์์ ๊ณ ์ ๋์ด ์์ต๋๋ค.
- scanf_s๋ก ๋ฐ์ ๊ฐ์ ํจ์์ ์
๋ ฅ๊ฐ์ด์ง, ํธ์ถ ๋์์ด ์๋
- scanf_s ๋ฅผ ํตํด ์ ๋ ฅ ๋ฐ์ x์ y๋ ํจ์์ ์ ๋ฌ๋๋ ์ธ์๊ฐ ์ผ ๋ฟ, ํจ์ ํธ์ถ ๋ฐฉ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
- ์ฆ, ์ ๋ ฅ๊ฐ์ ๋ณํ๋ ํจ์ ๋ด๋ถ ๋์์๋ง ์ํฅ์ ๋ฏธ์น ๋ฟ, ํธ์ถํ ํจ์ ์์ฒด Plus๋ ๋ณํ์ง ์์ต๋๋ค.
2. ๋์ ๋ฐ์ธ๋ฉ(Dynamic Binding)
์คํ ์ค (runtime)์ ํธ์ถํ ํจ์๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ ์คํ ๋์ค ์ด๋ค ํจ์๊ฐ ํธ์ถ๋ ์ง ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
int (*fptr)(int, int) = Plus;
fptr = Minus; // ์คํ ์ค์ ํธ์ถํ ํจ์๋ฅผ ๋ฐ๊ฟ ์ ์์
- ํจ์ ํฌ์ธํฐ ์ฌ์ฉ
- int (*fptr)(int, int)์ ์ ์ธํ์ฌ ์คํ ์ค์ ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋๋ก ํ์์ต๋๋ค.
- fptr์ ๋ค๋ฅธ ํจ์ ์ฃผ์ ํ ๋น
- fptr = Plus → Plus ํจ์ ์ฃผ์๋ฅผ fptr์ ํ ๋น
- fptr = Minus → Minus ํจ์ ์ฃผ์๋ฅผ fptr์ ํ ๋น
- ์คํ ์ค ํธ์ถ ํจ์ ๋ณ๊ฒฝ
- fptr(x, y)๋ fptr์ด ๊ฐ๋ฆฌํค๋ ํจ์(Plus ๋๋ Minus)๋ฅผ ํธ์ถํฉ๋๋ค.
- ์คํ ์ค ์ด๋ค ํจ์๋ฅผ ํธ์ถํ ์ง ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๐์คํ ๊ฒฐ๊ณผ
์
๋ ฅ๊ฐ: 3 5
์ถ๋ ฅ:
๋ ์ ์๋ฅผ ์
๋ ฅํ์ธ์: 3 5
Plus ๊ฒฐ๊ณผ = 8
Minus ๊ฒฐ๊ณผ = -2
2. ์ ์ฐํ ํ๋ก๊ทธ๋จ ์ค๊ณ
- ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ์์ ์์ด ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด main() ํจ์๋ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
void ExecuteOperation(int (*operation)(int, int), int x, int y){
printf("๊ฒฐ๊ณผ = $d\n", operation(x, y));
}
์๋ก์ด ์ฐ์ฐ ํจ์๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ExecuteOperation ์ ํธ์ถํ๋ ์ฝ๋๋ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
3. ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ์ ์ ์ฉ
์ดํด๋ฆฝ์ค์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ์ ์๋ฅผ ๋ค์ด๋ณด๋ฉด ํ๋ฌ๊ทธ์ธ์ ๋งค๋ฒ ์ํ๋ฉ๋๋ค.
1. ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋
- ํ๋ฌ๊ทธ์ธ์ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ธ์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ํ์ฅํ ์ ์๋๋ก ์ค๊ณ๋ ๋ชจ๋์ ๋๋ค.
- ์๋ฅผ ๋ค์ด:
- ์ดํด๋ฆฝ์ค: ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด Java, C++, Python์ฉ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ ๊ธฐ๋ฅ์ ํ์ฅํฉ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ (Chrome, Firefox): ๊ด๊ณ ์ฐจ๋จ, ํ๋ฉด์บก์ฒ, ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ํ์ฅ ํ๋ก๊ทธ๋จ(ํ๋ฌ๊ทธ์ธ)์ ์ง์ํฉ๋๋ค.
2. ํ๋ฌ๊ทธ์ธ์์์ ๋ฌธ์ ์
- ๋ง์ฝ ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ์์ ํ๊ณ ๋ค์ ์ปดํ์ผํด์ผ ํ๋ค๋ฉด, ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ๊ฐ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ผ์ด ๊ธฐ์กด ์ฝ๋์ ์ฝํ ์์ผ๋ฉด, ํ๋ก๊ทธ๋จ์ด ์ ์ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋๋ค.
3. ํจ์ ํฌ์ธํฐ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ํจ์ ํฌ์ธํฐ๋ ํ๋ฌ๊ทธ์ธ์ฒ๋ผ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ํธ์ถํ ์ ์๋๋ก ๋๋ ๋๊ตฌ์ ๋๋ค.
- ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ , ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ํํ๊ฑฐ๋ ๊ต์ฒดํ ์ ์์ต๋๋ค.
4. ๊ฐ์ฒด ์งํฅ์ ๋คํ์ฑ๊ณผ ์ ์ฌํ ๊ฐ๋
- ํจ์ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ฉด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋คํ์ฑ(Polymorphism)๊ณผ ๋น์ทํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ํจ์ ํฌ์ธํฐ๋ฅผ ํตํด ๋ค์ํ ์ฐ์ฐ(๋ง์ , ๋บ์ )์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
์ฝ๋ ์์ : ํจ์ ํฌ์ธํฐ์ ํ์ฉ
#include <stdio.h>
// ๋ ๊ฐ์ ์ฐ์ฐ ํจ์
int Plus(int a, int b){
return a + b;
}
int Minus(int a, int b){
return a - b;
}
int main(){
int x, y;
int (*fptr)(int, int); // ํจ์ ํฌ์ธํฐ ์ ์ธ
printf("๋ ์ ์๋ฅผ ์
๋ ฅํ์ธ์.");
scanf("%d %d", &x, &y);
// Plus ํจ์ ํธ์ถ
fptr = Plus;
printf("Plus ๊ฒฐ๊ณผ = %d\n", fptr(x,y));
// Minus ํจ์ ํธ์ถ
fptr = Minus;
printf("Minus ๊ฒฐ๊ณผ = %d\n", fptr(x,y));
return 0;
}
โก๏ธ ์คํ ํ๋ฆ ์ค๋ช
- fptr = Plus;
- Plus ํจ์์ ์ฃผ์๊ฐ fptr์ ์ ์ฅ๋ฉ๋๋ค.
- ์ดํ fptr(x, y)๋ฅผ ํธ์ถํ๋ฉด Plus ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
- fptr = Minus;
- Miuns ํจ์์ ์ฃผ์๊ฐ fptr์ ์ ์ฅ๋ฉ๋๋ค.
- ์ดํ fptr(x,y)๋ฅผ ํธ์ถํ๋ฉด Minus ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
๊ฒฐ๋ก : ํจ์ ํฌ์ธํฐ๋ ์ ์ฌ์ฉํ ๊น?
ํจ์ ํฌ์ธํฐ๋ ์ฒ์ ๋ณด๋ฉด ์กฐ๊ธ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ค์ ๋ก๋ ์ฝ๋๋ฅผ ๋ ์ ์ฐํ๊ณ ์ฝ๊ฒ ํ์ฅํ ์ ์๋๋ก ๋์์ค๋๋ค.
์ง์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ๋จ์ํ๊ณ ์ง๊ด์ ์ด์ง๋ง, ์ด๋ฐ ๋ฐฉ์์ ์ฝ๋ ์์ ์ด ํ์ํ ๋ ์ ์ฝ์ด ๋ง์์ง๊ณ ์ ์ง๋ณด์๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค. ๋ฐ๋ฉด, ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ ์คํ ์ค์๋ ๋์์ ๋ฐ๊ฟ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋ฌ๊ทธ์ธ์ฒ๋ผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฐ๊ฟ์ผ ํ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด, ํจ์ ํฌ์ธํฐ๊ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ์์ ํ ์ฝ๋๋ฅผ ์ต์ํํ๋ฉด์๋ ์๋ก์ด ๋์์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ด ๋ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ ์ค๊ณ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
'C์ธ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C์ธ์ด] ๊ตฌ์กฐ์ฒด ์ด๋ป๊ฒ ์ ๊ทผํ ๊น? ์ (.) ๊ณผ ํ์ดํ -> (0) | 2025.01.30 |
---|---|
[C์ธ์ด] ๊ตฌ์กฐ์ฒด๋ ๋ฌด์์ด๊ณ ์ ์ฌ์ฉํ๋ ๊ฑธ๊น? (0) | 2025.01.18 |
[C์ธ์ด] void๋ ์๋ฃํ์ผ๊น? (1) | 2025.01.04 |
[C์ธ์ด] *ํฌ์ธํฐ์ **ํฌ์ธํฐ ์ด์คํฌ์ธํฐ ๊ฐ๋ (1) | 2025.01.02 |
[C์ธ์ด] ๊ฐ ํธ์ถ ๋ฐฉ์(Call by Value)๊ณผ ์ฐธ์กฐ ํธ์ถ ๋ฐฉ์(Call by Reference) (1) | 2025.01.01 |