0Pricing
C++ Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 포인터
  2. std::function
  3. std::bind
  4. 호출 대상 선택하기
← C++ Academy(으)로 돌아가기