๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ—ฃ๏ธ ์‹ ์ž… ์ธํ„ฐ๋ทฐ/C++

๐Ÿงž‍โ™‚๏ธ ์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ : C++ 01

์•ˆ๋…•ํ•˜์„ธ์š”, ์ซ€๋ƒ๋ฏธ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ธ์–ด๊ฐ€ C++์ด์ง€๋งŒ Java, Python ์–ธ์–ด ๊ด€๋ จ ์ง€์‹๋„ ์ฒจ๋ถ€ํ•œ ์  ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 
ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

C++ ๋นŒ๋“œ ๊ณผ์ •

  1. ์ „์ฒ˜๋ฆฌ (Preprocessing):
    • ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์†Œ์Šค ํŒŒ์ผ(.cpp ํŒŒ์ผ)์ด ์ „์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    • ์ „์ฒ˜๋ฆฌ๊ธฐ ์ง€์‹œ๋ฌธ (#include, #define, #if, ๋“ฑ)์ด ์‹คํ–‰๋˜์–ด ์ฝ”๋“œ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, #include ์ง€์‹œ๋ฌธ์€ ํ•ด๋‹น ํ—ค๋” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์†Œ์Šค ํŒŒ์ผ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์—์„œ์˜ ์ถœ๋ ฅ์€ "์ „์ฒ˜๋ฆฌ๋œ ์†Œ์Šค ์ฝ”๋“œ"์ด๋ฉฐ, ๋ณดํ†ต์€ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผ (Compilation):
    • ์ „์ฒ˜๋ฆฌ๋œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค.
    • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ์†Œ์Šค ํŒŒ์ผ(.cpp)์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.obj ๋˜๋Š” .o)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„, ์˜๋ฏธ ๋ถ„์„, ์ฝ”๋“œ ์ตœ์ ํ™” ๋“ฑ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ์–ด์…ˆ๋ธ”๋ฆฌ (Assembly):
    • ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์€ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ(์–ด์…ˆ๋ธ”๋ฆฌ์–ด)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์–ด์…ˆ๋ธ”๋ฆฌ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ณ„๋„์˜ ๋‹จ๊ณ„๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  4. ๋งํ‚น (Linking):
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์ด ๋ง์ปค์— ์˜ํ•ด ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋ง์ปค๋Š” ๊ฐ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ , ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ(์˜ˆ: .exe ๋˜๋Š” .out)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์—์„œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ, ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋“ฑ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

C++ ์ปดํŒŒ์ผ ๊ณผ์ •

C++์˜ ์ปดํŒŒ์ผ ๊ณผ์ •์€ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ๋˜๋Š” ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ „์ฒ˜๋ฆฌ (Preprocessing):
    • ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ์†Œ์Šค ํŒŒ์ผ(.cpp ํŒŒ์ผ)์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ „์ฒ˜๋ฆฌ ์ง€์‹œ๋ฌธ (์˜ˆ: #include, #define, #if ๋“ฑ)์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. #include๋Š” ํ•ด๋‹น ํ—ค๋” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์†Œ์Šค ํŒŒ์ผ์— ์‚ฝ์ž…ํ•˜๊ณ , ๋งคํฌ๋กœ ์ •์˜๋‚˜ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ง€์‹œ๋ฌธ์€ ํ•ด๋‹น ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋Š” ์ „์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ์ด๋ฉฐ, ์ด๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผ (Compilation):
    • ์ „์ฒ˜๋ฆฌ๋œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
    • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์†Œ์Šค ํŒŒ์ผ(.cpp)์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.obj ๋˜๋Š” .o)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•„์ง ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹™๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„(Syntax Analysis), ์˜๋ฏธ ๋ถ„์„(Semantic Analysis), ์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ(Intermediate Code Generation), ์ตœ์ ํ™”(Optimization) ๋“ฑ์˜ ๊ณผ์ •์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ๋งํ‚น (Linking):
    • ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์€ ๋ง์ปค์— ์˜ํ•ด ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋ง์ปค๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ , ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ ์ตœ์ข…์ ์ธ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ(์˜ˆ: .exe ๋˜๋Š” .out)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ ํ•ด๊ฒฐ, ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋“ฑ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

C++ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ๊ณ ์ˆ˜์ค€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ €์ˆ˜์ค€์˜ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๊ณผ์ •์˜ ์ •ํ™•ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ข…๋ฅ˜(์˜ˆ: GCC, Clang, MSVC ๋“ฑ)์™€ ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


endl, \n ์ฐจ์ด

C++์—์„œ endl๊ณผ \n์€ ๋‘˜ ๋‹ค ์ค„๋ฐ”๊ฟˆ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๊ทธ๋“ค ์‚ฌ์ด์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฐจ์ด๋Š” ์ฃผ๋กœ ๋ฒ„ํผ ํ”Œ๋Ÿฌ์‹œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. \n (Newline Character):
    • \n์€ ๋‹จ์ˆœํžˆ ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.
    • ์ด ๋ฌธ์ž๋Š” ๋ฌธ์ž์—ด ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ์ค„์„ ์‹œ์ž‘ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.
    • ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— \n์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜์—์„œ ์ค„์„ ๋ฐ”๊พธ์ง€๋งŒ, ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒ„ํผ์˜ ๋‚ด์šฉ์ด ์ฆ‰์‹œ ์ถœ๋ ฅ ์žฅ์น˜๋กœ ์ „์†ก๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฒ„ํผ๊ฐ€ ํ”Œ๋Ÿฌ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์ถœ๋ ฅ์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ผ๋ถ€ ์ถœ๋ ฅ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  2. std::endl (End Line):
    • std::endl์€ ์ค„๋ฐ”๊ฟˆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • std::endl์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์ŠคํŠธ๋ฆผ ๋ฒ„ํผ์˜ ๋ชจ๋“  ๋‚ด์šฉ์ด ์ฆ‰์‹œ ์ถœ๋ ฅ ์žฅ์น˜๋กœ ์ „์†ก๋˜๊ณ , ์ƒˆ๋กœ์šด ์ค„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„ํผ ํ”Œ๋Ÿฌ์‹œ๋Š” ์ถœ๋ ฅ์˜ ์ฆ‰๊ฐ์ ์ธ ํ‘œ์‹œ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ, ๋นˆ๋ฒˆํ•œ ํ”Œ๋Ÿฌ์‹œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ std::endl ํ˜ธ์ถœ๋งˆ๋‹ค ๋ฒ„ํผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋น ๋ฅธ ์†๋„๋กœ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํƒ ๊ธฐ์ค€

  • ์„ฑ๋Šฅ์„ ์ค‘์‹œํ•˜๋Š” ๊ฒฝ์šฐ: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถœ๋ ฅํ•ด์•ผ ํ•  ๋•Œ๋Š” \n์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. \n์€ ๋ฒ„ํผ๋ฅผ ์ž๋™์œผ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ์˜ ์ฆ‰๊ฐ์ ์ธ ํ‘œ์‹œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ: ํ”„๋กœ๊ทธ๋žจ์˜ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰์‹œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” std::endl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํผ๋ฅผ ์ฆ‰์‹œ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, \n์€ ์„ฑ๋Šฅ์„ ์ค‘์‹œํ•˜๋Š” ์ƒํ™ฉ์—, std::endl์€ ์ถœ๋ ฅ์˜ ์ •ํ™•์„ฑ๊ณผ ์ฆ‰๊ฐ์„ฑ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


์•„์Šคํ‚ค๋ฌธ์ž๋ž€? ํ˜„๋Œ€์—์„  ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋‚˜?

