본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : C-Style static function (98, 11)

by snowoods 2025. 8. 8.

Modern C++

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 함수는 특정 소스 파일에 필요한 기능을 외부에 노출하지 않고 캡슐화하는 간단한 방법을 제공합니다. 이는 객체 지향 프로그래밍의 클래스만큼 강력하지는 않지만, 절차적 프로그래밍 스타일에서 코드의 모듈성을 높이는 데 도움이 됩니다.