-
ํญ๋ชฉ 7 : ๊ฐ์ฒด ์์ฑ์ ๊ดํธ์ ์ค๊ดํธ๋ฅผ ๊ตฌ๋ถํ๋ผ.
-
- ๊ธฐ๋ณธ ๊ฐ์ฒด ์์ฑ
๊ฐ์ฒด๋ฅผ ์์ฑ ํ ๋ ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
int x(0) ; // ์ด๊ธฐ์น๋ฅผ ๊ดํธ๋ก ๊ฐ์ผ ์
int y = 0; // ์ด๊ธฐ์น๋ฅผ "=" ๋ค์์ ์ง์ ํ ์
int z { 0 }; // ์ด๊ธฐ์น๋ฅผ ์ค๊ดํธ๋ก ๊ฐ์ผ ์
int z = { 0 } // "="์ ์ค๊ดํธ๋ก ์ด๊ธฐ์น๋ฅผ ์ง์ ํ ์, ๋์ฒด๋ก ์ค๊ดํธ๋ง ์ฌ์ฉํ ๊ตฌ๋ฌธ๊ณผ ๋์ผ
Widget w1; // ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถ
Widget w2 = w1; // ๋ฐฐ์ ์ด ์๋; ๋ณต์ฌ ์์ฑ์๋ฅผ ํธ์ถ
w1 = w2; ๋ฐฐ์ ; ๋ณต์ฌ ๋ฐฐ์ ์ฐ์ฐ์๋ฅผ ํธ์ถ-
- ๊ท ์ผ ์ด๊ธฐํ์ ์ฅ์ (์ค๊ดํธ ์ด๊ธฐํ)
C++98๋ ์ฌ๋ฌ๊ฐ์ง ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ง์ํ์ง๋ง, ์ํ๋ ์ด๊ธฐํ๋ฅผ ๋ช ์์ ์ผ๋ก ํํํ ์ ์๋ ์ํฉ์ด ์๋ค.
(ex. ์๋ก ๋ค๋ฅธ ์์์ ๊ฐ๋ค์ ๋ด๋ STL ์ปจํ ์ด๋๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ)
C++11์ ๊ท ์ผ ์ด๊ธฐํ๋ฅผ ๋์ ! ์ด๊ฒ์ ์ด๋์๋ ์ฌ์ฉํ ์ ์๊ณ ๋ชจ๋ ๊ฒ์ ํํํ ์ ์๋ ๋จ ํ ์ข ๋ฅ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ.
std::vector<int> v{ 1, 3, 5 }; // v์ ์ด๊ธฐ ๋ด์ฉ์ 1, 3, 5
class Widget
{
private:
int x{0}; // OK
int y = 0; // OK
int z(0); // NOT OK
// not-static value์ ๋ํ default๊ฐ์ ์ด๊ธฐํ ํ๋๋ฐ ()๋ ์๋๋ค.
}๋ณต์ฌํ ์ ์๋ ๊ฐ์ฒด(์ด๋ฅผํ ๋ฉด std::atomic )๋ ์ค๊ดํธ๋ ๊ดํธ๋ก๋ ์ด๊ธฐํํ ์ ์์ง๋ง "="๋ก๋ ์ด๊ธฐํ ํ ์ ์๋ค.
std::automic<int> ai1{ 0 } // OK
std::automic<int> ai2(0) // OK
std::automic<int> ai3 = 0 // NOT OK// Copy๊ฐ ์๋๋ Object์ ๋ํด์๋ ()๋ ๋๋๋ฐ =๋ ์๋๋ค.
์ ๋ด์ฉ์ ๋ณด๋ฉด ์ด๋์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ {} ๋ฟ์ด๋ค. (์ค๊ดํธ ์ด๊ธฐํ๋ฅผ '๊ท ์ผ' ์ด๊ธฐํ๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ !)
์ค๊ดํธ ์ด๊ธฐํ์ ํ์ ์ ์ธ ๊ธฐ๋ฅ ํ๋๋ ์๋ฌต์ ์ขํ๊ธฐ ๋ณํ์ ๋ฐฉ์งํด ์ค๋ค!
double x, y, z;
int sum1{ x + y + z }; //์ค๋ฅ double๋ค์ ํฉ์ int๋ก ํํํ์ง ๋ชปํ ์ ์์๊ดํธ๋ "="๋ฅผ ์ด์ฉํ ์ด๊ธฐํ๋ ์ด๋ฌํ ์ขํ๊ธฐ ๋ณํ์ ์ ๊ฒํ์ง ์๋๋ค.
int sum2(x + y + z); // OK
int sum3 = x + y + z; // OK์ค๊ดํธ ์ด๊ธฐํ์ ๋ ๋ค๋ฅธ ์ฃผ๋ชฉํ ๋งํ ํน์ง! C++์์ ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์(most vexing parse)์ ์์ ๋กญ๋ค!
C++์์ ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์์ "์ ์ธ์ผ๋ก ํด์ํ ์ ์๋ ๊ฒ์ ํญ์ ์ ์ธ์ผ๋ก ํด์ํด์ผ ํ๋ค."๋ C++์ ๊ท์น์์ ๋น๋กฏ๋ ํ๋์ ๋ถ์์ฉ
Widget w1(10) // ์ธ์ 10์ผ๋ก Widget์ ์์ฑ์๋ฅผ ํธ์ถ
Widget w2(); // ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์! Wideget์ ๋๋ ค์ฃผ๋, w2๋ผ๋ ์ด๋ฅด์ ํจ์๋ฅผ ์ ์ธ
์ค๊ดํธ๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ์์ฑํ ๋์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ฒช์ง ์๋๋ค.
Widget w3{}; // ์ธ์ ์์ด Widget์ ์์ฑ์๋ฅผ ํธ์ถ
์ค๊ดํธ ์ด๊ธฐํ์๋ ์นญ์ฐฌํ ์ ์ด ๋ง๋ค.
๊ฐ์ฅ ๋ค์ํ ๋ฌธ๋งฅ์์ ์ฌ์ฉํ ์ ์๋ ๊ตฌ๋ฌธ! ์๋ฌต์ ์ธ ์ขํ๊ธฐ ๋ณํ์ ๋ฐฉ์ง! C++์ ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์์ผ๋ก๋ถํฐ ์์ ๋กญ๋ค.
-
- ์ค๊ดํธ ์ด๊ธฐํ์ ๋จ์ ๋ฐ std::initializer_list
ํ์ง๋ง ์ค๊ดํธ ์ด๊ธฐํ์ ๋จ์ ์ ์ข ์ข ์์์น ๋ชปํ ํ๋์ ๋ณด์ธ๋ค.
์ค๊ดํธ ์ด๊ธฐํ, std::initializer_list, ์์ฑ์ ์ค๋ณต์ ์ฌ ํด์ ์ฌ์ด์ ๋ค์ฝํ ๊ด๊ณ์์ ๋น๋กฏ๋๋ค.
๋ค๋ฅธ ๋ฐฉ์์ผ๋ก(auto๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ) ์ ์ธ๋ ๋ณ์์์๋ ์ค๊ดํธ ์ด๊ธฐ์น๊ฐ ์ข ๋ ์ง๊ด์ ์ธ ํ์์ผ๋ก ์ฐ์ญ ๋์์ง๋ง
auto๋ก ์ ์ธ๋ ๋ณ์์ ๋ํด์๋ std::initializer_list ํ์์ผ๋ก ์ฐ์ญ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
class Widget {
public:
Widget(int i, bool b);
Widget(int i, double d);
};
Widget w1(10, true); // ์ฒซ ์์ฑ์๋ฅผ ํธ์ถ
Widget w2{10, true); // ์ฒซ ์์ฑ์๋ฅผ ํธ์ถ
Widget w3(10, 5.0); // ๋์งธ ์์ฑ์๋ฅผ ํธ์ถ
Widget w4{10, 5.0} // ๋์งธ ์์ฑ์๋ฅผ ํธ์ถBut! ์์ฑ์ ์ค ํ๋ ์ด์์ด std::initializer_list ํ์์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ธ์
์ค๊ดํธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ด์ํ๊ฒ๋ std::initializer_list๋ฅผ ๋ฐ๋ ์ค๋ณต ์ ์ฌ ๋ฒ์ ์ ๊ฐํ๊ฒ ์ ํธํ๋ค.
class Widget {
public:
Widget(int i, bool b);
Widget(int i, double d);
Widget(std::initializer_list<long diouble> il); // ์ถ๊ฐ
};// ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ; std::initializer_list ์์ฑ์ ํธ์ถ (10, true๊ฐ long double๋ก ๋ณํ)
Widget w2{10, true};
Widget w4{10, 5.0};๋ณดํต์ ๋ณต์ฌ ์์ฑ์ด๋ ์ด๋ ์์ฑ์ด ์ผ์ด๋ฌ์ ์ํฉ์์๋ std::initializer_list ์์ฑ์๊ฐ ๋ผ์ด๋ค์ด์ ๊ธฐํ๋ฅผ ๊ฐ๋ก์ฑ๋ค.
class Widget {
public:
Widget(int i, bool b);
Widget(int i, double d);
Widget(std::initializer_list<bool> il); // ์์์ ํ์์ด bool
// ์๋ฌต์ ๋ณํ ํจ์๋ ์์
};Widger w{10, 5.0} // ์ค๋ฅ ์ขํ๊ธฐ ๋ณํ์ด ํ์ํจ
์ปดํ์ผ๋ฌ๊ฐ ์์ ์ ๊ฒฐ์ฌ์ ํฌ๊ธฐํ๊ณ ๋ณดํต์ ์ค๋ณต์ ์ฌ ํด์๋ก ๋ฌผ๋ฌ๋๋ ๊ฒฝ์ฐ๋ ์ค๊ดํธ ์ด๊ธฐ์น์ ์ธ์ ํ์๋ค์
std::initializer_list ์์ ํ์์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ด ์์ ์์ ๋!
std::initializer_list<std::string>
class Widget {
public:
Widget(int i, bool b);
Widget(int i, double d);
Widget(std::initializer_list<std::string> il); // ์ถ๊ฐ
};
Widget w2{10, true}; // ์ค๊ดํธ ์ฌ์ฉ, ์ฒซ ์์ฑ์ ํธ์ถ
Widger w4{10, 5.0}; // ์ค๊ดํธ ์ฌ์ฉ, ๋๋ ์์ฑ์ ํธ์ถ
// ๋น ์ค๊ดํธ ์
class Widget {
public:
Widget(); // ๊ธฐ๋ณธ ์์ฑ์
Widget(std::initializer_list<int> il); // std::initializer_list ์์ฑ์
// ์๋ฌต์ ๋ณํ ํจ์ ์์
};
Widget w1; // ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถ
Widget w2{}; // ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถ
Widget w3(); // ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์! ํจ์ ์ ์ธ!
// ๋ง์ฝ std::initializer_list ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด -> {{}} , ({})
Widget w4({});
Widget w5{{}};// std::vector
std::vector์๋ ์ปจํ ์ด๋์ ์ด๊ธฐ ํฌ๊ธฐ์ ์ปจํ ์ด๋์ ๋ชจ๋ ์ด๊ธฐ ์์์ ๊ฐ์ ์ง์ ํ ์ ์๋
๋น std::initializer_list , std::initializer_list ์์ฑ์๊ฐ ์๋ค.
std::vector v1(10, 20); // ๋ชจ๋ ์์์ ๊ฐ์ด 20์ธ, ์์ 10๊ฐ์ง๋ฆฌ std::vector๊ฐ ์์ฑ๋จ
std::vector v2{10, 20}; // ๊ฐ์ด ๊ฐ๊ฐ 10, 20์ธ ๋ ์์๋ฅผ ๋ด์ std::vectore๊ฐ ์์ฑ๋จ
-
- ์ ๋ฆฌ
์ฒซ์งธ.
ํด๋์ค๋ฅผ ์์ฑํ ๋์๋, ๋ง์ผ ์ผ๋จ์ ์ค๋ณต์ ์ฌ๋ ์์ฑ์ ์ค์ std::initializer_list๋ฅผ ๋ฐ๋ ํจ์๊ฐ ํ๋ ์ด์
์กด์ฌํ๋ค๋ฉด, ์ค๊ดํธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ด์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋์๋ std::initializer_list ์ค๋ณต์ ์ฌ๋ค๋ง ์ ์ฉ ๋ ์ ์์์ ์ฃผ์
๋์งธ.
ํด๋์ค ์ฌ์ฉ์๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ดํธ์ ์ค๊ดํธ๋ฅผ ์ธ์ฌํ๊ฒ ์ ํํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ๋ ์ค ํ๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ผ์์ ํญ์ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ํ๋๋ ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํ๋ค.
์ค๊ดํธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
-
๋ค์ํ ๋ฌธ๋งฅ์ ์ ์ฉํ ์ ์๋ค.
-
์ขํ๊ธฐ ๋ณํ์ ๋ฐฉ์งํด ์ค๋ค.
-
๊ฐ์ฅ ์ฑ๊ฐ์ ๊ตฌ๋ฌธ ํด์์์ ์์ ๋กญ๋ค.
- ์ด๋ ๊ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์์ ์ดํด (ex. std::vector)
๊ดํธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
-
C++ ๊ตฌ๋ฌธ์ ์ ํต๊ณผ์ ์ผ๊ด์ฑ
-
auto๊ฐ std::initializer_list๋ฅผ ์ฐ์ญํ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ์
-
๊ฐ์ฒด ์์ฑ์ ์๋์น ์๊ฒ std::initializer_list๊ฐ ์์ฑ์๊ฐ ํธ์ถ๋๋ ์ผ์ด ์๋ค๋ ์
- ์ค๊ดํธ๋ก๋ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์์์ ์์ธ (๊ตฌ์ฒด์ ์ธ ๊ฐ๋ค๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑ)
์กฐ์ธ์ ๋์ค ํ๋๋ฅผ ์ ํํด์ ์ผ๊ด๋๊ฒ ์ ์ฉํ๋ผ๋ ๊ฒ!
ํ ํ๋ฆฟ ์์ฑ์์๊ฒ๋ ๊ฐ์ฒด ์์ฑ์ ๊ดํธ์ ์ค๊ดํธ์ ๊ธด์ฅ ๊ด๊ณ๊ฐ ํนํ๋ ์ง์ฆ์ค๋ฌ์ธ ์ ์๋๋ฐ ๋ ์ค ์ด๋๊ฒ์
์ฌ์ฉํด์ผํ๋์ง๋ฅผ ํ๋จํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
ex. ์์์ ๊ฐ์์ ์ธ์๋ค์ ์ง์ ํด์ ์์์ ํ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ
template<typename T, typename... Ts>
void doSimeWork(Ts&&... params) {
params... ์ผ๋ก๋ถํฐ ์ง์ญ T ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
}
T localObject(std::forward<Ts>(params)...); // ๊ดํธ๋ฅผ ์ฌ์ฉ
T localObject{std::forward<Ts>(params)...}; // ์ค๊ดํธ๋ฅผ ์ฌ์ฉ
std::vector<int> v;
doSomeWork<std::vector<int>>(10, 20);
๋ง์ฝ localObject๊ฐ ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์๊ฐ 10๊ฐ์ธ std::vector
์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์๊ฐ 2๊ฐ์ธ std::vector์ด๋ค.
๋ด๋ถ์ ์ผ๋ก ์ ์ฑ ์ ์ ํ๊ณ ์ธํฐํ์ด์ค์ ์ผ๋ถ์ ๋ฌธ์ํ ํจ์ผ๋ก์จ ๋ฌธ์ ํด๊ฒฐ(std::make_unique, std::make_shared)