์•„์Šคํ‚ค(ASCII, American Standard Code for Information Interchange) ๋ฌธ์ž๋Š” ์ปดํ“จํ„ฐ์—์„œ ํ…์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ์ฒด๊ณ„์ž…๋‹ˆ๋‹ค. 1960๋…„๋Œ€์— ๊ฐœ๋ฐœ๋œ ์ด ์ธ์ฝ”๋”ฉ์€ ์˜์–ด ์•ŒํŒŒ๋ฒณ, ์ˆซ์ž, ์ผ๋ถ€ ํŠน์ˆ˜ ๋ฌธ์ž, ๊ทธ๋ฆฌ๊ณ  ์ œ์–ด ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•„์Šคํ‚ค ๋ฌธ์ž์˜ ํŠน์ง•

  • ์•„์Šคํ‚ค ๋ฌธ์ž ์ง‘ํ•ฉ์€ ์ด 128๊ฐœ์˜ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋ฌธ์ž๋Š” 7๋น„ํŠธ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฌธ์ž ์ง‘ํ•ฉ์—๋Š” ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž ์˜๋ฌธ ์•ŒํŒŒ๋ฒณ(A-Z, a-z), ์ˆซ์ž(0-9), ํ‘œ์ค€ ํŠน์ˆ˜ ๋ฌธ์ž(์˜ˆ: !, @, #, $, ๋“ฑ), ๊ทธ๋ฆฌ๊ณ  ์ œ์–ด ๋ฌธ์ž(์˜ˆ: ์ค„๋ฐ”๊ฟˆ, ํƒญ ๋“ฑ)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ˜„๋Œ€์—์„œ์˜ ์‚ฌ์šฉ

์•„์Šคํ‚ค๋Š” ์ดˆ๊ธฐ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋„ ๋งŽ์€ ์‹œ์Šคํ…œ๊ณผ ํ”„๋กœํ† ์ฝœ์—์„œ ๊ธฐ๋ณธ์ ์ธ ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„๋Œ€์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ด์œ ๋กœ ์ธํ•ด ์•„์Šคํ‚ค๋ณด๋‹ค ๋” ์ง„๋ณด๋œ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ์ฒด๊ณ„๊ฐ€ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:

  1. ๋‹ค๊ตญ์–ด ์ง€์›: ์•„์Šคํ‚ค๋Š” ์ฃผ๋กœ ์˜์–ด๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ๋ฌธ์ž๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด UTF-8, UTF-16๊ณผ ๊ฐ™์€ ์œ ๋‹ˆ์ฝ”๋“œ ์ธ์ฝ”๋”ฉ ์ฒด๊ณ„๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋“ค์€ ์ „ ์„ธ๊ณ„์˜ ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ๋ฌธ์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ™•์žฅ์„ฑ: ์•„์Šคํ‚ค๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ œํ•œ๋œ ์ˆ˜์˜ ๋ฌธ์ž๋งŒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ์™€ ๊ฐ™์€ ํ™•์žฅ๋œ ์ธ์ฝ”๋”ฉ ์ฒด๊ณ„๋Š” ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ฌธ์ž์™€ ๊ธฐํ˜ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด, ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ˜ธํ™˜์„ฑ: ๋งŽ์€ ํ˜„๋Œ€ ์‹œ์Šคํ…œ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์•„์Šคํ‚ค ๋ฌธ์ž ์ง‘ํ•ฉ์€ ์œ ๋‹ˆ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, UTF-8 ์ธ์ฝ”๋”ฉ์€ ์•„์Šคํ‚ค ๋ฌธ์ž ์ง‘ํ•ฉ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ๋Š” ์•„์Šคํ‚ค์™€ ๋™์ผํ•œ ๋ฐ”์ดํŠธ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์•„์Šคํ‚ค๋Š” ํ˜„๋Œ€ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ์ ์ธ ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋‚˜, ๋‹ค๊ตญ์–ด ์ง€์›๊ณผ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์œ ๋‹ˆ์ฝ”๋“œ ์ธ์ฝ”๋”ฉ ์ฒด๊ณ„๊ฐ€ ์ ์  ๋” ์„ ํ˜ธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด ์ฃผ์‹ค๋ž˜์š”? 

 

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

 

์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ๊ณ„์ ์— ์˜ํ•ด ํƒ„์ƒํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค. 

  • C์™€ C++ ์ฐจ์ด : ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (๊ธฐ๋Šฅ ์ค‘์‹ฌ) / ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (๋ฐ์ดํ„ฐ ์ค‘์‹ฌ)
    • ์ฐจ์ด์  : C++์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, namespace, ๊ฐ์ฒด ์ค‘์‹ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ https://nextcoder.tistory.com/39

์ถ”์ƒํ™” ์บก์Šํ™” ์ƒ์†์„ฑ ๋‹คํ˜•์„ฑ์ด๋ผ๋Š” ๋„ค ๊ฐ€์ง€ ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

  • ์ถ”์ƒํ™”: ๊ฐ์ฒด์˜ ๊ณตํ†ต์ ์ธ ํŠน์„ฑ์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด๊ตฌ์š”.
  • ์บก์Šํ™”: ๊ฐ์ฒด ๋‚ด๋ถ€์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๊ณต๊ฐœ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด ์กฐ์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค. ์ •๋ณด ์€๋‹‰์„ ํ†ตํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์™ธ๋ถ€์—์„  ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ์†์„ฑ: ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ณตํ†ต๋œ ํŠน์„ฑ์„ ํ•˜๋‚˜์˜ ๊ฐœ๋…์œผ๋กœ ์ •๋ฆฝํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹คํ˜•์„ฑ: ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๐Ÿ—ฃ๏ธ ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์‹ค๋ž˜์š”? 

 

๋‹คํ˜•์„ฑ์€ ์ƒ์†์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ , ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์— ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

 

๋‹คํ˜•์„ฑ ๋ฐœ์ƒ์€, ๊ฐ์ฒด ํฌ์ธํ„ฐ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ, `virtual` ํ‚ค์›Œ๋“œ๋Š” ๊ฐ๊ฐ ๋”ฐ์ ธ๋ดค์„ ๋•Œ ๋‹คํ˜•์„ฑ์ด ๋ฐœ์ƒ๋˜์ง„ ์•Š์ง€๋งŒ, ์„ธ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์งˆ ๋•Œ ๋‹คํ˜•์„ฑ์ด ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋‹คํ˜•์„ฑ๊ณผ ๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด๋ฉฐ, C++์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋‚˜์š”?

 

์ด ๋‘ ๋ฐฉ๋ฒ•์€ ๋‹คํ˜•์„ฑ์„ ์‹คํ˜„ํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„ ๋‹คํ˜•์„ฑ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํŒŒ์ผ๋˜๋Š” ์‹œ์ ์— ๋‹คํ˜•์„ฑ์ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด๋‚˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒˆ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ํƒ€์ž…์— ๋…๋ฆฝ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ์‹œ์ ์— ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ํ…œํ”Œ๋ฆฟ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

void print(int i) { /* ... */ }
void print(double f) { /* ... */ }

template <typename T>
void printArray(T* arr, int size) { /* ... */ }


๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ๋‹คํ˜•์„ฑ์ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฃผ๋กœ ๊ฐ€์ƒ ํ•จ์ˆ˜(Virtual Functions)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์— `virtual` ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(์žฌ์ •์˜)๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ์‹ค์ œ ํƒ€์ž…์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๋‹คํ˜•์  ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

class Base {
	virtual void print() { /* ... */ }
};

class Derived : public Base {
	void print() override { /* ... */ }
};

Base* b = new Derived();
b->print(); // ๋Ÿฐํƒ€์ž„์— Derived์˜ print ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋จ


์ปดํŒŒ์ผ ํƒ€์ž„ ๋‹คํ˜•์„ฑ์€ ์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ๊ณผ ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์€ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๊ฐ•์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. C++์—์„œ ์ด ๋‘ ๊ฐ€์ง€ ๋‹คํ˜•์„ฑ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ 5๋Œ€ ์›์น™์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

 

์ถœ์ฒ˜ https://mangkyu.tistory.com/194

 

SOLID Principles ์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

S (Single Responsibility Principle) ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

  • ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ฑ…์ž„์ด๋ž€ '๋ณ€๊ฒฝ์˜ ์ด์œ '๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
  • ํ•ด๋‹น ๋ชจ๋“ˆ์ด ์—ฌ๋Ÿฌ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ฑ…์ž„์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋˜๊ณ , ์˜ค์ง ํ•˜๋‚˜์˜ ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฑ…์ž„์„ ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

O (Open-Closed Principle) ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™

  • ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ฆ‰, ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

L (Liskov Substitution Principle) ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

  • ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํŒŒ์ƒ  ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋Œ€์ฒดํ•ด๋„, ์‹œ์Šคํ…œ์˜ ์ •ํ™•์„ฑ์ด๋‚˜ ํ–‰๋™์ด ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

I (Interface Segregation Principle) ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

  • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.
  • ํ•œ ํด๋ž˜์Šค๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

D (Dependency Inversion Principle) ์˜์กด์„ฑ ์—ญ์ „ ์›์น™

  • ์ถ”์ƒํ™”์— ์˜์กดํ•œ๋‹ค.
  • ์ถ”์ƒํ™”๋Š” ๊ตฌ์ฒด์ ์ธ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—ฃ๏ธ ํฌ์ธํ„ฐ์™€  ์ฐธ์กฐ์˜ ๊ณตํ†ต์ , ์ฐจ์ด์ , ์‚ฌ์šฉ์ฒ˜์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด ์ฃผ์‹ค๋ž˜์š”?

 

๊ณตํ†ต์ 

๋ณต์‚ฌ ๋น„์šฉ์„ ์ค„์ด๊ณ  ์‹ถ์„ ๋•Œ, ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ์›๊ฒฉ์œผ๋กœ ์›๋ณธ์„ ๊ฑด๋“œ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 

 

์ฐจ์ด์ 

  • ํฌ์ธํ„ฐ๋Š” NULL ๊ฐ’์ด ํ—ˆ์šฉ๋˜๋ฉฐ, ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•ด์„œ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ์œ ํšจํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•˜๋ฏ€๋กœ ์„ ์–ธ ์‹œ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ NULL ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ธ์ œ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€๊ฐ€์š”?

  • ํฌ์ธํ„ฐ๋Š” ๋™์  ํ• ๋‹น, ์„ ํƒ์  ์ ‘๊ทผ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (์˜ˆ: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ํŠธ๋ฆฌ) ๋“ฑ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ—ฃ๏ธ ๊ฐ€์ƒ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด ์ฃผ์‹ค๋ž˜์š”?

 

C++์—์„œ virtual ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ƒ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์€ runtime์— ํ•จ์ˆ˜์˜ ๋ฐ”์ธ๋”ฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ , ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋™์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

C++ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด  `4 byte` ํฌ๊ธฐ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”(vftable)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์€ ํด๋ž˜์Šค๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๋ฉฐ, ํด๋ž˜์Šค ๋‚ด์˜ ๋ชจ๋“  ๊ฐ€์ƒ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์€ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ๊ณต์œ ๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ๊ฐ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ธ vptr ๋ฅผ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๋ฉฐ, ์ด ํฌ์ธํ„ฐ๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์—์„œ ์–ด๋Š ์ฃผ์†Œ์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. 

 

๋งŒ์•ฝ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์ง€ ์•Š์œผ๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. 


๐Ÿ—ฃ๏ธ ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ์“ฐ๋ฉด ์•ˆ๋˜๋‚˜์š”?

 

๋ชจ๋“  ํ•จ์ˆ˜๋“ค์„ ๋””ํดํŠธ๋กœ ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ฌ์œผ๋กœ์จ, ์–ธ์ œ๋‚˜ ๋™์  ๋ฐ”์ธ๋”ฉ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Java ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์ด ๋””ํดํŠธ๋กœ `virtual` ํ•จ์ˆ˜๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  C++ ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ์–ธํ•˜๋„๋ก ํ•œ ์ด์œ ๋Š”, ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ (overhead) ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฑฐ์ณ์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ฅผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ์ฐจ์ด๋Š” ๊ทนํžˆ ๋ฏธ๋ฏธํ•˜์ง€๋งŒ, ์ตœ์ ํ™”๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ„์•ผ์—์„œ๋Š” ์ด๋ฅผ ๊ฐ์•ˆํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. C++ ์—์„œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๋””ํดํŠธ๋กœ ๊ฐ€์ƒํ•จ์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ  https://modoocode.com/211


๐Ÿ—ฃ๏ธ ์ƒ์† ํ™˜๊ฒฝ์—์„œ ์†Œ๋ฉธ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”. ๐Ÿ’ก

 

ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์  ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์†Œ๋ฉธ์ž์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๋Š”๋ฐ์š”,์ƒ์†๋ฐ›์€ ๋ถ€๋ชจ์˜ ์†Œ๋ฉธ์ž๊ฐ€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, ์‹ค์ œ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ƒ์„ฑ๋œ ํฌ์ธํ„ฐ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†Œ๋ฉธ์ž๋งŒ ํ˜ธ์ถœ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ์†Œ๋ฉธ์ž๋ฅผ ๊ผญ ๊ฐ€์ƒํ•จ์ˆ˜๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋ธ”๋กœ๊ทธ https://song-ift.tistory.com/m/55 , https://modoocode.com/211


๐Ÿ—ฃ๏ธ '๋”๋ธ” ํ”„๋ฆฌ'๋‚˜ '๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ', '๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜'๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์ƒ๊ธฐ๋‚˜์š”?

 

๋”๋ธ” ํ”„๋ฆฌ (Double Free): ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•ด์ œ๋œ ํ›„, ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋Œ€ํ•ด `delete`๋‚˜ `free`๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ (Dangling Pointer): ์ด๋ฏธ ํ•ด์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋œ ํ›„์—๋„ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leak): ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ œ๋Œ€๋กœ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ง€์†์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์‹œ์Šคํ…œ ์ž์›์˜ ๋‚ญ๋น„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

