Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++17 인라인 변수(inline variable)의 동작 원리와 활용법

C++에서는 inline 키워드를 함수에 적용할 수 있습니다. 그리고 C++17부터는 이 개념이 확장되어 인라인 변수(inline variable)가 새롭게 도입되었습니다.

인라인 변수는 여러 개의 번역 단위(translation unit)에서 정의될 수 있으며, 이때도 ODR(One Definition Rule, 단일 정의 규칙)을 준수합니다. 같은 변수가 여러 번 정의되더라도 컴파일러가 최종 프로그램에서 이를 하나의 객체로 병합해 주기 때문입니다.

C++17 이전의 한계점

C++17 이전 버전에서는 클래스 내부에서 정적(static) 멤버 변수를 직접 초기화할 수 없었습니다. 반드시 클래스 외부에서 별도로 정의해야 했으며, 이로 인해 헤더 파일 관리가 번거로워지고 다중 포함 시 링크 오류가 발생할 위험도 있었습니다.

예제 코드 1: C++17 이전 방식

#include<iostream>
using namespace std;
class MyClass {
    public:
        MyClass() {
            ++num;
        }
        ~MyClass() {
            --num;
        }
        static int num;
};
int MyClass::num = 10; // 클래스 외부에서 정의 및 초기화
int main() {
    cout<<"The static value is: " << MyClass::num;
}

실행 결과

The static value is: 10

위 코드처럼 C++17 이전에는 정적 멤버 변수를 클래스 선언부 밖에서 따로 정의하고 초기화해야 했습니다.

예제 코드 2: C++17 인라인 변수 활용

C++17에서는 inline 키워드를 사용하여 정적 멤버 변수를 클래스 내부에서 직접 초기화할 수 있습니다.

#include<iostream>
using namespace std;
class MyClass {
    public:
        MyClass() {
            ++num;
        }
        ~MyClass() {
            --num;
        }
        inline static int num = 10; // 클래스 내부에서 바로 초기화
};
int main() {
    cout<<"The static value is: " << MyClass::num;
}

실행 결과

The static value is: 10

정리

  • 인라인 변수는 여러 번역 단위에서 중복 정의되어도 컴파일러가 하나의 객체로 병합하므로 ODR 위반이 아닙니다.
  • C++17부터는 inline static을 사용해 클래스 내부에서 정적 멤버를 즉시 초기화할 수 있습니다.
  • 헤더 파일에 정적 변수를 선언만 하던 기존 방식보다 코드가 간결해지고 유지보수성이 크게 향상됩니다.