[C++] C++17 variant

variant๋Š” ์ง„ํ™”๋œ ๊ณต์šฉ์ฒด๋‹ค.

๊ธฐ์กด์˜ union์€ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด์˜ union์„ ์“ธ ๋•Œ,
double ๋ฒ„์ „์œผ๋กœ ๊ฐ’์„ ๋„ฃ๊ณ  int ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉ์„ ํ•œ๋‹ค ํ•ด๋„ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ ์—†์ด ์ž‘๋™์ด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ถœ๋ ฅ๊ฐ’์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ฐ’์ด ์ •์ƒ์ ์ด์ง€ ์•Š๋‹ค.

C์˜ ๊ณต์šฉ์ฒด๋Š” ์•„๋ฌด๋Ÿฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋•Œ๋ฌธ์— C์˜ ๊ณต์šฉ์ฒด๋Š” ํƒ€์ž…-safeํ•˜์ง€ ๋ชปํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

์•„๋ฌดํŠผ ์ €๋Ÿฐ ๋ง›์ด ๊ฐ„ ์ถœ๋ ฅ๊ฐ’์ด ๋‚˜์˜จ ์ด์œ ๋Š” ์•„๋ฌด๋Ÿฐ ์กฐ์น˜ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋น„ํŠธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ฝ์–ด์™”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ •์ˆ˜ ํƒ€์ž…๊ณผย ์‹ค์ˆ˜ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์—”๋””์–ธ๊ณผ ๋ฐ”์ดํŠธ ํฌ๊ธฐ๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ™์€ ๊ณ„์—ด์˜ ํƒ€์ž…์ด๋ผ๋„ ๊ดด๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๋ฌผ๋ก  ์ด๋Ÿฐ๊ฑธ ์ด์šฉํ•ด์„œ ํŽธ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ,
์‹ค์ œ๋กœ ์ด๋Ÿฐ ์‹์˜ ์ ‘๊ทผ์€, 99% ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ˆ˜๋Š” ๊ฒฐํ•จ์œผ๋กœ ์ด์–ด์ง„๋‹ค.
union์€ ์ด์ฒ˜๋Ÿผ ์•ˆ์ „์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋งŽ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ๊ธฐ์กด์˜ union์€ ์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž/๊ฐ€์ƒ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ์ด๋ฅธ๋ฐ” POD ํƒ€์ž…๋งŒ์„ ๋ฉค๋ฒ„๋กœ ๋‘˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์‹ฌ๊ฐํ•œ ๊ธฐ๋Šฅ์  ๊ฒฐํ•จ์ด ์žˆ์—ˆ๋‹ค.
๋‹ค์‹œ๋งํ•ด C++์Šคํƒ€์ผ์˜ ํƒ€์ž…์€ ์ œ๋Œ€๋กœ ๋‹ด์•„๋‘˜์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


C++17์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ variant๋ผ๋Š” ๋ฉ‹์ง„ ๋…€์„์„ ๋‚ด๋†“์•˜๋‹ค.

variant๋Š” ํƒ€์ž…-safeํ•œ ๊ณต์šฉ์ฒด ํ…œํ”Œ๋ฆฟ์ด๋‹ค.
๋‹น์—ฐํžˆ C++ ์Šคํƒ€์ผ์˜ ํด๋ž˜์Šค๋„ ๋ฉค๋ฒ„๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด์˜ ๊ณต์šฉ์ฒด์™€ ๋‹ค๋ฅธ ํŠน์ง•์œผ๋กœ, ์ด๋…€์„์€ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์•ผ๋งŒ ์ ‘๊ทผ ํƒ€์ž…์„ ๋ฐ”๊ฟ€ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ ‘๊ทผ์„ ํ•œ๋‹ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์•„๋งˆ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ํ†ตํ•ด์„œ ํƒ€์ž…์ฒดํ‚น๋„ ์—„๊ฒฉํ•˜๊ฒŒ ํ•˜๊ณ  ์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž๋„ ์จ๋จน์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.


์ผ๋‹จ ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์•„์ฃผ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋‹ค.
int ํƒ€์ž…์œผ๋กœ ๊ฐ’ ๋Œ€์ž… ํ•œ๋ฒˆ ํ•ด์ฃผ๊ณ , ์ ‘๊ทผํ•ด์„œ ์ถœ๋ ฅํ•˜๊ณ .
double๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ , ์ ‘๊ทผํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ ‡๊ฒŒ ์˜ˆ์™ธ๊ฐ€ ๋‚˜์˜จ๋‹ค.
์ด๋ ‡๊ฒŒ



๊ทธ๋ฆฌ๊ณ  ์• ์ดˆ์— ์—†๋Š” ํƒ€์ž…์ด๋‚˜ ์ธ๋ฑ์Šค๋Š” ๋‹น์—ฐํžˆ ์ปดํŒŒ์ผ๋ถ€ํ„ฐ๊ฐ€ ์•ˆ ๋œ๋‹ค.



์•”ํŠผ ๊ทธ๋ ‡๋‹ค.

์ž์„ธํ•œ ๊ฑด ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐ
https://en.cppreference.com/w/cpp/utility/variant
std::variant - cppreference.comstd:: variant < cpp โ€Ž | utility C++ Language Standard Library Headers Freestanding and hosted implementations Named requirements Language support library Concepts library (C++20) Diagnostics library Utilities library Strings library Containers library Iterators library Ranges library (C++20) Algorit...en.cppreference.com