์๋ ํ์ธ์, ์ซ๋๋ฏธ์ ๋๋ค.
์ฃผ์ธ์ด๊ฐ C++์ด์ง๋ง Java, Python ์ธ์ด ๊ด๋ จ ์ง์๋ ์ฒจ๋ถํ ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
C++ ๋น๋ ๊ณผ์
- ์ ์ฒ๋ฆฌ (Preprocessing):
- ์ด ๋จ๊ณ์์๋ ์์ค ํ์ผ(.cpp ํ์ผ)์ด ์ ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ (#include, #define, #if, ๋ฑ)์ด ์คํ๋์ด ์ฝ๋์ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, #include ์ง์๋ฌธ์ ํด๋น ํค๋ ํ์ผ์ ๋ด์ฉ์ ์์ค ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
- ์ด ๋จ๊ณ์์์ ์ถ๋ ฅ์ "์ ์ฒ๋ฆฌ๋ ์์ค ์ฝ๋"์ด๋ฉฐ, ๋ณดํต์ ์ฌ๋์ด ์ฝ๊ธฐ ์ด๋ ค์ด ํํ์ ๋๋ค.
- ์ปดํ์ผ (Compilation):
- ์ ์ฒ๋ฆฌ๋ ์์ค ์ฝ๋๋ ์ปดํ์ผ๋ฌ์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋ฉ๋๋ค.
- ์ปดํ์ผ๋ฌ๋ ๊ฐ ์์ค ํ์ผ(.cpp)์ ์ค๋ธ์ ํธ ํ์ผ(.obj ๋๋ .o)๋ก ๋ณํํฉ๋๋ค.
- ์ด ๋จ๊ณ์์๋ ๊ตฌ๋ฌธ ๋ถ์, ์๋ฏธ ๋ถ์, ์ฝ๋ ์ต์ ํ ๋ฑ์ด ์ํ๋ฉ๋๋ค.
- ์ด์
๋ธ๋ฆฌ (Assembly):
- ์ปดํ์ผ ๋จ๊ณ์์ ์์ฑ๋ ์ค๋ธ์ ํธ ํ์ผ๋ค์ ๊ธฐ๊ณ์ด ์ฝ๋(์ด์ ๋ธ๋ฆฌ์ด)๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- ์ด์ ๋ธ๋ฆฌ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ ๋จ๊ณ์ ๋ด์ฅ๋์ด ์์ผ๋ฉฐ, ๋ณ๋์ ๋จ๊ณ๋ก ๋ถ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ๋งํน (Linking):
- ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ์ค๋ธ์ ํธ ํ์ผ๋ค์ด ๋ง์ปค์ ์ํด ํ๋์ ์คํ ํ์ผ๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
- ๋ง์ปค๋ ๊ฐ ์ค๋ธ์ ํธ ํ์ผ๋ค ๊ฐ์ ์์กด์ฑ์ ํด๊ฒฐํ๊ณ , ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ฅผ ํฌํจ์์ผ ์คํ ๊ฐ๋ฅํ ํ์ผ(์: .exe ๋๋ .out)์ ์์ฑํฉ๋๋ค.
- ์ด ๋จ๊ณ์์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ํ ์ฐธ์กฐ, ์ ์ญ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฑ์ด ์ด๋ฃจ์ด์ง๋๋ค.
C++ ์ปดํ์ผ ๊ณผ์
C++์ ์ปดํ์ผ ๊ณผ์ ์ ์์ค ์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๋ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ณต์กํ ์ํํธ์จ์ด ํ๋ก์ ํธ๋ฅผ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ฃผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์ฒ๋ฆฌ (Preprocessing):
- ์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค ํ์ผ(.cpp ํ์ผ)์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ ์ฒ๋ฆฌ ์ง์๋ฌธ (์: #include, #define, #if ๋ฑ)์ด ์คํ๋ฉ๋๋ค. #include๋ ํด๋น ํค๋ ํ์ผ์ ๋ด์ฉ์ ์์ค ํ์ผ์ ์ฝ์ ํ๊ณ , ๋งคํฌ๋ก ์ ์๋ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ์ง์๋ฌธ์ ํด๋น ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์กฐ์ ํฉ๋๋ค.
- ์ด ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ ์ ์ฒ๋ฆฌ๋ ์ฝ๋์ด๋ฉฐ, ์ด๋ ๋ค์ ๋จ๊ณ์์ ์ปดํ์ผ๋ฌ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ปดํ์ผ (Compilation):
- ์ ์ฒ๋ฆฌ๋ ์์ค ์ฝ๋๋ ์ปดํ์ผ๋ฌ์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ณํ๋ฉ๋๋ค.
- ์ปดํ์ผ๋ฌ๋ ์์ค ํ์ผ(.cpp)์ ์ค๋ธ์ ํธ ํ์ผ(.obj ๋๋ .o)๋ก ๋ณํํฉ๋๋ค. ์ด๋ ์์ง ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ด ์๋๋๋ค.
- ์ด ๋จ๊ณ์์ ๊ตฌ๋ฌธ ๋ถ์(Syntax Analysis), ์๋ฏธ ๋ถ์(Semantic Analysis), ์ค๊ฐ ์ฝ๋ ์์ฑ(Intermediate Code Generation), ์ต์ ํ(Optimization) ๋ฑ์ ๊ณผ์ ์ด ์ํ๋ฉ๋๋ค.
- ๋งํน (Linking):
- ์ปดํ์ผ ๋จ๊ณ์์ ์์ฑ๋ ์ค๋ธ์ ํธ ํ์ผ๋ค์ ๋ง์ปค์ ์ํด ํ๋์ ์คํ ํ์ผ๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
- ๋ง์ปค๋ ์ค๋ธ์ ํธ ํ์ผ๋ค ๊ฐ์ ์์กด์ฑ์ ํด๊ฒฐํ๊ณ , ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ฅผ ํฌํจ์์ผ ์ต์ข ์ ์ธ ์คํ ๊ฐ๋ฅํ ํ์ผ(์: .exe ๋๋ .out)์ ์์ฑํฉ๋๋ค.
- ์ด ๋จ๊ณ์์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ํ ์ฐธ์กฐ ํด๊ฒฐ, ์ ์ญ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฑ์ด ์ด๋ฃจ์ด์ง๋๋ค.
C++ ์ปดํ์ผ๋ฌ๋ ์ด๋ฌํ ๊ฐ ๋จ๊ณ๋ฅผ ํตํด ๊ณ ์์ค์ ์์ค ์ฝ๋๋ฅผ ์ ์์ค์ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ณํํ๋ ๋ณต์กํ ์์ ์ ์ํํฉ๋๋ค. ์ปดํ์ผ ๊ณผ์ ์ ์ ํํ ์ธ๋ถ ์ฌํญ์ ์ฌ์ฉํ๋ ์ปดํ์ผ๋ฌ์ ์ข ๋ฅ(์: GCC, Clang, MSVC ๋ฑ)์ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
endl, \n ์ฐจ์ด
C++์์ endl๊ณผ \n์ ๋ ๋ค ์ค๋ฐ๊ฟ์ ์ํํ์ง๋ง, ๊ทธ๋ค ์ฌ์ด์๋ ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด ์ฐจ์ด๋ ์ฃผ๋ก ๋ฒํผ ํ๋ฌ์์ ๊ด๋ จ์ด ์์ต๋๋ค.
- \n (Newline Character):
- \n์ ๋จ์ํ ์ค๋ฐ๊ฟ ๋ฌธ์์ ๋๋ค.
- ์ด ๋ฌธ์๋ ๋ฌธ์์ด ๋ด์์ ์๋ก์ด ์ค์ ์์ํ๋๋ก ์ง์ํฉ๋๋ค.
- ์ถ๋ ฅ ์คํธ๋ฆผ์ \n์ ์ฌ์ฉํ๋ฉด ํ์ฌ ์์น์์ ์ค์ ๋ฐ๊พธ์ง๋ง, ์ถ๋ ฅ ๋ฒํผ๋ฅผ ํ๋ฌ์ํ์ง๋ ์์ต๋๋ค. ์ฆ, ๋ฒํผ์ ๋ด์ฉ์ด ์ฆ์ ์ถ๋ ฅ ์ฅ์น๋ก ์ ์ก๋์ง ์์ ์ ์์ต๋๋ค.
- ๋ฒํผ๊ฐ ํ๋ฌ์๋์ง ์๋๋ค๋ ๊ฒ์ ์ถ๋ ฅ์ด ์ง์ฐ๋ ์ ์๊ณ , ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข ๋ฃ๋์์ ๋ ์ผ๋ถ ์ถ๋ ฅ์ด ์์ค๋ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
- 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), ํ์ค ํน์ ๋ฌธ์(์: !, @, #, $, ๋ฑ), ๊ทธ๋ฆฌ๊ณ ์ ์ด ๋ฌธ์(์: ์ค๋ฐ๊ฟ, ํญ ๋ฑ)๊ฐ ํฌํจ๋ฉ๋๋ค.
ํ๋์์์ ์ฌ์ฉ
์์คํค๋ ์ด๊ธฐ ์ปดํจํฐ ์์คํ ์์ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ์ธ์ฝ๋ฉ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋์์ผ๋ฉฐ, ํ์ฌ๋ ๋ง์ ์์คํ ๊ณผ ํ๋กํ ์ฝ์์ ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ์ธ์ฝ๋ฉ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋์๋ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ๋ก ์ธํด ์์คํค๋ณด๋ค ๋ ์ง๋ณด๋ ๋ฌธ์ ์ธ์ฝ๋ฉ ์ฒด๊ณ๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค:
- ๋ค๊ตญ์ด ์ง์: ์์คํค๋ ์ฃผ๋ก ์์ด๋ฅผ ์ํด ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์ธ์ด์ ๋ฌธ์๋ฅผ ์ง์ํ๋ ๋ฐ ํ๊ณ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด UTF-8, UTF-16๊ณผ ๊ฐ์ ์ ๋์ฝ๋ ์ธ์ฝ๋ฉ ์ฒด๊ณ๊ฐ ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ์ด๋ค์ ์ ์ธ๊ณ์ ๋ค์ํ ์ธ์ด์ ๋ฌธ์๋ฅผ ์ง์ํฉ๋๋ค.
- ํ์ฅ์ฑ: ์์คํค๋ ์๋์ ์ผ๋ก ์ ํ๋ ์์ ๋ฌธ์๋ง์ ์ง์ํฉ๋๋ค. ์ ๋์ฝ๋์ ๊ฐ์ ํ์ฅ๋ ์ธ์ฝ๋ฉ ์ฒด๊ณ๋ ํจ์ฌ ๋ ๋ง์ ๋ฌธ์์ ๊ธฐํธ๋ฅผ ํฌํจํ ์ ์์ด, ๋ค์ํ ๊ธฐ์ ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํฌ ์ ์์ต๋๋ค.
- ํธํ์ฑ: ๋ง์ ํ๋ ์์คํ ๊ณผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์ ๋์ฝ๋๋ฅผ ๊ธฐ๋ณธ ์ธ์ฝ๋ฉ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ์์คํค ๋ฌธ์ ์งํฉ์ ์ ๋์ฝ๋์ ํธํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, 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()`์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- `malloc()`์ ์ง์ ๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ๊ณ , ์ด๊ธฐํํ์ง ์์ ์ํ๋ก ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค. ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์๋ ์ฐ๋ ๊ธฐ ๊ฐ์ด ๋จ์์์ ์ ์์ต๋๋ค.
- `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