이번 포스트에서는 C++에서 사용자 정의 리터럴(User-defined literals)을 사용하는 방법과 이들의 정의에 대해 알아보겠습니다. 사용자 정의 리터럴은 특정 접미사를 사용하여 특정 타입의 값을 생성할 수 있게 해주는 기능입니다. 예제 코드를 통해 이러한 개념들을 한 줄 한 줄 분석해 보겠습니다.
#include <iostream>
#include <chrono>
iostream
: 표준 입출력 스트림을 위한 헤더 파일입니다.chrono
: 시간 관련 기능을 제공하는 표준 라이브러리로, std::chrono::duration
과 같은 시간 단위들을 다룹니다.using namespace std;
Length
클래스 정의class Length
{
private:
const long double _value;
Length(long double value) : _value(value)
{
}
Length
클래스:_value
: 길이의 값을 저장하는 long double
타입의 상수 멤버 변수입니다.Length(long double value)
: 주어진 값을 _value
에 저장하는 private 생성자입니다. private으로 설정되어 외부에서 직접 생성할 수 없고, 사용자 정의 리터럴을 통해서만 객체를 생성할 수 있습니다. friend Length operator"" _m(unsigned long long value);
friend Length operator"" _m(long double value);
friend Length operator"" _km(unsigned long long value);
friend Length operator"" _km(long double value);
friend Length operator"" _mm(unsigned long long value);
friend Length operator"" _mm(long double value);
friend Length operator"" _cm(unsigned long long value);
friend Length operator"" _cm(long double value);
_m
, _km
, _mm
, _cm
)을 클래스 외부에서 정의할 수 있게끔 Length
클래스의 친구 함수로 선언합니다. 이를 통해 이 함수들은 클래스의 private 멤버에 접근할 수 있습니다.public:
long double m() const { return _value; }
long double km() const { return _value * 0.001; }
long double mm() const { return _value * 1000; }
long double cm() const { return _value * 100; }
m()
: _value
를 미터 단위로 반환합니다.km()
: _value
를 킬로미터 단위로 변환하여 반환합니다.mm()
: _value
를 밀리미터 단위로 변환하여 반환합니다.cm()
: _value
를 센티미터 단위로 변환하여 반환합니다. Length operator+() const
{
return Length(_value);
}
Length operator-() const
{
return Length(-_value);
}
Length operator+(const Length& length) const
{
return Length(_value + length._value);
}
Length operator-(const Length& length) const
{
return Length(_value - length._value);
}
};
operator+()
: 양수 값을 반환하는 단항 +
연산자입니다.operator-()
: 음수 값을 반환하는 단항 -
연산자입니다.operator+(const Length& length)
: 두 Length
객체의 값을 더하는 이항 +
연산자입니다.operator-(const Length& length)
: 두 Length
객체의 값을 빼는 이항 -
연산자입니다.Length operator"" _m(unsigned long long value)
{
return Length(value);
}
Length operator"" _m(long double value)
{
return Length(value);
}
_m
사용자 정의 리터럴:operator"" _m(unsigned long long value)
: 정수 타입의 값을 받아 미터 단위의 Length
객체를 생성합니다.operator"" _m(long double value)
: 부동소수점 타입의 값을 받아 미터 단위의 Length
객체를 생성합니다.Length operator"" _km(unsigned long long value)
{
return Length(value * 1000L);
}
Length operator"" _km(long double value)
{
return Length(value * 1000L);
}
_km
사용자 정의 리터럴:operator"" _km(unsigned long long value)
: 정수 타입의 값을 받아 킬로미터를 미터로 변환하여 Length
객체를 생성합니다.operator"" _km(long double value)
: 부동소수점 타입의 값을 받아 킬로미터를 미터로 변환하여 Length
객체를 생성합니다.Length operator"" _mm(unsigned long long value)
{
return Length(value * 0.001L);
}
Length operator"" _mm(long double value)
{
return Length(value * 0.001L);
}
_mm
사용자 정의 리터럴:operator"" _mm(unsigned long long value)
: 정수 타입의 값을 받아 밀리미터를 미터로 변환하여 Length
객체를 생성합니다.operator"" _mm(long double value)
: 부동소수점 타입의 값을 받아 밀리미터를 미터로 변환하여 Length
객체를 생성합니다.Length operator"" _cm(unsigned long long value)
{
return Length(value * 0.01L);
}
Length operator"" _cm(long double value)
{
return Length(value * 0.01L);
}
_cm
사용자 정의 리터럴:operator"" _cm(unsigned long long value)
: 정수 타입의 값을 받아 센티미터를 미터로 변환하여 Length
객체를 생성합니다.operator"" _cm(long double value)
: 부동소수점 타입의 값을 받아 센티미터를 미터로 변환하여 Length
객체를 생성합니다.main
함수 설명int main()
{
// 표준 라이브러리에서 사용하는 사용자 정의 리터럴
chrono::minutes m = 24h + 5min;
cout << m.count() << endl;
24h
와 5min
은 C++ 표준 라이브러리 chrono
에서 제공하는 시간 단위 사용자 정의 리터럴입니다.chrono::minutes m = 24h + 5min;
은 24시간과 5분을 더한 값을 분 단위로 계산합니다. 결과는 m.count()
를 통해 출력됩니다. Length len = 1_m + 1_km + 1_cm + 1_mm;
cout.precision(16);
cout << len.m() << endl;
cout << len.km() << endl;
cout << len.cm() << endl;
cout << len.mm() << endl;
}
Length len = 1_m + 1_km + 1_cm + 1_mm;
: 1미터, 1킬로미터, 1센티미터, 1밀리미터를 더하여 Length
객체를 생성합니다.cout.precision(16);
: 출력 시 소수점 이하 16자리까지 표현되도록 설정합니다.cout << len.m() << endl;
: len
객체의 길이를 미터 단위로 출력합니다.cout << len.km() << endl;
: len
객체의 길이를 킬로미터 단위로 출력합니다.cout << len.cm() << endl;
: len
객체의 길이를 센티미터 단위로 출력합니다.cout << len.mm() << endl;
: len
객체의 길이를 밀리미터 단위로 출력합니다.정의 방법:
operator""
키워드를 사용하여 정의됩니다._m
, _km
)를 통해 특정 타입의 값을 생성할 수 있습니다.unsigned long long
) 또는 부동소수점(long double
) 값을 매개변수로 받아 처리할 수 있습니다.사용 방법:
을 사용하면, 해당 접미사를 사용하여 객체를 생성할 수 있습니다. 예를 들어, 1_m
, 1_km
와 같은 표현은 각각 미터와 킬로미터 단위의 Length
객체를 생성합니다.
이 포스트에서는 C++에서 사용자 정의 리터럴을 정의하고 사용하는 방법에 대해 살펴보았습니다. 사용자 정의 리터럴은 특정 단위나 타입을 보다 직관적으로 표현할 수 있도록 도와주며, 특히 단위 변환이나 시간 계산 등에서 유용하게 활용될 수 있습니다. 이번 예제를 통해 사용자 정의 리터럴의 개념을 이해하고 실무에 적용할 수 있기를 바랍니다!