C++์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” RAII ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ , ์†Œ๋ฉธ์ž์—์„œ ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ malloc, new ์ฐจ์ด์ ์ด ๋ญ˜๊นŒ์š”?

 

๋‘˜ ๋‹ค ๋™์ ์œผ๋กœ Heap ๊ณต๊ฐ„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ์ ์ด ๊ณตํ†ต์ ์ธ๋ฐ์š”, ๋˜ํ•œ Garbage Collector ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋™์ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋„ ๊ณตํ†ต์ ์ž…๋‹ˆ๋‹ค.

 

`malloc`์€ C์—์„œ๋ถ€ํ„ฐ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๊ณ  `new`๋Š” C++์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  `malloc`/`free`๋Š” ํ•จ์ˆ˜, `new`/`delete`๋Š” ์—ฐ์‚ฐ์ž (operator) ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ์ฐจ์ด๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ์˜ ์œ ๋ฌด์ž…๋‹ˆ๋‹ค. 

 

`malloc`/`free`

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ณต ํ•จ์ˆ˜๋กœ, `#include "stdlib.h"` ๋ฅผ ํ•ด์ค˜์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • `malloc` ๋Š” `byte` ๋‹จ์œ„์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ , ๋ฆฌํ„ดํƒ€์ž…์ด `void*`ํ˜•์ด๋ฏ€๋กœ ๋ฐ˜ํ™˜๋ฐ›์€๊ฑธ ํ•ด๋‹น ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋กœ ํ˜•๋ณ€ํ™˜(์บ์ŠคํŒ…) ์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๋ชฉ์ ์ด๋ฏ€๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋‹จ์ด ์—†๊ธฐ์— ์ดˆ๊ธฐ๊ฐ’์„ ์ค„ ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญ์‹œ `free` ์˜ ๊ฒฝ์šฐ์—๋„ ์†Œ๋ฉธ์ž๋ฅผ ๋ถ€๋ฅด๋Š”๊ฒŒ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋กœ์ง€ POD(Plain Old Data) ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋งŒ ํฌ๊ธฐ๋ฅผ ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • `malloc` ์œผ๋กœ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ์—๋Š” `realloc`์„ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ `new`์—๋Š” ํ• ๋‹น๋œ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์กฐ์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ `์ƒˆ๋กœ ํ• ๋‹น, ๋ณต์‚ฌ, ํ•ด์ œ` ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ `new`/`delete` ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ• ๋‹น, ํ•ด์ œ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ์—ญํ• ์ด ์—†๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์— ์žฌํ• ๋‹น์ด ๋นˆ๋ฒˆํžˆ ์ผ์–ด๋‚œ๋‹ค๋ฉด, `malloc`/`free`๊ฐ€ ๋” ์ข‹์€ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
    • `malloc()`, `calloc()`, `realloc()` ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
      • `malloc()`์€ ์ง€์ •๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๊ณ , ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        `calloc()`์€ ์ง€์ •๋œ ์ˆ˜์˜ ์š”์†Œ์— ๋Œ€ํ•ด ์ง€์ •๋œ ํฌ๊ธฐ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋ชจ๋“  ๋น„ํŠธ๋ฅผ `0`์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
        `realloc()`์€ ์ด๋ฏธ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํฌ๊ธฐ๊ฐ€ ๊ธฐ์กด ํฌ๊ธฐ๋ณด๋‹ค ํฌ๋ฉด, ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•„์š”์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋กœ ๋ธ”๋ก์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์›๋ž˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
        ์ฆ‰, `malloc()`๊ณผ `calloc()`์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‚ฌ์šฉ๋˜์ง€๋งŒ, `calloc()`์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ˜๋ฉด, `malloc()`์€ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `realloc()`์€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • `realloc()`์˜ ๋Œ€ํ‘œ์  ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
      • ์ •๋ง ํ˜น์‹œ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ `null`์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ `realloc` ์‹œ ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹คํŒจ ์‹œ ๋ณต๊ตฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ๊ป˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋ ‡๋‹ค๋ฉด ์ƒ์„ฑ์ž์—์„œ ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ทธ๊ฑด ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ์š”?
      • ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ, ๋Œ€์ž…์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์ฆ‰ ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐํ™”์™€ ์ƒ์„ฑ ํ›„ ์ดˆ๊ธฐํ™”๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ ํ›„ ์ดˆ๊ธฐํ™”๋ณด๋‹ค ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐํ™”๊ฐ€ ํšจ์œจ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • ๋˜ํ•œ ์ƒ์ˆ˜(const)๋‚˜ ์ฐธ์กฐ(&) ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋Œ€์ž…์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
        • ์ƒ์„ฑ์ž ๋ณธ๋ฌธ์—์„œ๋Š” ์ฐธ์กฐ ๋ฉค๋ฒ„์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋Š” ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
        • ์ƒ์ˆ˜ ๋ฉค๋ฒ„๋Š” ์ƒ์„ฑ๋œ ํ›„ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒ์„ฑ์ž ๋ณธ๋ฌธ์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

