0Pricing
C++ Academy · 강의

함수 포인터

함수를 인수로 전달하기

함수 포인터은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

함수 포인터란 무엇인가요

함수 포인터는 함수의 주소를 저장하므로 함수를 간접적으로 호출하거나 데이터처럼 전달할 수 있습니다.

  • 형식에 함수 시그니처가 인코딩됩니다.
  • 함수가 동작을 매개변수로 받을 수 있게 합니다.
#include <iostream>

int add(int a, int b) { return a + b; }

int main() {
    int (*op)(int, int) = add;
    std::cout << op(3, 4) << '\n';
    return 0;
}

형식 선언하기

int (*op)(int, int) 선언은 다음과 같이 읽습니다. op는 두 개의 int를 받아 int를 반환하는 함수의 포인터입니다. *op 주위의 괄호는 반드시 필요합니다.

#include <iostream>

int square(int x) { return x * x; }

int main() {
    int (*fn)(int) = square;
    std::cout << fn(5) << '\n';
    return 0;
}

포인터를 통해 호출하기

함수 포인터는 함수 자체를 호출하는 것과 똑같이 호출합니다. 명시적으로 역참조할 수도 있지만, 그렇게 해야 하는 경우는 거의 없습니다.

#include <iostream>

void greet() { std::cout << "Hello\n"; }

int main() {
    void (*g)() = greet;
    g();
    (*g)();
    return 0;
}

함수를 인수로 전달하기

함수는 함수 포인터 매개변수를 받을 수 있으므로 호출자가 사용자 지정 동작을 연결할 수 있습니다.

#include <iostream>

int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }

int main() {
    std::cout << apply(10, doubler) << '\n';
    return 0;
}

실행 중에 선택하기

함수 포인터는 변수이므로 프로그램이 실행되는 동안 호출할 함수를 결정할 수 있습니다.

#include <iostream>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main() {
    bool wantAdd = true;
    int (*op)(int, int) = wantAdd ? add : sub;
    std::cout << op(8, 3) << '\n';
    return 0;
}

함수 포인터 배열

여러 함수 포인터를 배열에 저장하면 값으로 인덱싱하는 간단한 디스패치 테이블을 만들 수 있습니다.

#include <iostream>

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

int main() {
    int (*ops[2])(int, int) = {add, mul};
    std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
    return 0;
}

typedef 사용하기

포인터 문법은 복잡합니다. typedef 또는 using 별칭을 사용하면 형식에 읽기 쉬운 이름을 지정할 수 있습니다.

#include <iostream>

using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }

int main() {
    BinOp op = add;
    std::cout << op(6, 7) << '\n';
    return 0;
}

알고리즘에서 함수 포인터 사용하기

표준 알고리즘은 호출 가능 객체를 받고, 일반 함수도 호출 가능 객체로 사용할 수 있습니다. 여기서는 조건자가 짝수를 셉니다.

#include <iostream>
#include <vector>
#include <algorithm>

bool isEven(int n) { return n % 2 == 0; }

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    int c = std::count_if(v.begin(), v.end(), isEven);
    std::cout << "Evens: " << c << '\n';
    return 0;
}

제한 사항: 상태 없음

일반 함수 포인터는 캡처한 데이터를 담을 수 없습니다. 호출 사이에 문맥을 기억해야 한다면 전역 변수를 사용하거나 더 풍부한 호출 가능 객체로 전환해야 합니다.

#include <iostream>

int counter = 0;
int next() { return ++counter; }

int main() {
    int (*fn)() = next;
    std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
    return 0;
}

캡처가 없는 람다의 변환

아무것도 캡처하지 않는 람다는 일치하는 함수 포인터로 암시적으로 변환될 수 있으므로, 작은 인라인 함수에 유용합니다.

#include <iostream>

int main() {
    int (*fn)(int) = [](int x) { return x + 100; };
    std::cout << fn(1) << '\n';
    return 0;
}

널 함수 포인터

함수 포인터는 nullptr일 수 있으며, 이는 아무것도 가리키지 않는다는 뜻입니다. 정의되지 않은 동작을 피하려면 호출하기 전에 항상 확인하세요.

#include <iostream>

int main() {
    int (*fn)(int) = nullptr;
    if (fn) {
        std::cout << fn(5) << '\n';
    } else {
        std::cout << "No function set\n";
    }
    return 0;
}

빠른 확인

함수 포인터의 제한 사항에 대한 이해도를 확인해 보세요.

복습

함수 포인터에 대해 배웠습니다.

  • 함수의 주소를 보유하며 함수처럼 호출됩니다.
  • 동작을 매개변수로 전달하고 디스패치 테이블을 만들 수 있습니다.
  • 별칭을 사용하면 형식을 읽기 쉽게 만들 수 있습니다.
  • 상태를 담을 수 없지만, 캡처가 없는 람다는 함수 포인터로 변환됩니다.

다음에는 상태가 있는 호출 가능 객체를 비롯해 모든 호출 가능 객체를 저장할 수 있는 std::function을 살펴봅니다.

자주 묻는 질문

“함수 포인터” 강의는 무료인가요?

네 — “함수 포인터” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“함수 포인터”에서 뭘 배우나요?

함수를 인수로 전달하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“함수 포인터” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

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