교체 함수(replacement function)

교체 함수(replacement function)

구현(implementation)이 정의를 제공하는 일부 표준 함수는, 프로그램이 그 정의를 직접 바꿔치기할 수 있도록 열려 있어요. 이런 함수를 **교체 가능 함수(replaceable function)**라고 하고, 프로그램이 그 함수의 시그니처와 똑같은 시그니처로 직접 정의한 함수를 **교체 함수(replacement function)**라고 불러요. 교체 함수를 제공하면, 구현이 기본으로 제공하는 버전 대신 그 함수가 사용돼요. 이러한 교체는 프로그램 시작 전에 일어나요.

출처: cppreference

본문

조건

교체 함수의 선언이 다음 조건 중 하나라도 만족하지 않으면 프로그램은 ill-formed이며, 이때 진단은 필요 없어요(no diagnostic required).

  • inline이 아니다.
  • 전역 모듈(global module)에 붙어 있다(attached).
  • C++ 언어 연결(language linkage)을 가진다.
  • 교체 가능 함수와 같은 반환 타입을 가진다.
  • 교체 가능 함수가 표준 라이브러리 헤더에 선언되어 있다면, 그 헤더의 선언에 대한 올바른 재선언(redeclaration)이어야 한다.

핵심 언어(Core language)

계약 위반 처리기(contract-violation handler) ::handle_contract_violation이 교체 가능한지는 구현 정의(implementation-defined)다. (C++26부터)

표준 라이브러리(Standard library)

다음 표준 라이브러리 함수들은 교체 가능하며, 함수 의미에 대한 설명은 C++ 표준 라이브러리가 정의한 기본 버전과 프로그램이 정의한 교체 함수 양쪽 모두에 적용돼요.

  • 할당 함수(operator new)와 해제 함수(operator delete) — 프로그램이 ::operator new/::operator delete를 직접 정의하면 전역 할당·해제가 그 함수로 대체돼요.

예제

할당 함수를 교체해서, 실제로 new가 교체 버전을 부르는지 확인해 볼게요.

#include <cstddef>
#include <new>
#include <print>

// 교체 함수
void* operator new(std::size_t count)
{
    std::print("Replaced!");
    return nullptr;
}

int main()
{
    int* ptr = new int; // 프로그램이 정의한 교체 버전이 호출됨
}

출력:

Replaced!

new int를 실행하면 표준 라이브러리의 operator new 대신 프로그램이 정의한 교체 함수가 호출돼서 Replaced!가 출력돼요.

더 알아보기

  • inline 지정자: 교체 함수는 inline이면 안 되는 이유와 관련된 선언 규칙.
  • 모듈(modules): 전역 모듈에 붙은 선언이 교체 함수의 조건이 되는 이유.
  • 언어 연결(language linkage): C++ 언어 연결이 교체 함수에 요구되는 이유.