`new`/`delete`

  • `new`/`delete` ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ C++ ๋‚ด ์žˆ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • `new` ์˜ ๊ฒฝ์šฐ ํ• ๋‹นํ•  ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜•์„ ์ง€์ •ํ•˜๋ฉด, ๋ฐ˜ํ™˜๊ฐ’์ด ํ•ด๋‹น ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋กœ ์ž๋™ ๋ฐ˜ํ™˜์ด ๋˜๋ฏ€๋กœ ์ง์ ‘ ์‚ฌ์ด์ฆˆ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. 
  • ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋™์  ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ด์„œ, ํ• ๋‹น๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • `delete` ๋Š” ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ `free`์™€ `delete`๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ `delete`๋Š” ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ ์ด ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.
  • `new` ๋กœ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ ์ง์ ‘์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋•Œ๋ฌธ์— ์žฌํ• ๋‹น์ด ๋งŽ๋‹ค๋ฉด `malloc` ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ํ•˜๋ฉด ๋„ˆ๋ฌด๋„ˆ๋ฌด ์ข‹์„ ๋ธ”๋กœ๊ทธ: https://woo-dev.tistory.com/123


๐Ÿ—ฃ๏ธ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

 

C++์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์€ ์ฃผ๋กœ ์ถ”์ƒ ํด๋ž˜์Šค (abstract class) ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜(pure virtual function)๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ๋ณธ์ฒด๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ, ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋“œ(์žฌ์ •์˜)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+ ์ด ์ถ”์ƒํด๋ž˜์Šค๋Š” ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ถˆ์™„์ „ํ•œ ํด๋ž˜์Šค๋ผ์„œ, ์˜์›ํžˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ธต์  ์ƒ์† ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค ๊ฐ„ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 


๐Ÿ—ฃ๏ธ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?

 

์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ๋ฌด์กฐ๊ฑด ์žฌ์ •์˜๋ฅผ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ,

์ผ๋ฐ˜ ๊ฐ€์ƒํ•จ์ˆ˜๋Š” ์žฌ์ •์˜๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ƒ์—์„œ ์˜ค๋ฅ˜๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์‹ค๋ž˜์š”? ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

 

C++์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์œผ๋กœ, ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. RAII (Resource Acquisition Is Initialization) ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ, ๊ฐ์ฒด๊ฐ€ ์Šค์ฝ”ํ”„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, `unique_ptr`๋Š” ์ž์›์˜ ๋‹จ๋… ์†Œ์œ , `shared_ptr`๋Š” ์ž์›์˜ ๊ณต์œ  ์†Œ์œ , `weak_ptr`๋Š” `shared_ptr`์˜ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

`shared_ptr` ๋Š” ์ฐธ์กฐ ์นด์šดํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ์ด ๋ช‡ ๊ฐœ์ธ์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ `0`์ด ๋˜๋ฉด `delete` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ๋ฐ ํ• ๋‹น์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ณต์œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

`weak_ptr` ๋Š” shared_ptr์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ณต์œ  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์•„ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. shared_ptr๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

`unique_ptr` ๋Š” ํ•˜๋‚˜์˜ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋งŒ์ด ํŠน์ • ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ฒด์— ์†Œ์œ ๊ถŒ ๊ฐœ๋…์„ ๋„์ž…ํ•œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ์†Œ์œ ๊ถŒ ์ด์ „์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณต์‚ฌ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (std::move๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์œ ๊ถŒ์„ ์ด์ „ํ•  ์ˆ˜ ์žˆ์Œ).

 

OOOํ”„๋กœ์ ํŠธ์—์„œ OOO๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ OOO๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ RAII(Resource Acquisition Is Initialization) ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, C++์—์„œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

 

RAII (Resource Acquisition Is Initialization)๋Š” C++์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์œผ๋กœ, ์ž์›์„ ํš๋“ํ•˜๋Š” ๋™์‹œ์— ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ด ๋๋‚˜๋ฉด ์ž์›์„ ์ž๋™์œผ๋กœ ํ•ด์ œํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ์›์น™์˜ ๋ชฉ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ์ž์› ๋ˆ„์ˆ˜, ์˜ˆ์™ธ ์•ˆ์ „์„ฑ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RAII ํŒจํ„ด์— ๋Œ€ํ•ด ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ์ž์›์„ ํš๋“(acquire)ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค์˜ ์†Œ๋ฉธ์ž(destructor)์—์„œ ์ž์›์„ ํ•ด์ œ(release)ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ, ๊ฐ์ฒด์˜ ์ˆ˜๋ช…๊ณผ ์ž์›์˜ ์ˆ˜๋ช…์„ ์—ฐ๊ฒฐ์‹œํ‚ต๋‹ˆ๋‹ค.

RAII ํŒจํ„ด์ด ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ๋กœ๋Š” smart pointer์™€ lock guard๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

