이 글에서는 C++ STL에서 제공하는 std::is_empty 템플릿의 동작 원리, 문법 그리고 실제 사용 예제를 살펴보겠습니다.
is_empty는 <type_traits> 헤더 파일에 정의된 템플릿으로, 주어진 클래스 T가 빈(empty) 클래스인지 여부를 컴파일 타임에 확인하는 데 사용됩니다.
빈 클래스란 무엇일까요?
클래스 내부에 어떠한 데이터도 저장되어 있지 않은 경우 해당 클래스를 '빈 클래스'라고 합니다. 빈 클래스는 다음 조건을 모두 만족해야 합니다.
- 길이가 0인 비트 필드(bit-field)를 제외하고 비정적(non-static) 데이터 멤버가 없어야 합니다.
- 가상 기반 클래스(virtual base class)나 가상 함수(virtual function)가 없어야 합니다.
- 기반 클래스(base class)가 없어야 합니다.
문법(Syntax)
template <class T> is_empty;
매개변수
이 템플릿은 클래스 타입 T를 매개변수로 하나만 받으며, 해당 클래스 T가 빈 클래스인지 아닌지를 검사합니다.
반환값
불리언(Boolean) 값을 반환합니다. 주어진 타입이 빈 클래스이면 true, 빈 클래스가 아니면 false를 반환합니다.
예제 1: 기본 동작 확인
Input: class A{};
is_empty<A>::value;
Output: true
Input: class B{ void fun() {} };
is_empty<B>::value;
Output: true
클래스 B는 멤버 함수만 가지고 있지만, 멤버 함수는 객체에 저장 공간을 차지하지 않으므로 여전히 빈 클래스로 판단됩니다.
예제 2: 클래스(class)와 함께 사용하기
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
};
class TP_2 {
int var;
};
class TP_3 {
static int var;
};
class TP_4 {
~TP_4();
};
int main() {
cout << boolalpha;
cout << "멤버 변수가 없는 클래스 검사 결과: " << is_empty<TP_1>::value;
cout << "\n멤버 변수가 하나 있는 클래스 검사 결과: " << is_empty<TP_2>::value;
cout << "\n정적(static) 멤버 변수가 있는 클래스 검사 결과: " << is_empty<TP_3>::value;
cout << "\n소멸자가 있는 클래스 검사 결과: " << is_empty<TP_4>::value;
return 0;
}
실행 결과
멤버 변수가 없는 클래스 검사 결과: true
멤버 변수가 하나 있는 클래스 검사 결과: false
정적(static) 멤버 변수가 있는 클래스 검사 결과: true
소멸자가 있는 클래스 검사 결과: true
예제 3: 구조체(struct)와 함께 사용하기
#include <iostream>
#include <type_traits>
using namespace std;
struct TP_1 {
};
struct TP_2 {
int var;
};
struct TP_3 {
static int var;
};
struct TP_4 {
~TP_4();
};
int main() {
cout << boolalpha;
cout << "멤버 변수가 없는 구조체 검사 결과: " << is_empty<TP_1>::value;
cout << "\n멤버 변수가 하나 있는 구조체 검사 결과: " << is_empty<TP_2>::value;
cout << "\n정적(static) 멤버 변수가 있는 구조체 검사 결과: " << is_empty<TP_3>::value;
cout << "\n소멸자가 있는 구조체 검사 결과: " << is_empty<TP_4>::value;
return 0;
}
실행 결과
멤버 변수가 없는 구조체 검사 결과: true
멤버 변수가 하나 있는 구조체 검사 결과: false
정적(static) 멤버 변수가 있는 구조체 검사 결과: true
소멸자가 있는 구조체 검사 결과: true
결과 분석 및 정리
실행 결과를 통해 is_empty의 판별 기준을 명확히 이해할 수 있습니다.
- TP_1: 멤버가 전혀 없으므로 true를 반환합니다.
- TP_2: int형 멤버 변수 var가 존재하여 실제 데이터를 저장하고 있으므로 false를 반환합니다.
- TP_3: 정적(static) 멤버 변수는 개별 객체가 아니라 클래스 자체에 속하므로 객체 크기에 영향을 주지 않아 true를 반환합니다.
- TP_4: 소멸자를 포함한 생성자·멤버 함수는 객체에 저장 공간을 차지하지 않으므로 true를 반환합니다.
이처럼 std::is_empty는 템플릿 메타프로그래밍이나 EBO(Empty Base Optimization, 빈 기반 클래스 최적화) 같은 메모리 최적화 기법에서 매우 유용하게 활용됩니다.