์ƒˆ์†Œ์‹

IN DEPTH CAKE/Coding-WIKI

[Hello! c++] constexpr const char *์— ๋Œ€ํ•ด์„œ

  • -
๋ฐ˜์‘ํ˜•

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฐ ๋‚ด์šฉ์€ 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";
}

 

 

 

 

 

๋

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# ๋กœ๋”ฉ ํ™”๋ฉด ๋™์ž‘ ์ฝ”๋“œ(Code) ์„ค์ •ํ•˜๊ธฐ