`unique_ptr`, `shared_ptr` ๊ฐ™์€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธํ•  ๋•Œ, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ์ž๋™์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

`lock_guard`๋Š” ์ƒ์„ฑ๋  ๋•Œ ๋ฎคํ…์Šค๋ฅผ ์ž ๊ทธ๊ณ , ์†Œ๋ฉธ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. 

#include <iostream>
#include <memory>
class Test {
public:
    Test() { std::cout << "Test ์ƒ์„ฑ" << std::endl; }
    ~Test() { std::cout << "Test ์†Œ๋ฉธ" << std::endl; }
    void greet() { std::cout << "์•ˆ๋…•ํ•˜์„ธ์š”!" << std::endl; }
};
int main() {
    {
        std::shared_ptr<Test> ptr1 = std::make_shared<Test>(); // Test ์ƒ์„ฑ
        {
            std::shared_ptr<Test> ptr2 = ptr1; // ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 2๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
            ptr2->greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”!
        } // ptr2๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 1 ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
        
        ptr1->greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”!
        // Test ์†Œ๋ฉธ // ํ•จ์ˆ˜ ๋ธ”๋ก์„ ๋ฒ—์–ด๋‚˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
    } // ptr1์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

    return 0;
}
///////////////////////////////////////////////
#include <mutex>
std::mutex mtx;
void safe_function() {
    std::lock_guard<std::mutex> lock(mtx);
    // ์—ฌ๊ธฐ์— ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
    // lock_guard ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด์„œ ์ž๋™์œผ๋กœ mtx ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
}

๐Ÿ—ฃ๏ธ `shared_ptr` ๋™์ž‘๊ณผ์ •์„ ๋” ์ž์„ธํžˆ ๋งํ•ด์ฃผ์‹œ๊ฒ ์–ด์š”?

 

shared_ptr๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” `shared_ptr`์˜ ์ˆ˜๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด `shared_ptr`๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋งˆ๋‹ค ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , `shared_ptr`๊ฐ€ ์†Œ๋ฉธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋ฉด ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” `shared_ptr`๊ฐ€ ๋” ์ด์ƒ ์—†์„ ๋•Œ (์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ `0`์ด ๋  ๋•Œ), ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ `shared_ptr` ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ `this` ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ญ”๊ฐ€์š”?

 

์ง์ ‘ `this` ํฌ์ธํ„ฐ๋ฅผ `shared_ptr`๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” `this`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ `std::shared_ptr`๋Š” ๋ณ„๋„์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋˜์„œ ๋ฉ”๋ชจ๋ฆฌ  ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด C++11 ๋ถ€ํ„ฐ๋Š” `enable_shared_from_this`ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ `shared_from_this()` ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ `shared_ptr`๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด `this` ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ `shared_ptr`๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด, ํ•ด๋‹น `shared_ptr`์™€ ๋™์ผํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ƒˆ๋กœ์šด `shared_ptr` ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
    std::shared_ptr<MyClass> getShared() {
        return shared_from_this();
    }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr2 = ptr1->getShared();

    // ptr1๊ณผ ptr2๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ์ฐธ์กฐ ์นด์šดํŠธ๋Š” ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.
    std::cout << "ptr1.use_count() = " << ptr1.use_count() << std::endl; // ์ถœ๋ ฅ: 2
    std::cout << "ptr2.use_count() = " << ptr2.use_count() << std::endl; // ์ถœ๋ ฅ: 2

    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `MyClass`๋Š” `std::enable_shared_from_this<MyClass>`๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. `getShared` ํ•จ์ˆ˜๋Š” `shared_from_this`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ `shared_ptr`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. `main` ํ•จ์ˆ˜์—์„œ `ptr1`๊ณผ `ptr2`๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ์˜ ์ฐจ์ด์ ์ด ๋ญ˜๊นŒ์š”?

 

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ๋ชจ๋“  ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋ณต์‚ฌํ•˜๋Š” ๋ฐ˜๋ฉด, 

์–•์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋˜๋Š” ๊ฐ์ฒด ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์–•์€ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด double free, ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด

๊นŠ์€ ๋ณต์‚ฌ(deep copy)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์‹œ๊ฒ ์–ด์š”?

 

์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ, ํŠนํžˆ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค ์‚ฌ์ด์˜ ํ˜• ๋ณ€ํ™˜ ๋ฐฉ์‹์ธ๋ฐ์š”.

์—…์บ์ŠคํŒ…์€ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋” ํฐ ๋ฒ”์ฃผ์ธ ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ,

๋‹ค์šด์บ์ŠคํŒ…์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ž์‹ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—…์บ์ŠคํŒ… ์˜ˆ: `Dog` ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ `Animal` ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ (Dog is a Animal)
๋‹ค์šด์บ์ŠคํŒ… ์˜ˆ์‹œ: `Animal` ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ `Dog` ํด๋ž˜์Šค๋กœ ์บ์ŠคํŒ… (๊ตฌ์ฒดํ™”/์›๋ณต) ํ•˜์—ฌ `Dog` ํŠน์œ ์˜ ํŠน์„ฑ (๋ฉ”์†Œ๋“œ) ์— ์ ‘๊ทผ

 

์—…์บ์ŠคํŒ… (Upcasting)
   - ์—…์บ์ŠคํŒ…์€ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. (Dog is a Animal)
   - ์—…์บ์ŠคํŒ…์€ ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋ฉฐ ์•”์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
   - ์—…์บ์ŠคํŒ…์„ ํ†ตํ•ด ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์šด์บ์ŠคํŒ… (Downcasting)

   - ๋‹ค์šด์บ์ŠคํŒ…์€ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
   - ๋‹ค์šด์บ์ŠคํŒ…์€ ํ•ญ์ƒ ์•ˆ์ „ํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ๋ช…์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค 
   - ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์ผ ๋•Œ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

   - ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ณด์˜ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์–ด์„œ, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Dynamic Casting ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

      - `dynamic_cast`๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜์—ฌ ์•ˆ์ „ํ•œ ์บ์ŠคํŒ…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์บ์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด `nullptr`๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

   - ์ƒ์„ฑํ•  ๋•Œ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์—…์บ์ŠคํŒ…ํ•œ ๊ฐ์ฒด๋ฅผ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ฆด ๋•Œ ์‚ฌ์šฉํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

#include <iostream>

class Base {
public:
    virtual void print() { std::cout << "Base class" << std::endl; }
};

class Derived : public Base {
public:
    void print() override { std::cout << "Derived class" << std::endl; }
    void specificFunction() { std::cout << "Specific function for Derived" << std::endl; }
};

int main() {
    Derived derived;

    // ์—…์บ์ŠคํŒ…: Derived -> Base
    Base* basePtr = &derived;
    basePtr->print(); // "Derived class"

    // ๋‹ค์šด์บ์ŠคํŒ…: Base -> Derived
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    if (derivedPtr) {
        derivedPtr->specificFunction(); // "Specific function for Derived"
    }

    return 0;
}

์ด ์ฝ”๋“œ์—์„œ `Derived` ํด๋ž˜์Šค๋Š” `Base` ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. `basePtr`๋Š” ์—…์บ์ŠคํŒ…์„ ํ†ตํ•ด `Derived` ๊ฐ์ฒด๋ฅผ `Base` ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. `derivedPtr`๋Š” ๋‹ค์šด์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ `Base` ํฌ์ธํ„ฐ๋ฅผ `Derived` ํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด์บ์ŠคํŒ…์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋ฉด, `Derived` ํด๋ž˜์Šค์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

+ RTTI ๋ฌธ๋ฒ•์ค‘์— ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ค๊ฒƒ์ด ์žˆ์—ˆ๋Š”์ง€

