C-Style 정적 함수 (static function)
개요
C-Style static
함수는 선언된 소스 파일 내에서만 접근할 수 있는 내부 연결(internal linkage)을 갖는 함수입니다. 즉, 다른 소스 파일에서는 이 함수를 호출할 수 없으며, 마치 해당 파일의 비공개(private) 헬퍼 함수처럼 동작합니다. 이를 통해 전역 이름 공간(global namespace)의 오염을 방지하고, 여러 파일에서 동일한 이름의 함수를 사용하더라도 이름 충돌(name collision)을 피할 수 있습니다.
C++ 버전별 주요 키워드 도입 시기
- C++98 이전 (C언어로부터 계승):
static
키워드를 사용하여 파일 범위의 함수와 변수에 내부 연결을 지정하는 기능은 C언어에서부터 존재했으며, C++ 초기 버전부터 지원되었습니다. - C++11:
static
의 의미는 그대로 유지되지만, 모던 C++에서는 내부 연결을 위해static
함수보다 익명 네임스페이스(anonymous namespace) 사용을 더 권장하는 추세입니다.
내용 설명
일반적인 전역 함수는 외부 연결(external linkage)을 가집니다. 이는 링커(linker)가 다른 소스 파일에서 해당 함수의 정의를 찾아 연결할 수 있음을 의미합니다. 반면, 함수를 static
으로 선언하면 내부 연결로 변경되어 해당 함수의 유효 범위가 현재의 번역 단위(translation unit, 보통 소스 파일 하나)로 제한됩니다.
이러한 특징 때문에 static
함수는 해당 소스 파일 내부에서만 사용될 유틸리티 함수나 헬퍼 함수를 정의할 때 유용합니다.
예제 코드
#include <iostream>
#include <cstdint>
// static 함수: 이 cpp 파일에서만 유효한 내부 연결 함수
static std::uint64_t faculty(const std::uint8_t n)
{
auto result = std::uint64_t{1};
for (std::uint8_t i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
int main()
{
const auto value1 = faculty(5);
std::cout << value1 << "\n";
return 0;
}
실행 결과
120
활용팁
- 익명 네임스페이스(Anonymous Namespace) 사용: 모던 C++에서는 C-Style
static
함수보다 익명 네임스페이스를 사용하는 것이 더 권장됩니다. 익명 네임스페이스 안에 함수나 변수를 선언하면static
키워드를 사용한 것과 동일하게 내부 연결을 갖게 되며, 클래스나 타입 별칭 등 더 다양한 요소에 적용할 수 있어 유연성이 높습니다.// 익명 네임스페이스 활용 예시 namespace { // 이 함수는 외부에서 접근할 수 없다. std::uint64_t faculty_in_anonymous_ns(const std::uint8_t n) { // ... 구현 ... } }
- 캡슐화:
static
함수는 특정 소스 파일에 필요한 기능을 외부에 노출하지 않고 캡슐화하는 간단한 방법을 제공합니다. 이는 객체 지향 프로그래밍의 클래스만큼 강력하지는 않지만, 절차적 프로그래밍 스타일에서 코드의 모듈성을 높이는 데 도움이 됩니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : static local variables (98, 11) (0) | 2025.08.07 |
---|---|
Modern C++ : const vs constexpr (98, 11, 14, 17, 20) (0) | 2025.08.06 |
Modern C++ : type conversions (11, 14, 17, 20) (3) | 2025.08.05 |
Modern C++ : designated initializers (20) (0) | 2025.08.04 |
Modern C++ : enum concepts (11, 20) (1) | 2025.08.03 |
Modern C++ : enum vs enum class (98, 11) (1) | 2025.08.02 |
Modern C++ 둘러보기 (4) | 2025.08.01 |