๐Ÿ“– C๋ž‘ C++

C++ Function Object (ํ•จ์ˆ˜ ๊ฐ์ฒด)๋ฅผ ์•Œ์•„๋ณด์ž

bell22 2021. 1. 22. 17:51

Lamda (๋žŒ๋‹ค) ํฌ์ŠคํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ํ•˜๋˜ ์ค‘,,

์ด์ƒํ•˜๊ฒŒ ๊ธ€์ด ์•ˆ์จ์กŒ๋‹ค. ๊ธฐ์ดˆ ์—†์ด ์‚ฌ์šฉํ• ๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ๊ฒƒ ๊ฐ™์•„์„œ

ํ•จ์ˆ˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋จผ์ € ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค

 


1. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž

ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์ „์—, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋ฅผ ๋ด๋ณด๊ฒ ๋‹ค

์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค

 

#include <iostream>
#include <algorithm>
using namespace std;

int myPlus(int num1, int num2)
{
    return num1+num2;
}

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    cout << myPlus(num1, num2) << endl;

    return 0;
}

 

myPlus๋ผ๋Š” ํ•จ์ˆ˜์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ int ํ˜• ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ๋ง์…ˆ์„ ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค

์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ์‹œ์— ์•„๋ž˜ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค

 

int func_name(int num1..)

 

์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์€ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ํ˜•, ํ•จ์ˆ˜ ์ด๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž์ธ () ์ด๋‹ค.

๋ณดํ†ต ๊ด„ํ˜ธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” "( )" ๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋ผ๊ณ  ํ•œ๋‹ค

์ง์—ญํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š”~~ ์—ฐ์‚ฐ์ž(operator) ์ •๋„๊ฐ€ ๋˜๊ฒ ๋‹ค 

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์™€ operator ์‚ฌ์šฉ์— ํŠนํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

์–ธ์  ๊ฐ€ ๋“ค์–ด๋ดค์„ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์—์„œ, +/-/<<.. ์ด๋Ÿฐ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด 

C++์—์„œ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•ด์„œ! ์ž๊ธฐ๋งŒ์˜ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด, operator+() ์š”๋Ÿฐ ์‹์œผ๋กœ.

 

()๋ผ๋Š” ์—ฐ์‚ฐ์ž๋„ operator()๋กœ ์˜ค๋ฒ„๋กœ๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ๋‹ค → () ๋Š” operator()์™€ ๊ฐ™๋‹ค๋Š” ๋ง

 

2. ํ•จ์ˆ˜ ๊ฐ์ฒด

๊ทธ๋Ÿฌ๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž์™€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ๋ญ” ์ƒ๊ด€์ธ๊ฐ€?๋ฅผ ์•Œ์•„๋ณด๊ฒ ๋‹ค

ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ์œ„์˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ง์…ˆ์„ ํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋จผ์ € ๋ณด์ž

 

class MyPlus
{
    public:
        int operator()(int num1_, int num2_)
        {
            return num1_ + num2_;
        }
};

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    MyPlus funcP;
    cout << funcP(num1, num2) << endl;

    return 0;
}

 

MyPlus๋ผ๋Š” ํด๋ž˜์Šค ์•ˆ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ operator()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค

 

funcP(num1, num2)

 

์š” ๋ถ€๋ถ„์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณด์ž

MyPlus์˜ ๊ฐ์ฒด์ธ funcP์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž์ธ ()๋กœ

MyPlus ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ operator()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

์œ„์˜ ์˜ˆ์ œ์—์„œ, myPlus() ํ•จ์ˆ˜์™€ ์‚ฌ์šฉ๋ฒ•์ด ๋‹ค๋ฅด์ง€ ์•Š๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š๋Š”๊ฐ€,,?

ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งˆ์น˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ํ•จ์ˆ˜ ๊ฐ์ฒด ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค

 

operator() ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, .operator() ๊ฐ€ ์ƒ๋žต๋œ ๊ฒƒ๋„ ์•Œ์•„๊ฐ€์ž

 

funcP(num1, num2);
funcP.operator()(num1, num2);

 

๊ทผ๋ฐ, ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•ด์„œ

์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ์•Œ๊ฒ ๋Š”๋ฐ, ๊ตณ์ด? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค

์˜คํžˆ๋ ค ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ๋ณต์žกํ•œ๊ฑฐ ์•„๋‹™๋‹ˆ๊นŒ ์Šค์•ต๋‹˜,, 

 

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ƒ๊ฐ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค

 

int mySum(int num1)
{
    int sumRet = 0;
    sumRet += num1;
    return sumRet;
}

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    /* 1. ํ•จ์ˆ˜ ์ด์šฉ */
    auto ret = mySum(num1);
    cout << ret << endl; 

    ret = mySum(num2);
    cout << ret << endl; 

	/* 10 */
    /* 20 */
    return 0;
}

 

mySum์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ, num1๋„ ๋”ํ•˜๊ณ ~ num2๋„ ๋”ํ•˜๊ณ  ์‹ถ์—ˆ์œผ๋‚˜

๊ธ€๋กœ๋ฒŒ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ์ด์ƒ, ์ง€์—ญ๋ณ€์ˆ˜์— ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„์ ํ•  ์ˆ˜ ์—†์œผ์…ˆ

ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด ๋†“์œผ๋ฉด? ๋ˆ„์ ๋œ ๊ฐ’์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

 

class MySum
{
    int sumRet = 0;
    public:
        int operator()(int num1_)
        {
            sumRet += num1_;
            return sumRet;
        }
};

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    /* 2. ํ•จ์ˆ˜ ๊ฐ์ฒด ์ด์šฉ */
    MySum sumP;
    ret = sumP(num1);
    cout << ret << endl; 

    ret = sumP(num2);
    cout << ret << endl; 

	/* 10 */
    /* 30 */
    return 0;
}

 

MySum์ด๋ผ๋Š” ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ธ sumP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋‚ด๋ถ€์˜ operator() ํ•จ์ˆ˜๋ฅผ ()๋กœ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜์—ฌ

ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ธ sumRet์— ๋”ํ•œ ๊ฐ’์„ ๋ˆ„์ ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด ๋ง์ด๋‹ค

 

์ •๋ฆฌํ•˜์ž๋ฉด, ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

- ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ์Œ

- ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ณด๋‹ค ์†๋„๊ฐ€ ๋” ๋น ๋ฆ„ → ํ•จ์ˆ˜์˜ ์ธ๋ผ์ธํ™” ( ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ • )

 

์ž์‹ ์˜ ์“ฐ์ž„์ƒˆ์— ๋งž๊ฒŒ ์•Œ๋งž๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด์ž

 


๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ•จ์ˆ˜์˜ ์ธ๋ผ์ธ๊ณผ ๋žŒ๋‹ค๋ฅผ ๊ณต๋ถ€ํ•ด์„œ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค

์šฉ์–ด ์ •๋ฆฌ๋„ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Œ