Notice
Recent Posts
Recent Comments
Link
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
Tags
more
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

KH_C++

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ(Function Pointer) ๋ณธ๋ฌธ

C++

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ(Function Pointer)

kanghou 2022. 11. 30. 15:41

๐ŸŽˆ ๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ

๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ์˜ ๊ฐ’์„ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด int ์ž๋ฃŒํ˜•์„ ๊ฐ€์ง„ data๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด data ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘๊ฐ’์„ 5๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ p๋ฅผ ์„ ์–ธํ•ด์„œ '๋ฒˆ์ง€ ๊ณ„์‚ฐ ์—ฐ์‚ฐ์ž('&')๋ฅผ ์‚ฌ์šฉํ•ด์„œ data ๋ณ€์ˆ˜ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ p์— ์ €์žฅํ•œ ๋‹ค์Œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜  p์— '๋ฒˆ์ง€ ์ง€์ • ์—ฐ์‚ฐ์ž('๏ผŠ')๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ data ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 6์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 


๐ŸŽˆ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

๊ทธ๋Ÿฐ๋ฐ ํฌ์ธํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ(๋ณ€์ˆ˜)์˜ ์ฃผ์†Œ๋งŒ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. c ์–ธ์–ด์—์„œ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ช…๋ น์–ด์˜ ์ง‘ํ•ฉ์ฒด๋Š” ์ปดํŒŒ์ผ๋˜๋ฉด ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด ์ฝ”๋“œ ์„ธ๊ทธ๋จผํ„ฐ๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋Š” ๋ณ€๊ฒฝ๋˜๊ฒ ์ง€๋งŒ ๊ฒฐ๊ตญ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ(Function Pointer)๋Š” ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋œปํ•œ๋‹ค.


๐ŸŽˆ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์ •์˜ ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
8
9
10
11
12
13
int func(int x)
{
    return x;
}
 
int main()
{
    cout << func << endl; // 01201084 ์ถœ๋ ฅ (ํ•จ์ˆ˜์˜ ์ฃผ์†Œ)
    
    int (*funcptr)(int) = func; // ํ•จ์ˆ˜ ํฌ์ธํ„ฐ funcptr ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
 
    cout << funcptr << endl; // 01201084 ์ถœ๋ ฅ  
}
 
 

๐ŸŽ‡ int : ์ฃผ์†Œ์— ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…
๐ŸŽ‡ (*funcptr) : ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์ด๋ฆ„ funcptr
๐ŸŽ‡ (int) : ์ฃผ์†Œ์— ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์ ์–ด์ฃผ๋Š” ๋ถ€๋ถ„. ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ()
๐ŸŽ‡ = func : func ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋กœ ์ดˆ๊ธฐํ™” ํ•จ. ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๊ทธ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ !


๐ŸŽˆ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int func(int x)
{
    return x;
}
 
int main()
{
    cout << func << endl; 
    int (*funcptr)(int) = func; 
    cout << funcptr << endl; 
 
    cout << funcptr(5) << endl;  
    // 5์ถœ๋ ฅ. func ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ funcptr๋กœ fun ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Œ
}
 

๐ŸŽ‡ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์ด๋ฆ„(ํŒŒ๋ผ๋ฏธํ„ฐ)
      1. ์ด๋ ‡๊ฒŒ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      2. ํฌ์ธํ„ฐ funcptr ์ด ํ•จ์ˆ˜ func์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— func(3)์€ funcptr(3) ์ด๋ ‡๊ฒŒ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.


๐ŸŽ‡funcptr = func2
      1. ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋Œ€์ž…์„ ํ•˜๋ ค๋ฉด ๋ฆฌํ„ดํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•ด์•ผ ๊ฐ€๋Šฅ             ํ•˜๋‹ค.
            - funcptr์€ int (*funcptr)(int) ํƒ€์ž…์ด๋ฏ€๋กœ func2 ํ•จ์ˆ˜ ๋˜ํ•œ ๋ฆฌํ„ดํƒ€์ž…์ด int๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๋„ int๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋„ 1๊ฐœ                   ์—ฌ์•ผ funcptr์— ์ฃผ์†Œ ๋Œ€์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค


๐ŸŽˆ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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 <iostream>
 
using namespace std;
 
int    add(int a, int b)
{
    return (a + b);
}
 
void    print_odd(int a, int b, int (*f)(intint)) //๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ add๋ฅผ ๋ฐ›์Œ
{
    int    ret = f(a, b);
 
    if (ret % 2 == 1)
        cout << ret << endl;
    else
        cout << "ํ™€์ˆ˜๊ฐ€ ์•„๋‹ˆ์—์š”!" << endl;
}
 
