std::function
호출 가능한 모든 대상 저장하기
std::function은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
std::function이란 무엇인가요
std::function은 주어진 시그니처와 일치하는 모든 호출 가능 객체를 담을 수 있는 형식 소거 래퍼입니다. 자유 함수, 람다, 함수 객체 또는 바인딩된 표현식이 여기에 해당합니다.
- 대상 시그니처를 사용하여 선언합니다.
<functional>에 정의되어 있습니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
std::function<int(int, int)> f = add;
std::cout << f(2, 3) << '\n';
return 0;
}람다 저장하기
일반 함수 포인터와 달리 std::function은 캡처가 있는 람다도 문제없이 저장합니다.
#include <iostream>
#include <functional>
int main() {
int offset = 10;
std::function<int(int)> f = [offset](int x) { return x + offset; };
std::cout << f(5) << '\n';
return 0;
}함수 객체 저장하기
함수 객체는 operator()를 가진 객체입니다. std::function은 함수 객체를 감싸고, 호출될 때 해당 연산자를 호출할 수 있습니다.
#include <iostream>
#include <functional>
struct Multiplier {
int factor;
int operator()(int x) const { return x * factor; }
};
int main() {
std::function<int(int)> f = Multiplier{3};
std::cout << f(4) << '\n';
return 0;
}대상 다시 할당하기
하나의 std::function 변수는 수명 동안 서로 다른 호출 가능 객체를 가리킬 수 있으므로, 실행 중에 동작을 교체할 때 유용합니다.
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> f = [](int x) { return x + 1; };
std::cout << f(10) << '\n';
f = [](int x) { return x * x; };
std::cout << f(10) << '\n';
return 0;
}비어 있는 std::function
기본 생성된 std::function은 아무것도 담지 않습니다. 이를 호출하면 std::bad_function_call이 발생하므로 먼저 확인해야 합니다.
#include <iostream>
#include <functional>
int main() {
std::function<void()> f;
if (f) {
f();
} else {
std::cout << "empty\n";
}
return 0;
}매개변수로 사용하기
함수는 std::function 매개변수를 받아 일치하는 모든 호출 가능 객체를 수용할 수 있으므로, 유연한 API를 만들 수 있습니다.
#include <iostream>
#include <functional>
void repeat(int n, const std::function<void(int)>& action) {
for (int i = 0; i < n; ++i) action(i);
}
int main() {
repeat(3, [](int i) { std::cout << "step " << i << '\n'; });
return 0;
}콜백 저장하기
일반적인 사용 방법은 클래스 멤버에 콜백을 보관해 두었다가 이벤트가 발생했을 때 나중에 호출하는 것입니다.
#include <iostream>
#include <functional>
struct Button {
std::function<void()> onClick;
void click() { if (onClick) onClick(); }
};
int main() {
Button b;
b.onClick = [] { std::cout << "clicked!\n"; };
b.click();
return 0;
}호출 가능 객체의 벡터
호출 가능 객체는 하나의 형식을 공유하므로 서로 다른 호출 가능 객체를 컨테이너에 함께 저장하고 차례로 호출할 수 있습니다.
#include <iostream>
#include <functional>
#include <vector>
int inc(int x) { return x + 1; }
int main() {
std::vector<std::function<int(int)>> ops;
ops.push_back(inc);
ops.push_back([](int x) { return x * 2; });
for (auto& op : ops) std::cout << op(10) << ' ';
std::cout << '\n';
return 0;
}형식 소거의 비용
std::function은 메모리를 할당할 수 있고 간접 호출을 추가하므로, 직접 호출이나 템플릿 기반 호출 가능 객체보다 약간 느립니다. 균일한 저장이 필요할 때 사용하세요.
#include <iostream>
#include <functional>
int main() {
std::function<int()> f = [] { return 42; };
int total = 0;
for (int i = 0; i < 5; ++i) total += f();
std::cout << total << '\n';
return 0;
}std::function 반환하기
팩토리는 설정된 호출 가능 객체를 만들어 반환할 수 있으므로, 호출자가 사용자 지정 동작을 얻을 수 있습니다.
#include <iostream>
#include <functional>
std::function<int(int)> adder(int n) {
return [n](int x) { return x + n; };
}
int main() {
auto add5 = adder(5);
std::cout << add5(10) << '\n';
return 0;
}함수 포인터와 비교하기
std::function은 상태를 저장하므로 함수 포인터보다 유연하지만, 그 유연성 때문에 성능이 조금 저하되고 메모리 할당이 발생할 수도 있습니다.
#include <iostream>
#include <functional>
int main() {
int base = 7;
std::function<int(int)> stateful = [base](int x) { return x + base; };
std::cout << "Stateful result: " << stateful(3) << '\n';
return 0;
}빠른 확인
std::function에 대한 이해도를 확인해 보세요.
복습
std::function에 대해 다음을 배웠습니다.
- 상태가 있는 람다와 함수 객체를 포함해 시그니처와 일치하는 모든 호출 가능 객체를 감쌉니다.
- 다시 할당하거나 컨테이너에 저장하거나 팩토리에서 반환할 수 있습니다.
- 비어 있을 때
bad_function_call을 발생시킵니다. - 형식 소거로 인해 약간의 오버헤드가 발생합니다.
다음에는 호출 가능 객체의 인수를 미리 채우는 std::bind를 사용합니다.
자주 묻는 질문
“std::function” 강의는 무료인가요?
네 — “std::function” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“std::function”에서 뭘 배우나요?
호출 가능한 모든 대상 저장하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“std::function” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 함수 포인터
- std::function
- std::bind
- 호출 대상 선택하기