std::bind
호출 대상에 인수 바인딩하기
std::bind은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
std::bind란 무엇인가요
std::bind는 기존 호출 가능 객체의 일부 인수를 고정하여 새로운 호출 가능 객체를 만듭니다. 이를 부분 적용이라고 합니다.
<functional>에 정의되어 있습니다.- 지정되지 않은 호출 가능 객체를 반환합니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = std::bind(add, 10, 5);
std::cout << add10() << '\n';
return 0;
}자리 표시자
std::placeholders::_1과 같은 자리 표시자는 바인딩된 객체가 호출될 때 나중에 제공할 인수를 표시합니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
auto add10 = std::bind(add, 10, _1);
std::cout << add10(7) << '\n';
return 0;
}인수 순서 바꾸기
자리 표시자는 어떤 순서로든 배치할 수 있으므로, 호출자가 제공하는 인수의 위치를 서로 바꿀 수 있습니다.
#include <iostream>
#include <functional>
int sub(int a, int b) { return a - b; }
int main() {
using namespace std::placeholders;
auto flipped = std::bind(sub, _2, _1);
std::cout << flipped(3, 10) << '\n';
return 0;
}여러 인수 바인딩하기
일부 인수는 자리 표시자로 남겨 두면서 여러 인수를 한 번에 고정할 수 있습니다.
#include <iostream>
#include <functional>
int volume(int l, int w, int h) { return l * w * h; }
int main() {
using namespace std::placeholders;
auto box = std::bind(volume, 2, _1, 5);
std::cout << box(3) << '\n';
return 0;
}결과 저장하기
std::bind가 반환하는 객체는 구체적이고 이름을 지정할 수 있는 형식을 위해 std::function에 저장할 수 있습니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
std::function<int(int)> add100 = std::bind(add, 100, _1);
std::cout << add100(1) << '\n';
return 0;
}멤버 함수 바인딩하기
std::bind는 멤버 포인터와 this를 위한 객체 또는 자리 표시자를 전달하여 멤버 함수를 대상으로 지정할 수 있습니다.
#include <iostream>
#include <functional>
struct Counter {
int add(int x) { return value += x; }
int value = 0;
};
int main() {
using namespace std::placeholders;
Counter c;
auto bump = std::bind(&Counter::add, &c, _1);
std::cout << bump(5) << ' ' << bump(3) << '\n';
return 0;
}값으로 바인딩하기와 참조로 바인딩하기
바인딩된 인수는 기본적으로 복사됩니다. 하나를 std::ref로 감싸 참조로 바인딩하면 변경 사항을 확인할 수 있습니다.
#include <iostream>
#include <functional>
void addTo(int& target, int amount) { target += amount; }
int main() {
using namespace std::placeholders;
int total = 0;
auto acc = std::bind(addTo, std::ref(total), _1);
acc(5);
acc(10);
std::cout << total << '\n';
return 0;
}알고리즘에서 바인딩된 호출 가능 객체 사용하기
바인딩된 호출 가능 객체는 표준 알고리즘에서 조건자나 연산으로 사용할 수 있습니다.
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
bool greaterThan(int x, int limit) { return x > limit; }
int main() {
using namespace std::placeholders;
std::vector<int> v = {1, 5, 8, 2, 9};
auto over4 = std::bind(greaterThan, _1, 4);
std::cout << std::count_if(v.begin(), v.end(), over4) << '\n';
return 0;
}bind 중첩하기
바인딩 표현식은 조합할 수 있지만, 이렇게 하면 곧 읽기 어려워집니다. 각 자리 표시자는 여전히 최종 호출자의 인수를 가리킵니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int times(int a, int b) { return a * b; }
int main() {
using namespace std::placeholders;
auto f = std::bind(add, std::bind(times, 2, _1), 3);
std::cout << f(5) << '\n';
return 0;
}추가 인수 무시하기
바인딩된 호출에서 일부 자리 표시자만 사용하는 경우, 호출할 때 전달된 추가 인수는 단순히 무시됩니다.
#include <iostream>
#include <functional>
int show(int a) { return a; }
int main() {
using namespace std::placeholders;
auto f = std::bind(show, _1);
std::cout << f(42, 99, 100) << '\n';
return 0;
}람다가 더 명확한 경우
현대 C++에서는 std::bind보다 람다를 선호하는 경우가 많습니다. 람다가 더 읽기 쉽고 컴파일러가 더 잘 최적화하기 때문입니다.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = [](int x) { return add(10, x); };
std::cout << add10(5) << '\n';
return 0;
}빠른 확인
자리 표시자에 대한 이해도를 확인해 보세요.
복습
std::bind의 작동 방식을 배웠습니다.
- 일부 인수를 고정하고 나머지 인수에는
_1,_2자리 표시자를 사용합니다. - 인수 순서를 바꾸고, 멤버 함수를 바인딩하고,
std::ref를 사용할 수 있습니다. - 결과를
std::function에 저장하고 알고리즘에서 사용할 수 있습니다. - 현대 C++에서는 람다가 더 명확한 경우가 많습니다.
다음에는 적절한 도구를 선택하기 위해 람다, bind, 함수 포인터를 비교합니다.
자주 묻는 질문
“std::bind” 강의는 무료인가요?
네 — “std::bind” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“std::bind”에서 뭘 배우나요?
호출 대상에 인수 바인딩하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“std::bind” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 함수 포인터
- std::function
- std::bind
- 호출 대상 선택하기