이 포스팅은 Object Oriented Programming 시리즈 23 편 중 22 번째 글 입니다.

  • Part 1 - 01: Introduction
  • Part 2 - 02: Identifier, Variable, constant, Std IO, Operator
  • Part 3 - 03: Functions #1 - Calling (호출)
  • Part 4 - 04: Functions #2 - Local, Global Variable
  • Part 5 - 05: Functions #3 - Recursion Function, Reference Variable (재귀함수)
  • Part 6 - 06: Functions #4 - Reference Variable vs. Pointer
  • Part 7 - 07: Functions #5 - CallbyValue, CallbyReference
  • Part 8 - 08: Selection and Repetition
  • Part 9 - 09: File Input & Output (파일입출력)
  • Part 10 - 10: String library, rand(), srand()
  • Part 11 - 11: Pointer, Function Pointer
  • Part 12 - 12: Array, Vector (정적배열, 동적배열)
  • Part 13 - 13: class, object
  • Part 14 - 14: this, operator overloading
  • Part 15 - 15: friend, static, destructor
  • Part 16 - 16: Inherence (상속)
  • Part 17 - 17: Static Binding, Dynamic Binding, Header File
  • Part 18 - 18: Generic Programming, Template
  • Part 19 - 19: List Container
  • Part 20 - 20: Iterator (반복자)
  • Part 21 - 21: algorithm Library
  • Part 22 - This Post
  • Part 23 - 22: Exception handling
▼ 목록 보기

functional library

Lambda function

함수 안에서 부를 수 있는 Local function! 사실 정체는 객체이지만, 우리는 함수의 개념으로 갖다 쓴다!

Usage

[closure](입력 매개변수)->출력 type{내용}

Local function 이기 때문에 만들어졌다가 리턴 후 사라진다.

Example

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

int evaluate(int(*func)(int, int), int x, int y){

    return func(x, y);
}

int main(){
    // sum: [](int x, int y)->int{return x + y;}
    cout << evaluate([](int x, int y)->int{return x + y;}, 2, 3) << endl;

    // mult: [](int x, int y)->int{return x*y;}
    // mult: [](int x, int y){return x*y;} 굳이 안적어도돼 너무 명확해서
    cout << evaluate([](int x, int y){return x * y;}, 2, 3) << endl;

    // lambda 함수를 바로 생성해서 호출
    [](int x, int y){cout << x << ", " << y << endl;}(2,3);

    auto f  = [](int x, int y)->int{return x - y;};
    cout << f(3, 5) << endl;

}

evaluate 함수는 함수 포인터와, 인자 두개를 받아, 해당하는 함수를 리턴해주는 함수이다. main 함수 내에서 즉석으로 내가 원하는 함수를 만들고, evaluate 함수를 사용하고 싶다면, Lambda function 을 사용하면 된다!

closure

우리가 기존에 함수를 만들 때, 람다 함수를 사용할 때 우리는 이걸 함수처럼 사용한다. 즉, 입력 파라미터를 제외하고는 함수의 구현부에서 다른 변수를 사용할 수 없었다.

하지만 람다함수의 경우, 입력 파라미터이외의 변수를 읽어올 수 있다. 람다 함수가 특정 함수의 지역 함수 처럼 사용되기 때문인데, 람다함수가 속해있는 함수의 변수를 가져와 사용할 수 있다. 이 점 때문에, 글의 도입부에서 람다함수의 정체는 객체라고 했던 것이다! 함수의 모양을 하고 있지만, 클래스 구성이 객체처럼 되어 있다.(뇌피셜) 사용예는 다음과 같다.

int evaluate(int(*func)(int, int), int x, int y){
    return func(x, y);
}

int main(){
    int a;
    cin >> a;
    // [](int x, int y){return x*y;}

    // [closure]: capturing variables
    // [] 안에 변수를 넣으면 이 람다 함수내에서 사용할 수 있다.
    // 원래는 인풋파라미터만 사용가능했는데 , 외부 변수를 가져올 수 있다는 것
    // [a] : 변수 a를 call by value 로 함수에 전달
    // [&a] : 변수 a를 call by reference로 함수에 전달
    // [=]: 모든 주위 변수를 call by value로 함수에 전달
    // [&]: 모든 주우 변수를 call by reference로 함수에 전달

    cout << evaluate([a](int x, int y){return a*x*y;}, 2, 3) << endl;

    return 0;
}

Function Object

우리가 위에서 구현한 evaluate 함수에서, 함수 포인터로 첫번째 인자를 주었다. 그런데, 포인터를 사용해서 나타내는 것은 위험하므로, 우리는 이것을 표현할 수 있는 객체를 만들어 관리하는 것이 보다 안전하다. 이 것을 가능하게 하는 객체가 function 이다.

사용방법

function<출력자료형<입력자료형1, 입력자료형2...>함수 이름
int evaluate2(function<int(int, int)>func , int x, int y){
    return func(x, y);
}