dynamic-cast ์™€ static-cast ๋ฅผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋ถ€๋ชจํด๋ž˜์Šค์˜ ํฌ์ธํ„ฐ์—์„œ ์ž์‹ ํด๋ž˜์Šค์˜ ํฌ์ธํ„ฐ๋กœ ๋‹ค์šด์บ์ŠคํŒ… ํ• ๋•Œ ๋‹ค์ด๋‚˜๋ฏน ์บ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ์„ ํ†ตํ•ด ๊ฐ์ฒด ์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๋•Œ๋‚˜ ๊ฐ€๋”์”ฉ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ ์‹œ์— ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์•ˆ์ „ํ•˜๊ฒŒ dynamic-cast๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ ,

๋‹จ์ˆœํ•œ ํ˜•๋ณ€ํ™˜์ด๋‚˜ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ถฉ๋Œ๊ฐ™์€ ๋งŽ์€ ๋น„๊ต์—ฐ์‚ฐ์„ ํ• ๋•Œ๋Š” ๋Ÿฐํƒ€์ž„ ๋น„์šฉ์ด ๋‚ฎ์€ static-cast๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. 

์ถœ์ฒ˜ https://song-ift.tistory.com/m/55

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋ธ”๋กœ๊ทธ : https://makefortune2.tistory.com/224


๐Ÿ—ฃ๏ธ C++ Casting 4๊ฐ€์ง€ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด๊ณ  ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€๋ฅผ ์–˜๊ธฐํ•ด์ฃผ์„ธ์š”.

 

  • `static_cast` : ์ปดํŒŒ์ผ ํƒ€์ž„์—, ํƒ€์ž… ์›์น™์— ๋น„์ถฐ๋ณผ ๋•Œ ๋…ผ๋ฆฌ์ ์ธ ์บ์ŠคํŒ…๋งŒ ํ—ˆ์šฉํ•ด ์ค๋‹ˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ์ด ๋…ผ๋ฆฌ์ ์ธ ์บ์ŠคํŒ…์ด ํ•ญ์ƒ ์˜ณ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์–ด์„œ, ์ƒ์†๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค ๊ฐ„ ํƒ€์ž…๋ณ€ํ™˜์„ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์ฃผ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `enum` ๋“ฑ ์•ˆ์ „์žฅ์น˜๋กœ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ ๋“ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • `dynamic_cast` : `static_cast` ์˜ ๋‹จ์ ์„ ๋ณด์ถฉํ•˜๋Š”, ์ฆ‰ ๋Ÿฐํƒ€์ž„์— ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์˜ ์ƒ์† ๊ด€๊ณ„์—์„œ์˜ ์•ˆ์ „ํ•œ ํ˜• ๋ณ€ํ™˜์„ ์ง€์›ํ•˜๋Š” ์บ์ŠคํŒ…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  `vftable` ๋กœ ์›๋ณธ์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ `static_cast` ์— ๋น„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ `nullptr`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • `const_cast` : ๊ฐ์ฒด์˜ ์ƒ์ˆ˜์„ฑ(constness)์„ ์—†์• ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • `reinterpret_cast` : ์œ„ํ—˜ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ˜•ํƒœ์ธ๋ฐ, ์ „ํ˜€ ๊ด€๊ณ„์—†๋Š” ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋กœ ํ˜• ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

+ ์ถ”๊ฐ€ ์งˆ๋ฌธ : const-cast๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋Š”์ง€

const cast๋Š” ์ƒ์ˆ˜๊ฐ์ฒด๋ฅผ ๋น„์ƒ์ˆ˜ํ™” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์บ์ŠคํŠธ์ธ๋ฐ ๊ณต๋ถ€๋ฅผ ํ•ด์„œ ์•Œ๊ณ ๋Š” ์žˆ์—ˆ์ง€

์‚ฌ์‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ ์ •์˜ํ•  ๋•Œ ์ƒ์ˆ˜ํ™”๋กœ ์ •์˜๋ฅผ ํ•˜๊ณ  ๋จธ๋ฆฌ๋กœ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์—, ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๊ฐœ๋…์„ ๋ฐ”๊ฟ”๋†“๋Š” ๋‹ค๋Š” ๊ฒƒ์€ ์ข€ ์œ„ํ—˜ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์‚ฌ์šฉ์•ˆํ–ˆ๋‹ค. https://song-ift.tistory.com/m/55

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋ธ”๋กœ๊ทธ https://uncertainty-momo.tistory.com/77, https://strawvery-devlog.tistory.com/33


๐Ÿ—ฃ๏ธ `static_cast`, `dynamic_cast` ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€๋ฅผ ์–˜๊ธฐํ•ด์ฃผ์„ธ์š”.

 

๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ์‹œ์ ์— ๋”ฐ๋ผ์„œ ์ •์  ๋ฐ”์ธ๋”ฉ๊ณผ ๋™์  ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ์š”, ์ •์  ๋ฐ”์ธ๋”ฉ์€ ์ผ๋ฐ˜ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ •์  ๋ฐ”์ธ๋”ฉ์ด๋ผ ํ•˜๊ณ , ๋™์ ๋ฐ”์ธ๋”ฉ์€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํ˜ธ์ถœ์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋™์  ๋ฐ”์ธ๋”ฉ์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฐ€์ƒํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

`static_cast` ๋Š” ํ˜• ๋ณ€ํ™˜์— ๋Œ€ํ•œ ํƒ€์ž…์„ ๋Ÿฐํƒ€์ž„์— ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

`dynamic_cast` ๋Š” ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ RTTI (RunTime Type Information) ์„ ์ด์šฉํ•ด์„œ ๋Ÿฐํƒ€์ž„์— ์ƒ์† ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๊ฑฐ๋‚˜ ๋‹ค์šด์บ์ŠคํŒ…ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํด๋ž˜์Šค ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์„ ์ž์‹ ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  `nullptr`์ด๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋ณด๊ณ  ์‹คํŒจ๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋™์  ์บ์ŠคํŠธ๋Š” ๋‹คํ˜•์„ฑ์„ ๋„์ง€ ์•Š๋Š” ๊ฐ์ฒด๊ฐ„ ๋ณ€ํ™˜์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ์ •์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•ด๋„ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์•Œ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋™์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์‹œ๋„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์˜ ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํƒ€์ž…์— ๋Œ€ํ•ด ๋ช…ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ •์  ๋ณ€ํ™˜์„ ์จ์„œ ๋น„์šฉ์„ ์ ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋ธ”๋กœ๊ทธ https://drag0n.tistory.com/18


๐Ÿ—ฃ๏ธ ์™ผ๊ฐ’ ์˜ค๋ฅธ๊ฐ’. ๋ญ๊ฐ€ ๋‹ค๋ฅด๊ณ  ์–ธ์ œ ํ•„์š”ํ•œ๊ฑด๊ฐ€์š”?

 

์™ผ๊ฐ’์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๋ช…, `const` ๋ณ€์ˆ˜, ๋ฐฐ์—ด ์š”์†Œ, ์™ผ๊ฐ’ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๋“ฑ์˜ ํ‘œํ˜„์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅธ๊ฐ’ ํ‘œํ˜„์‹์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์ด๋™ ์˜๋ฏธ๋ก ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

 

