본문 바로가기

반응형
Notice
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

[Hello! c++] constexpr const char *에 대해서 본문

IN DEPTH CAKE/Coding-WIKI

[Hello! c++] constexpr const char *에 대해서

areum_ 2024. 4. 21. 20:52

 

 

 

안녕하세요. 오늘 포스팅에서 다룰 내용은 constexpr const char * 에 대한 이야기입니다.

이 요상하게 생긴 문법이 맞는 표현인지 이야기해보도록 하죠.

 

우선, constexpr이 뭔가?

 

constexpr는 일반적으로 const와 유사하지만, const 보다 좁은 개념으로 여겨집니다. 일단 알아둘 점은 constexpr를 쓰면 뒤에 오는 내용이 const라고 선언하는 것입니다. 그런점에서 const와 다를 게 없죠.

   그러면 두 개가 같은 건가요?

 

아니오, constexpr는 const로 대체가 가능하지만, const는 constexpr로 항상 대체될 수 있는 것이 아닙니다. 무슨말이냐면, constexpr는 const처럼 뒤에 오는 식이 변하지 않는 "constant (상수)"임을 의미한다는 점에서 같지만, 상수 값이 결정되는 시간이 반드시 컴파일타임이어야한다는 것이 내포되어있습니다. 반대로 const는 컴파일 타임일수도, 런타임일수도 있다는 데에서 차이가 있죠.

 

 

constexpr const char*은 맞는 표현일까?

 

그러면 이상합니다. constexpr const char*라는 표현은 마치 const const char*처럼 보이잖아요? 그렇다면 이 표현이 맞는걸까요? 여기서 주의할 점은 constexpr가 수식하는 (수식이라는 표현이 맞는지는 모르겠습니다만) 것은 const char* 전체라는 점입니다. 즉 뒤에 오는 포인터 타입을 const로 만든다는 거죠.

 

이를 다시 써보면 constexpr const char*const char* const와 같다는 말이 됩니다. (참고로, constexpr는 뒤의 * 뒤에 있는 const입니다.) 그렇기 때문에, 질문에 대한 답을 해보자면 "네, 맞는 표현입니다."

 

 

그렇다면, const char* const 는 어떤 의미일까?

 

const char *  char * const의 차이에 대해서 알고 계신가요? 알고 계시다면 이야기가 쉬워질 것 같습니다. 하지만 혹시 이 둘의 차이점이 가물가물하신 분을 위해 먼저 설명하고 넘어가도록 하겠습니다.

 

cost char * vs. char* const

일단, char *는 캐릭터 포인터입니다. 그리고 const 는 "constant (상수)"의 줄임말로, const가 적용된 대상을 변경할 수 없게 만들겠다는 의미를 내포합니다. 하지만 const의 위치가 어디에 붙느냐에 따라서 이 const라는 녀석이 어디에 적용되고 있는지가 달라집니다. 

 

const char*

는 (const char)*라고 읽으면 편합니다. 즉, constant character의 포인터라는 뜻이죠. 다시 말해서,

const char * pA = "ABC"; 라면 이 pA의 내용이 const라는 말입니다. "ABC" 자체가 값이 수정될 수 없다는 것을 내포하죠.

 

char a = 'A';
char b = 'B';

const char* ptr = &a;

*ptr = 'B';		// error
ptr = &b;	 	// valid

 

char* const

는 char *가 const라는 의미입니다. 다시 말해서, 포인터 변수 자체에 const가 적용된다는 말입니다. 이게 무슨 말이냐면, pointer 변수가 저장하고 있는 주소를 바꿀 수 없다는 뜻입니다.

 

char a = 'A';
char b = 'B';

char * const ptr = &a;
ptr = &b; 		// error
*ptr = 'C';		// valid

 

const char * const

 

따라서, const char * const는 constant character 값을 저장하면서 해당 포인터 변수의 주소 값이 바뀔 수 없음을 의미합니다. 한마디로 값을 수정하지도, 해당 포인터 변수가 가리키는 주소 자체를 업데이트하지도 못한다는 것을 의미합니다.

 

    const char * const ptr2 = &a;
    *ptr2 = "D";   // error
    ptr2 = &b;     // error

 

 

그럼 첫 질문으로 돌아가보겠습니다. constexpr char* const 는 어떻게 쓰는 걸까요? 일반적으로 값을 변경시키지 않을 constant character string을 저장할 때 씁니다. 

 

    char a = 'T';
    char* test = "ABC";
    constexpr const char* ptr_ = &a;    // error
    constexpr const char* ptr_ = test;  // error
    constexpr const char* ptr_ = 'A';   // error
    constexpr const char* ptr_ = "ABC"; // valid

 

 

대표적인 용례로 특정 클래스의 이름을 표현하고자할 때 static member variable로 선언해서 사용할 수 있겠네요.

 

class Module
{
	public:
		static constexpr const char* name = "Module Name";
}

 

 

 

 

 

반응형
Comments