int    main(void)
{
    print_odd(24, add);
    print_odd(23, add);
}
//์ถœ๋ ฅ
//ํ™€์ˆ˜๊ฐ€ ์•„๋‹ˆ์—์š”!
//5
cs

๐ŸŽˆ ํ•จ์ˆ˜ํฌ์ธํ„ฐ์˜ const

ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ const๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int    add(int a, int b)
{
    return (a + b);
}
 
int    main(void)
{
    int    (*const f)(intint= add; 
    //์ฐธ์กฐ ์—ฐ์‚ฐ์ž *์˜†์— const๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ํ•จ์ˆ˜ํฌ์ธํ„ฐ f๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
    cout << f(12);
}
//์ถœ๋ ฅ
//3
cs

๐ŸŽˆ class ๋ฉค๋ฒ„ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜ํฌ์ธํ„ฐ ์‚ฌ์šฉ

class์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋„ ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ class๋‚ด๋ถ€์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ํ•จ์ˆ˜ํฌ์ธํ„ฐ์˜ ์„ ์–ธ ๋˜ํ•œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฒ”์œ„ ๋‚ด์—์žˆ๋Š” ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋ผ๊ณ  ๋ช…์‹œํ•ด์ค˜์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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
#include <iostream>
 
using namespace std;
 
class Test
{
public:
    int    add(int a, int b) //ํด๋ž˜์Šค Test์•ˆ์— ๋ฉค๋ฒ„ํ•จ์ˆ˜ add๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    {
        return (a + b);
    }
};
 
int    main(void)
{
    Test    test;  // ํด๋ž˜์Šค Test๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ์‹œ์ผœ ๊ฐ์ฒด๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    int    (Test::*f)(intint= &Test::add;
    //ํ•จ์ˆ˜ํฌ์ธํ„ฐ f๋Š” Test์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  Test::๋ฅผ ํ†ตํ•ด ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.
    //๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ์ฃผ์†Œ ๋˜ํ•œ Test์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ผ๊ณ  ๋ช…์‹œํ•ด ์ฃผ๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์™€ ๋‹ฌ๋ฆฌ
    //ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ &์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
    cout << (test.*f)(12<< endl;
    //ํ•จ์ˆ˜ํฌ์ธํ„ฐ์˜ ์‚ฌ์šฉ ๋˜ํ•œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    //๋งŒ์•ฝ class์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด this๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    //์ ‘๊ทผ์€ ๋ฉค๋ฒ„ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์ž์ธ .* ๋˜๋Š” ->*์—ฐ์‚ฐ์ž๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
}
//์ถœ๋ ฅ
//3
cs

๐ŸŽˆ static์„ ์ด์šฉํ•œ ๋ฉค๋ฒ„ํ•จ์ˆ˜์˜ ์ ‘๊ทผ

์ผ๋ฐ˜ ํ•จ์ˆ˜ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
class์—์„œ ๋ฉค๋ฒ„ํ•จ์ˆ˜์— static์„ ์‚ฌ์šฉํ•˜๋ฉด class์˜ ์ด๋ฆ„์œผ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์–ด๋–ค ํŠน์ • ๊ฐ์ฒด์— ๊ท€์†๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๊ณ  ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— class์˜ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ ์ ‘๊ทผ๋งŒ ํ•ด์ฃผ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜ํฌ์ธํ„ฐ์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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
#include <iostream>
 
using namespace std;
 
class Test //class๋ฅผ ์ด 4๊ฐœ ์ƒ์„ฑํ•œ ๋’ค ๋ฉค๋ฒ„ํ•จ์ˆ˜ ๋ชจ๋‘ static์„ ์‚ฌ์šฉํ•ด ์ค๋‹ˆ๋‹ค.
{
public:
    static int    add(int a, int b)
    {
        return (a + b);
    }
};
 
class TestTwo
{
public:
    static int    sub(int a, int b)
    {
        return (a - b);
    }
};
 
class TestThree
{
public:
    static int    div(int a, int b)
    {
        return (a / b);
    }
};
 
class TestFour
{
public:
    static int    mul(int a, int b)
    {
        return (a * b);
    }
};
 
int    main(void)
{
    //ํ•จ์ˆ˜ํฌ์ธํ„ฐ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ฃผ๊ณ , class์˜ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.
    int    (*f[4])(intint= {
        &Test::add,
        &TestTwo::sub,
        &TestThree::div,
        &TestFour::mul
    };
    for (int i = 0; i < 4; i++)
        cout << f[i](12<< endl;
         //์ถœ๋ ฅ์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ํฌ์ธํ„ฐ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
}
//์ถœ๋ ฅ
//3
//-1
//0
//2
cs

 


Comments