์ด๋™ ์˜๋ฏธ๋ก (Move Semantics) ์€ C++11์—์„œ ๋„์ž…๋œ ๊ฐœ๋…์œผ๋กœ, ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ '์ด๋™'ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ๊นŠ์€ ๋ณต์‚ฌ(deep copy)๋ฅผ ํ”ผํ•˜๊ณ , ์†Œ์œ ๊ถŒ์„ ์ด์ „ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋™ ์˜๋ฏธ๋ก ์€ ์ฃผ๋กœ ์ด๋™ ์ƒ์„ฑ์ž(Move Constructor)์™€ ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž(Move Assignment Operator)๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด๋™ ์ƒ์„ฑ์ž์™€ ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋Š” ์˜ค๋ฅธ๊ฐ’ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์‹œ ๊ฐ์ฒด์˜ ๋ฆฌ์†Œ์Šค(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ๋ฐ›์•„, ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ ๊ฐ์ฒด์— '์ด๋™'ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์›๋ณธ ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ๊ฐ–์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

#include <iostream>
#include <vector>

class Moveable {
    std::vector<int> data;

public:
    // ์ด๋™ ์ƒ์„ฑ์ž
    Moveable(Moveable&& other) : data(std::move(other.data)) {
        std::cout << "Move Constructor called" << std::endl;
    }

    // ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž
    Moveable& operator=(Moveable&& other) {
        if (this != &other) {
            data = std::move(other.data);
            std::cout << "Move Assignment Operator called" << std::endl;
        }
        return *this;
    }
};

int main() {
    Moveable a;
    Moveable b = std::move(a); // ์ด๋™ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    Moveable c;
    c = std::move(b); // ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž ํ˜ธ์ถœ

    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `Moveable` ํด๋ž˜์Šค๋Š” ์ด๋™ ์ƒ์„ฑ์ž์™€ ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. `std::move` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `other` ๊ฐ์ฒด์˜ `data` ๋ฉค๋ฒ„์˜ ์†Œ์œ ๊ถŒ์„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค. `main` ํ•จ์ˆ˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ด๋™ ์˜๋ฏธ๋ก ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ํฌ์ธํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋‚˜ ๋ฐฐ์—ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŠน์ • ํƒ€์ž…์— ์ƒ๊ด€์—†์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค (32๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” 4๋ฐ”์ดํŠธ, 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” 8๋ฐ”์ดํŠธ).

๐Ÿ—ฃ๏ธ ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

 

๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฐ์—ด ์ž์ฒด๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฐ์—ด์€ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ๊ป˜ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋งŒํผ ์—ฐ์†์ ์ธ ๊ณต๊ฐ„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” ์ž์‹ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์„ ๊ฐ–์ง€ ์•Š๊ณ  ์ €์žฅํ•  ๊ณต๊ฐ„์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฒˆ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์€ ํฌ์ธํ„ฐ ์ƒ์ˆ˜์—ฌ์„œ ๋‹ค๋ฅธ ๋ฒˆ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๊ณ , ํฌ์ธํ„ฐ๋Š” ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ๋Œ€์ž…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ์ฆ๊ฐ ์—ฐ์‚ฐ์ž๊ฐ€ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์€ ์ƒ์ˆ˜์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์ƒ๋“ฑ์„ฑ, ๋™๋“ฑ์„ฑ์ด ๋ญ”๊ฐ€์š”?

 

์ƒ๋“ฑ์„ฑ(Identity) ๊ณผ ๋™๋“ฑ์„ฑ(Equality) ์€ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

1. ์ƒ๋“ฑ์„ฑ (Identity): ์ƒ๋“ฑ์„ฑ์€ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ •ํ™•ํžˆ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š”์ง€, ์ฆ‰ ๋‘ ๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ฐ์ฒด์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ƒ๋“ฑ์„ฑ ๋น„๊ต๋Š” ์ฃผ๋กœ ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

2. ๋™๋“ฑ์„ฑ (Equality): ๋™๋“ฑ์„ฑ์€ ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด๋‚˜ ์ƒํƒœ๊ฐ€ ๋™์ผํ•œ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์˜ ์‹ค์ œ ๊ฐ’ ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์žˆ๋”๋ผ๋„ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ๋™๋“ฑํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <iostream>

class Point {
public:
    int x, y;

    Point(int x, int y) : x(x), y(y) {}

    // ๋™๋“ฑ์„ฑ์„ ์œ„ํ•œ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

int main() {
    Point a(1, 2);
    Point b(1, 2);
    Point& c = a;

    // ๋™๋“ฑ์„ฑ ๋น„๊ต
    if (a == b) std::cout << "a and b are equal" << std::endl;
    else std::cout << "a and b are not equal" << std::endl;

    // ์ƒ๋“ฑ์„ฑ ๋น„๊ต
    if (&a == &c) std::cout << "a and c are identical" << std::endl;
    else std::cout << "a and c are not identical" << std::endl;

    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `Point` ํด๋ž˜์Šค๋Š” ๋™๋“ฑ์„ฑ ๋น„๊ต๋ฅผ ์œ„ํ•ด `==` ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. `a`์™€ `b`๋Š” ๋‚ด์šฉ์ด ๊ฐ™์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋™๋“ฑํ•˜์ง€๋งŒ ์ƒ๋“ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, `a`์™€ `c`๋Š” ์ƒ๋“ฑํ•ฉ๋‹ˆ๋‹ค (๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ).


๐Ÿ—ฃ๏ธ ์˜ค๋ฒ„๋กœ๋”ฉ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

 

์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๊ฐ™์œผ๋‚˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ํƒ€์ž…์„ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ž€ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๋ณด์žฅ๋ฐ›๋Š” ์„ ์–ธ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…, ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๊ฐœ์ˆ˜๊นŒ์ง€ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

https://nextcoder.tistory.com/39


๐Ÿ—ฃ๏ธ C++ ์ƒ์„ฑ์ž์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ค„๋ž˜์š”?

 

C++์—์„œ ์ƒ์„ฑ์ž(Constructor)๋Š” ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ์ฃผ์š” ๋ชฉ์ ์€ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ƒ์„ฑ์ž์˜ ์ด๋ฆ„์€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉฐ, ์˜ค๋ฒ„๋กœ๋“œ(์ฆ‰, ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๊ฐ€์งˆ ์ˆ˜)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ์ฃผ์š” ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. ๋””ํดํŠธ ์ƒ์„ฑ์ž (Default Constructor): ์•„๋ฌด๋Ÿฐ ์ธ์ž๋„ ๋ฐ›์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž๋™์œผ๋กœ ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž (Parameterized Constructor): ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
3. ๋ณต์‚ฌ ์ƒ์„ฑ์ž (Copy Constructor): ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„์ƒ์ˆ˜ ์™ผ๊ฐ’ ์ฐธ์กฐ(Type&)๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
4. ์ด๋™ ์ƒ์„ฑ์ž (Move Constructor): C++11์—์„œ ๋„์ž…๋˜์–ด ๊ฐ์ฒด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ '์ด๋™'ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

class Rectangle {
    int width, height;

public:
    // ๋””ํดํŠธ ์ƒ์„ฑ์ž
    Rectangle() : width(0), height(0) {}

    // ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž
    Rectangle(int w, int h) : width(w), height(h) {}

    // ๋ณต์‚ฌ ์ƒ์„ฑ์ž
    Rectangle(const Rectangle& other) : width(other.width), height(other.height) {}

    int area() { return width * height; }
};

int main() {
    Rectangle rect1;                // ๋””ํดํŠธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    Rectangle rect2(3, 4);          // ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    Rectangle rect3 = rect2;        // ๋ณต์‚ฌ ์ƒ์„ฑ์ž ํ˜ธ์ถœ

    return 0;
}

 


๐Ÿ—ฃ๏ธ C++ ํด๋ž˜์Šค์—์„œ ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‚˜์š”? 

 

1. ๋””ํดํŠธ ์ƒ์„ฑ์ž (Default Constructor): ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์•„๋ฌด๋Ÿฐ ์ธ์ž๋„ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
2. ๋ณต์‚ฌ ์ƒ์„ฑ์ž (Copy Constructor): ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
3. ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž (Copy Assignment Operator): ๊ฐ์ฒด์— ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
4. ์ด๋™ ์ƒ์„ฑ์ž (Move Constructor): C++11 ์ดํ›„์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ์ž„์‹œ ๊ฐ์ฒด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ด์ „ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
5. ์ด๋™ ํ• ๋‹น ์—ฐ์‚ฐ์ž (Move Assignment Operator): C++11 ์ดํ›„์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ์ž„์‹œ ๊ฐ์ฒด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ด์ „ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
6. ์†Œ๋ฉธ์ž (Destructor): ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ด ๋๋‚  ๋•Œ ํ˜ธ์ถœ๋˜์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

class Example {
    int value;
public:
    Example() : value(0) {} // ๋””ํดํŠธ ์ƒ์„ฑ์ž ๋ช…์‹œ์  ์ •์˜
    // ๋ณต์‚ฌ ์ƒ์„ฑ์ž, ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž, ์†Œ๋ฉธ์ž๋Š” ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋จ
};

int main() {
    Example obj1;          // ๋””ํดํŠธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    Example obj2 = obj1;   // ๋ณต์‚ฌ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    Example obj3;
    obj3 = obj1;           // ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž ํ˜ธ์ถœ
    // obj1, obj2, obj3 ์†Œ๋ฉธ ์‹œ ์†Œ๋ฉธ์ž ํ˜ธ์ถœ
    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `Example` ํด๋ž˜์Šค๋Š” ๋””ํดํŠธ ์ƒ์„ฑ์ž๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ์ƒ์„ฑ์ž, ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž, ์†Œ๋ฉธ์ž๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด `obj1`์€ ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ๋˜๊ณ , `obj2`๋Š” ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด `obj1`์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. `obj3`์€ ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด `obj1`์˜ ๋‚ด์šฉ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ด ๋๋‚  ๋•Œ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ Class, Struct ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

 

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜, ์ƒ์„ฑ์ž, ๊ทธ๋ฆฌ๊ณ  ์†Œ๋ฉธ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ์ƒ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ,

ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ง€์ •์ž๋Š” ์ •๋ณด ์€๋‹‰์„ ์œ„ํ•ด `private`์ด๋ฉฐ, ๊ตฌ์กฐ์ฒด์˜ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ง€์ •์ž๋Š” `public`์ด๋ผ๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํด๋ž˜์Šค๋Š” ๋Œ€์ฒด๋กœ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์บก์Šํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ตฌ์กฐ์ฒด๋Š” ์ฃผ๋กœ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 


๐Ÿ—ฃ๏ธ C++์˜ ํ…œํ”Œ๋ฆฟ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

 

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

template <typename T>
T getMax(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    // int ํƒ€์ž…์— ๋Œ€ํ•œ getMax ํ•จ์ˆ˜ ์‚ฌ์šฉ
    int intMax = getMax(3, 7);
    std::cout << "Max of 3 and 7 is " << intMax << std::endl;

    // double ํƒ€์ž…์— ๋Œ€ํ•œ getMax ํ•จ์ˆ˜ ์‚ฌ์šฉ
    double doubleMax = getMax(3.5, 2.5);
    std::cout << "Max of 3.5 and 2.5 is " << doubleMax << std::endl;

    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `getMax` ํ•จ์ˆ˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. `typename T`๋Š” ์–ด๋– ํ•œ ํƒ€์ž…๋„ ๋  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. `main` ํ•จ์ˆ˜์—์„œ๋Š” `getMax`๋ฅผ `int`์™€ `double` ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฐ๊ฐ ํ˜ธ์ถœํ•˜์—ฌ, ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์ฐธ์กฐ ๋ฆฌํ„ด์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

 

์ฐธ์กฐ ๋ฐ˜ํ™˜(Reference Return)์€ C++์—์„œ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐ(`&`) ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ๊ฐ’์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ’์˜ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์›๋ž˜ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฐธ์กฐ ๋ฐ˜ํ™˜์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ํŠนํžˆ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ, ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” `int` ํƒ€์ž…์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

int& getMax(int& a, int& b) {
    return (a > b) ? a : b;
}

int main() {
    int x = 10;
    int y = 20;

    // getMax ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ˆ˜์ •
    getMax(x, y) = 30;

    // ์ด์ œ x๋Š” 10, y๋Š” 30
    std::cout << "x: " << x << ", y: " << y << std::endl;

    return 0;
}


์ด ์ฝ”๋“œ์—์„œ `getMax` ํ•จ์ˆ˜๋Š” `a`์™€ `b` ์ค‘ ํฐ ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  `main` ํ•จ์ˆ˜์—์„œ `getMax(x, y)`๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `y`์˜ ๊ฐ’์„ 30์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ๋Š” ์ฐธ์กฐ ๋ฐ˜ํ™˜์„ ํ†ตํ•ด ์›๋ณธ ๋ณ€์ˆ˜์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ํ•ด์‹œํ…Œ์ด๋ธ”๊ณผ std map ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์‹ค๋ž˜์š”?

 

(hash table = `unordered_map`)

 

ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๊ฐ’์€ ํ‚ค์— ๋Œ€ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ๋ณด๊ด€๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ’์„ ์ €์žฅํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฝ์ž… ๋ฐ ๊ฒ€์ƒ‰์€ `O(1)` ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž ์žฌ์  ์ถฉ๋Œ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์ถฉ๋Œ๋˜๋Š” ๊ฐ’์„ ์„œ๋กœ ์ฒด์ด๋‹ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ, ํŠน์ • ํ‚ค์— ๋Œ€์‘๋˜๋Š” ์ธ๋ฑ์Šค ์œ„์น˜์— ๋ชจ๋“  ๊ฐ’์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. 

 

๋‹จ์ ์€ ์ด์ง„ํƒ์ƒ‰๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ž๋ž‘ํ•˜์ง€๋งŒ, ๊ทธ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋งŽ์€  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.(ํ…Œ์ด๋ธ”์ƒ์„ฑ) https://song-ift.tistory.com/m/55

 

C++ standard library ์˜ Map ์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“  red-black tree์— ํ‚ค์™€ ๊ฐ’ ์Œ์œผ๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์ด ์œ ์ง€๋˜๋ฏ€๋กœ ์‚ฝ์ž…, ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„์€ `O(logN)` ์œผ๋กœ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ํŒŒ์ด์ฌ๊ณผ C++์˜ ์ฐจ์ด์  ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์‹ค๋ž˜์š”?

 

ํŒŒ์ด์ฌ๊ณผ C++ ๋ชจ๋‘ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„์”ฉ ์ฝ์–ด ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ์–ธ์–ด๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค. C++์€ ์ปดํŒŒ์ผ๋Ÿฌ ์–ธ์–ด์ด๋ฉฐ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋กœ ๋ฒˆ์—ญ ํ›„ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ C++ ๋นŒ๋“œ ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

 

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


๐Ÿ—ฃ๏ธ dynamic linking, static linking ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

 

linking ์ด๋ž€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์—ฐ๊ฒฐํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

static linking ์€ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ™์ด ํฌํ•จ์‹œ์ผœ์„œ `.exe` ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ A๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๊ฐ๊ฐ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ A์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ๋ณ€๊ฒฝ ์ ์šฉ์„ ์œ„ํ•ด ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์—ฌ ๋งํ‚น์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋ชจ๋“ˆ์— ๋‹ด๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋™์  ๋งํ‚น ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

dynamic linking์€ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ, ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ์ฃผ์†Œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋  ๋•Œ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ์†Œ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ A๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ํ•ด๋„, A์˜ ์ฃผ์†Œ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•„๋‚„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ฃผ์†Œ๋กœ ๊ฐ€์•ผํ•˜๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ •์  ๋งํ‚น๋ณด๋‹ค ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์—์„œ A๋ฅผ ๋™์  ๋งํ‚น ๋ฐฉ์‹์œผ๋กœ ํ•  ๋•Œ, A๊ฐ€ ์ œ๊ฑฐ๋  ๊ฒฝ์šฐ ๋” ์ด์ƒ ์ฐธ์กฐํ•  ํ•จ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


Reference

 

https://velog.io/@jacod2/C-%EB%A9%B4%EC%A0%91-%ED%82%A4%EC%9B%8C%EB%93%9C

https://makefortune2.tistory.com/242

https://wecandev.tistory.com/96

https://velog.io/@mardi2020/C-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC