PHpullh

C++ · 심층 가이드

C++ 함수 완전 정리

C++ 함수를 값처럼 다루는 20개 예제로 오버로드 해석과 기본 인자, 가변 인자 템플릿, 람다 캡처, 그리고 함수를 돌려주는 함수까지 실제 코드로 확인합니다.

주제 20개 · 예제 코드 포함 · 최종 수정 2026-08-30 · 작성 pullh 편집팀

C++에서 이름 하나에는 여러 실체가 붙습니다. 오버로드 해석과 템플릿 인자 추론이 호출 지점에서 동시에 돌아가기 때문에, 다른 언어에서 넘어온 사람은 대개 "왜 하필 저 오버로드가 선택되는가"에서 먼저 막힙니다. 여기에 더해 매개변수를 값으로 받는지 const&로 받는지가 복사 비용과 수명까지 결정합니다. 그래서 C++에서 함수를 익히는 일은 사실상 값의 수명과 소유권을 익히는 일과 겹칩니다.

앞쪽 기본 함수 선언기본값 매개변수는 시그니처를 읽는 감각을 만드는 구간입니다. 가변 인자 합계부터는 파라미터 팩과 폴드 표현식이 등장하면서 컴파일 타임에 코드가 펼쳐진다는 감각이 붙습니다. 뒤쪽의 람다 함수, 클로저 카운터, 함수 팩토리, compose 함수는 한 줄기로 이어집니다. 캡처가 상태를 들고, 그 상태를 가진 호출 가능 객체를 반환하고, 다시 그것들을 합성하는 순서로 읽으면 좋습니다.

가장 자주 터지는 곳은 캡처입니다. [&]로 지역 변수를 참조 캡처한 람다를 함수 밖으로 돌려주면 그 참조는 이미 사라진 스택을 가리킵니다. 카운터처럼 상태를 들고 다녀야 한다면 값 캡처에 mutable을 붙이거나 캡처 초기화로 소유권을 람다 안에 옮겨야 합니다. 반환 타입도 습관적으로 std::function을 쓰면 타입 소거 때문에 힙 할당과 간접 호출이 따라붙으니, 합성이나 커링처럼 즉시 호출되는 자리에서는 auto로 받아 그대로 넘기는 편이 낫습니다.

01기본 함수 선언

C++에서 기본 함수 선언 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 기본 함수 선언
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(1, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

02두 값을 더하는 함수

C++에서 두 값을 더하는 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 두 값을 더하는 함수
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

03기본값 매개변수

C++에서 기본값 매개변수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 기본값 매개변수
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(3, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

04가변 인자 합계

C++에서 가변 인자 합계 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 가변 인자 합계
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

05객체 또는 구조체 반환

C++에서 객체 또는 구조체 반환 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 객체 또는 구조체 반환
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(5, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

06람다 함수

C++에서 람다 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 람다 함수
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

07클로저 카운터

C++에서 클로저 카운터 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 클로저 카운터
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(7, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

08재귀 팩토리얼

C++에서 재귀 팩토리얼 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 재귀 팩토리얼
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

09고차 함수 map

C++에서 고차 함수 map 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 고차 함수 map
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(9, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

10조건 함수 predicate

C++에서 조건 함수 predicate 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 조건 함수 predicate
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

11정렬용 비교 함수

C++에서 정렬용 비교 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 정렬용 비교 함수
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(11, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

12문자열 파서

C++에서 문자열 파서 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 문자열 파서
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

13함수 팩토리

C++에서 함수 팩토리 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 함수 팩토리
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(13, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

14메모이제이션

C++에서 메모이제이션 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 메모이제이션
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

15커링

C++에서 커링 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 커링
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(15, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

16compose 함수

C++에서 compose 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// compose 함수
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

17제네릭 함수

C++에서 제네릭 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 제네릭 함수
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(17, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

18콜백으로 완료 알림

C++에서 콜백으로 완료 알림 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 콜백으로 완료 알림
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

19reducer 함수

C++에서 reducer 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// reducer 함수
#include <iostream>

int add(int a, int b) { return a + b; }
int main() {
    std::cout << add(19, 2) << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

20파이프라인 함수

C++에서 파이프라인 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.

C++ code

// 파이프라인 함수
#include <functional>
#include <iostream>

std::function<int()> make_counter() { int current = 0; return [current]() mutable { return ++current; }; }
int main() {
    auto next = make_counter();
    std::cout << next() << "\n";
}
알아두면 좋은 점

매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.

자주 하는 실수

함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.

정리하며

  • 매개변수를 값으로 받을지 const 참조로 받을지가 복사 비용과 수명을 함께 결정합니다
  • 람다를 반환할 때 참조 캡처는 금지에 가깝고, 값 캡처나 캡처 초기화로 소유권을 옮깁니다
  • 가변 인자는 파라미터 팩과 폴드 표현식으로 처리하면 런타임 분기 없이 펼쳐집니다
  • 합성과 커링 자리에서는 std::function 대신 auto로 받아 타입 소거 비용을 피합니다

더 깊이 들어가고 싶다면 C++ 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.