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을 사용해 클래스 내부에서 정적 멤버를 즉시 초기화할 수 있습니다. - 헤더 파일에 정적 변수를 선언만 하던 기존 방식보다 코드가 간결해지고 유지보수성이 크게 향상됩니다.