관리 메뉴

기억을 위한 기록들

[CPP] 함수 포인터와 람다의 관하여 본문

C & CPP

[CPP] 함수 포인터와 람다의 관하여

에드윈H 2025. 8. 11. 14:49

 

함수 포인터와 람다 함수는 모두 "함수를 다른 코드에 전달" 할 수 있게 해주는 역할을 하고 있다.

각각에 대해서 자세한 설명은 이 글에서 다루지 않고, 이 글에서는 각각의 특징 및 차이점에 대해 다룰 것이다.

우선 사용 예를 먼저 보면,

 

함수포인터 예:

#include <iostream>

void PrintMessage(const char* msg) 
{
    std::cout << msg << std::endl;
}

int main() 
{
    void (*funcPtr)(const char*) = &PrintMessage;
    funcPtr("Hello from function pointer!");
}

 

람다 예 :

#include <iostream>

int main() 
{
    int repeat = 3;
    auto lambdaFunc = [repeat](const char* msg) 
    {
        for (int i = 0; i < repeat; ++i) 
        {
            std::cout << msg << std::endl;
        }
    };
    lambdaFunc("Hello from lambda!");
}

 

 

정의 :

함수 포인터의 정의로는 함수의 주소를 저장하고 호출할 수 있는 변수이며, C 시절부터 존재했다.

람다 함수의 정의로는 코드 블록을 객체처럼 다를 수 있는 문법으로 C++11 이후에 도입되었다.

 

가독성 및 유지보수 :

함수포인터는 별도의 함수를 정의해야 하며, 시그니처(매개변수 타입)가 딱 맞아야 한다.

람다는 필요한 곳에 즉시 정의 가능하며 코드의 흐름을 깨지 않는다.

 

 

캡처(변수 접근) :

함수포인터는 외부 변수 접근 불가하며, 전역 변수나 static만 가능하다는 특징이 있고,

람다는 "[ ]" 캡처 리스트라는 것을 지정해 지역 변수도 안전하게 접근 가능하다.

 

타입 안정성 : 

함수 포인터는 잘못된 시그니처를 연결하면 런타임 오류 가능성이 있다.

람다는 auto나 std::function과 함께 쓰면 타입 안정성이 높다.

 

성능 :

단순 호출성능은 둘이 비슷하지만, 람다의 경우 캡처 방식에 따라 내부 구조가 객체와 되므로 오버헤드가 있을 가능성이 있다.

 


람다와 함수포인터 동시사용

람다 자체를 auto 변수에 담을 수도 있긴하지만 함수포인터에 담는 것도 가능하다. 제약 사항으로는 "캡처를 사용하지 않는 람다"라는 점이 있다.

int (*MyFunction)(int, int) = [](int a, int b) { return a + b; };

std::cout << MyFunction(100, 200) << std::endl;
// 300 출력

 

 

결론 :

함수 포인터 자체는 콜백, API 연동 등에서 유용하지만 현대 C++에서는 람다가 더 안전하고 직관적이긴 하다. 캡처 기능에 대해서 전역 변수 없이 상태를 유지하게 해 준다는 강점이 있다. 그리고 특징으로는 캡처 없는 람다는 컴파일러가 최적화해서 일반 함수 포인터처럼 동작한다고 한다.

 

 

 

참고 : 

https://hyo-ue4study.tistory.com/324

 

[CPP] 람다 표현식(Lambda Expression)이란? (Lambda 함수)

람다란???람다 표현식이란 함수나 함수 객체를 별도로 정의하지 않고, 필요한 지점에서 곧바로 함수를 직접 만들어 쓸 수 있는 일종의 익명 함수(이름 없는 함수라고도 할수 있을 것 같다? )혹은

hyo-ue4study.tistory.com