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

C++ std::is_class 템플릿 완벽 정리: 타입이 클래스인지 확인하는 방법

이 글에서는 C++ STL의 std::is_class 템플릿이 어떻게 동작하는지, 그리고 문법과 실제 사용 예제를 통해 자세히 살펴보겠습니다.

is_class 템플릿은 주어진 타입이 클래스(class) 타입인지 아니면 다른 타입인지를 컴파일 시점에 검사하는 데 사용되는 타입 특성(type trait)입니다.

클래스란 무엇인가?

클래스는 데이터 멤버와 멤버 함수를 포함할 수 있는 사용자 정의 데이터 타입 또는 데이터 구조로, class 키워드를 사용하여 선언합니다.

클래스 선언 예시

class abc {
    int data_members;
    void member_function();
};

즉, is_class 템플릿은 타입 T가 클래스인지 확인하고, 그 결과를 불리언 값(true 또는 false)으로 반환합니다.

문법(Syntax)

template <class T> is_class;

매개변수(Parameters)

이 템플릿은 타입 T 하나의 매개변수만 가질 수 있으며, 해당 타입이 클래스인지 아닌지를 검사합니다.

반환값(Return Value)

  • true: 주어진 타입이 클래스인 경우
  • false: 주어진 타입이 클래스가 아닌 경우

동작 원리 이해하기

Input: class abc {
};
is_class<abc>::value;
Output: true

Input: union abc {
};
is_class<abc>::value;
Output: false

위 예시에서 볼 수 있듯이, union으로 선언된 타입은 클래스가 아니므로 false가 반환됩니다.

예제 1: 클래스와 유니언 비교

#include <iostream>
#include <type_traits>
using namespace std;

class TP_1 {
};

union TP_2 {
    int var_1;
    float var_2;
};

int main() {
    cout << boolalpha;
    cout << "checking for is_class template: ";
    cout << "\nTP_1 class : " << is_class<TP_1>::value;
    cout << "\nTP_2 union : " << is_class<TP_2>::value;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

checking for is_class template:
TP_1 class : true
TP_2 union : false

예제 2: 클래스, 유니언, 구조체 비교

#include <iostream>
#include <type_traits>
using namespace std;

class TP_1 {
    int var_1;
    float var_2;
    char var_3;
};

union TP_2 {
    int var_1;
    float var_2;
    char var_3;
};

struct TP_3 {
    int var_1;
    float var_2;
    char var_3;
};

int main() {
    cout << boolalpha;
    cout << "checking for is_class template: ";
    cout << "\nTP_1 class : " << is_class<TP_1>::value;
    cout << "\nTP_2 union : " << is_class<TP_2>::value;
    cout << "\nTP_3 structure : " << is_class<TP_3>::value;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

checking for is_class template:
TP_1 class : true
TP_2 union : false
TP_3 structure : true

정리

C++에서 struct로 선언한 구조체도 내부적으로는 클래스로 취급되기 때문에 is_class의 결과가 true로 나타납니다. 반면 union은 클래스가 아닌 별도의 타입 분류에 속하므로 false가 반환됩니다. 이처럼 std::is_class는 템플릿 메타프로그래밍이나 조건부 컴파일 로직을 작성할 때 타입을 정확히 판별하는 데 유용하게 활용할 수 있습니다.