Recommended
PPTX
PPTX
PDF
Java script ๊ฐ์์๋ฃ_ed13
PPTX
Api design for c++ pattern
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ Descriptorแแ
ตแแ
ขแแ
กแแ
ต 20160403
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ณแฏแ
แ
ขแแ
ณ+แแ
ฎแแ
ฉ+แแ
ตแแ
ขแแ
กแแ
ต 20160310
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
ณแ
แ
ฉแแ
ฅแแ
ต แแ
ตแแ
ณแแ
ณแ
แ
ตแธแแ
ฅ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ ๊ฐ์ฒด ํด๋์ค แแ
ตแแ
ขแแ
กแแ
ต
PDF
Javascript ๊ฐ์ฒด์์ฑํจํด
PPTX
ํ์ด์ฌ namespace Binding ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ class ๋ฐ function namespace ์ดํดํ๊ธฐ
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ class ๋ฐ ์ธ์คํด์ค ์์ฑ ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ขแจแแ
ฆแแ
ตแแ
ฃแผ+แแ
ตแแ
ขแแ
กแแ
ต 20160131
PDF
PPTX
python data model ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
ณแฏแ
แ
กแแ
ณแแ
ณ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
กแซแแ
ฉแจแแ
ก แแ
ขแผแแ
ฅแผแแ
ก แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ฎแแ
ญ+แแ
ญแผแแ
ฅ+แแ
ฅแผแ
แ
ต 20160304
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
กแทแแ
ฎ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ Special method แแ
ตแแ
ขแแ
กแแ
ต
PDF
[WELC] 22. I Need to Change a Monster Method and I Canโt Write Tests for It
PPTX
ํ์ด์ฌ ๋ณ๋ ฌํ๋ก๊ทธ๋๋ฐ
PPTX
PDF
PPTX
ํ์ด์ฌ iterator generator ์ดํดํ๊ธฐ
PDF
Midterm presentation revised2
PDF
๋๋ฐ์๊ฐ ๋งํ๋ ์์ ์ ๋๋ PPT
More Related Content
PPTX
PPTX
PDF
Java script ๊ฐ์์๋ฃ_ed13
PPTX
Api design for c++ pattern
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ Descriptorแแ
ตแแ
ขแแ
กแแ
ต 20160403
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ณแฏแ
แ
ขแแ
ณ+แแ
ฎแแ
ฉ+แแ
ตแแ
ขแแ
กแแ
ต 20160310
What's hot
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
ณแ
แ
ฉแแ
ฅแแ
ต แแ
ตแแ
ณแแ
ณแ
แ
ตแธแแ
ฅ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ ๊ฐ์ฒด ํด๋์ค แแ
ตแแ
ขแแ
กแแ
ต
PDF
Javascript ๊ฐ์ฒด์์ฑํจํด
PPTX
ํ์ด์ฌ namespace Binding ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ class ๋ฐ function namespace ์ดํดํ๊ธฐ
PDF
PPTX
แแ
กแแ
ตแแ
ฅแซ class ๋ฐ ์ธ์คํด์ค ์์ฑ ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ขแจแแ
ฆแแ
ตแแ
ฃแผ+แแ
ตแแ
ขแแ
กแแ
ต 20160131
PDF
PPTX
python data model ์ดํดํ๊ธฐ
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
ณแฏแ
แ
กแแ
ณแแ
ณ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
กแซแแ
ฉแจแแ
ก แแ
ขแผแแ
ฅแผแแ
ก แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ+แแ
ฎแแ
ญ+แแ
ญแผแแ
ฅ+แแ
ฅแผแ
แ
ต 20160304
PPTX
แแ
กแแ
ตแแ
ฅแซ แแ
กแทแแ
ฎ แแ
ตแแ
ขแแ
กแแ
ต
PPTX
แแ
กแแ
ตแแ
ฅแซ Special method แแ
ตแแ
ขแแ
กแแ
ต
PDF
[WELC] 22. I Need to Change a Monster Method and I Canโt Write Tests for It
PPTX
ํ์ด์ฌ ๋ณ๋ ฌํ๋ก๊ทธ๋๋ฐ
PPTX
PDF
PPTX
ํ์ด์ฌ iterator generator ์ดํดํ๊ธฐ
Viewers also liked
PDF
Midterm presentation revised2
PDF
๋๋ฐ์๊ฐ ๋งํ๋ ์์ ์ ๋๋ PPT
PDF
Apache MINA๋ฅผ ์ฌ์ฉํ ๋คํธ์ํฌ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ
PDF
Citation indexes(201501) ppt
PDF
CX Design Game ํ๊ธ๋ฒ์
PPTX
๊ฐ๊ฒฝํ ์ปจ์
๊ธฐํ ๋ฐํ PPT
PPT
[ํผํค์บ์คํธ] 5ํ๋
์ ๋ฐฐ ppt ํ
ํ๋ฆฟ ๋ ์ด์์
PDF
PDF
06์ 26์ผ ์ง๋ก 3 d ํ๋ก๊ทธ๋๋ฐ ๋ฐํ
PDF
2014 ๊ณต์ ํ๋ธ์ ๋ 8. แแ
ฉแแ
ฉแแ
กแทแแ
ณ แแ
ฃแผแแ
กแซแแ
ฉ
PPTX
07 ์ํธ๋ฆฌ์ ํจ๊ปํ๋ ํผ์ง์ปฌ ์ปดํจํ
(์ผ์๋ณด๋)
PPTX
PDF
PDF
designDIVE 2020_7ํ ํ๊ฒฝ์์
PDF
INBRIEF_STARTstart with Prezi vol.01-์
๋ฌธํธ
PDF
Electrical Fire Data Research
PDF
๊ฐํธ์ธ๋ ฅ ๊ฐํธ(ํ์์ฒด)์ ๋ํ ์ ์ฒด ๊ฐํธ๋ ํ์ ์ค๋ฌธ์กฐ์ฌ ์๋ด PPT
PDF
[Design dive] eyecan๋ฐํ(web)
PDF
PPT
Micro Marketing for Second Button(by Pistachio)
Similar to Effective c++(chapter3,4)
PPTX
PPTX
PPT
effective c++ chapter 3~4 ์ ๋ฆฌ
PPTX
PPTX
PDF
Effective c++ chapter3, 4 ์์ฝ๋ณธ
PDF
Effective C++ Chapter 3 Summary
PPTX
PPTX
Effective C++ ์ ๋ฆฌ chapter 3
PDF
C++ Advanced ๊ฐ์ 2์ฃผ์ฐจ
PPTX
Effective c++ ์ ๋ฆฌ chapter 4
PDF
PPTX
์ดํํฐ๋ธ C++ 5,6 ์ฅ ์คํฐ๋
PPTX
์ดํํฐ๋ธ C++ ์คํฐ๋
PPTX
Effective c++(chapter 5,6)
PDF
PDF
More effective c++ chapter4 แแ
ตแแ
ฎ แแ
กแผแแ
ฉแจ 29แแ
กแแ
ต
PPTX
More effective c++ chapter1,2
PPTX
Api design for c++ ch3 pattern
PPTX
๋ชจ์ด ์ดํํฐ๋ธ c++ 5์ฅ ์คํฐ๋
More from ๋ฌธ์ต ์ฅ
PPTX
PPTX
PPTX
Effective c++ chapter 7,8
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
์ผ๊ฐํ์ผ๋ก ์ง๋ฉด ๋ง๋ค๊ธฐ
PPTX
์์ผ ์ฃผ์ ๊ตฌ์กฐ์ฒด ๋ค๋ฃจ๊ธฐ(์๋์ฐ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ)
PPTX
PPTX
PPTX
Effective c++(chapter3,4) 1. 2. resource
๏ ์ฌ์ฉ์ ์ผ๋จ ๋ง์น๊ณ ๋ ํ์ ์์คํ
์ ๋๋ ค์ฃผ์ด์ผ ํ๋ ๋ชจ๋ ๊ฒ
๏ ๊ฐ์ ธ์์ ๋ค ์ป์ผ๋ฉด ํด์ ํด์ผ, ์ฆ ๋์ ์ฃผ์ด์ผ ํ๋ค.
๏ ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ(๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ ํด์ ํ์ง ์์ผ๋ฉด memory leak)
3. ์์์ ํญ์ ํด์ ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ
๏ ์์์ ๊ฐ์ฒด์ ๋ฃ๊ณ
๏ ๊ทธ ์์ ํด์ ๋ฅผ ์๋ฉธ์๊ฐ ๋งก๋๋ก ํ๋ฉฐ,
๏ ๊ทธ ์๋ฉธ์๊ฐ ๋ฐ๋์ ํธ์ถ๋๋๋ก ๋ง๋ ๋ค.
4. auto_ptr
๏ ํฌ์ธํฐ์ ๋น์ทํ๊ฒ ๋์ํ๋ ๊ฐ์ฒด(smart
pointer)
๏ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋์์ ๋ํด ์๋ฉธ์๊ฐ ์๋์ผ
๋ก delete๋ฅผ ๋ถ๋ฌ์ฃผ๋๋ก ์ค๊ณ๋์ด ์๋ค.
๏ ํ ๊ฐ์ฒด๋ฅผ ๋์์ ๋์ด ๊ฐ๋ฆฌํฌ ์ ์๋ค. ๋ณต์ฌ์
์ฑํ๊ฑฐ๋ ๋์
ํ๋ฉด ํ auto_ptr์ null์ด ๋๋ค.
std::auto_ptr<Investment>(createInvestment
());
5. ์์ ๊ด๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ1
๏ ์์์ ํ๋ํ ํ์ ์์ ๊ด๋ฆฌ ๊ฐ์ฒด์ ๋๊ธด๋ค.
๏ ์์ ํ๋ ์ฆ ์ด๊ธฐํ(Resource Acquisition is Initialization:RAII)
๏ ์์ ํ๋๊ณผ ์์ ๊ด๋ฆฌ ๊ฐ์ฒด์ ์ด๊ธฐํ๊ฐ ํ ๋ฌธ์ฅ์์ ์ด๋ฃจ์ด ์ง๋ค.
6. ์์ ๊ด๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ2
๏ ์์ ๊ด๋ฆฌ ๊ฐ์ฒด๋ ์์ ์ ์๋ฉธ์๋ฅผ ์ฌ์ฉํด์ ์์์ด ํ์คํ ํด์ ๋๋๋ก ํ๋ค.
๏ ์๋ฉธ์๋ ์ด๋ค ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋ ์๋์ ์ผ๋ก ํธ์ถ๋๋ฏ๋ก ์คํ ์ ์ด๊ฐ ์ด๋ค ๊ฒฝ์๋ก ๋ธ๋ก์ ๋ ๋๋๊ฐ
์ ์๊ด์์ด ์์ ํด์ ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค.
7. 8. auto_ptr๊ฐ ๋ต์ธ๊ฐ?
๏ ๋ณต์ฌ ๋์์ด ์ด๋ฃจ์ด์ง๋ฉด ์ด์ ์ ๊ฒ์ null์ด ๋๋ค.
๏ auto_ptr๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ ๋๊ฐ ์ด์์ auto_ptr๊ฐ ๋ฌผ๊ณ ์์ผ๋ฉด ์ ๋๋ค.
๏ ์ด ๋ ๊ฐ์ง ํน์ฑ๋๋ฌธ์ ๋์ ์ผ๋ก ํ ๋น๋๋ ๋ชจ๋ ์์์ ๋ํ ๊ด๋ฆฌ ๊ฐ์ฒด๋ก์ auto_ptr๋ฅผ ์ฐ๋ ๊ฒ์
์ต์ ์ด ์๋ ๋ฏํ๋ค.
9. ์ฐธ์กฐ ์นด์ดํ
๋ฐฉ์ ์ค๋งํธ ํฌ์ธํฐ
๏ reference-counting smart pointer(RCSP)
๏ ํน์ ํ ์ด๋ค ์์์ ๊ฐ๋ฆฌํค๋ ์ธ๋ถ ๊ฐ์ฒด์ ๊ฐ
์๋ฅผ ์ ์งํ๊ณ ์๋ค๊ฐ ๊ทธ ๊ฐ์๊ฐ 0์ด ๋๋ฉด ํด
๋น ์์์ผ๋ก ์ญ์ ํ๋ ์ค๋งํธ ํฌ์ธํฐ
๏ garbage collection ๋ฐฉ์๊ณผ ์ ์ฌ
๏ std::tr1::shared_ptr<Investment>pInv(crea
teInvestment());
10. reference-counting smart pointer์ ํน์ฑ
std::tr1::shared_ptr<Investment>pInv1(createInvestment());
std::tr1::shared_ptr<Investment>pInv1(pInv2); // auto_ptr๊ณผ ๋ฌ๋ฆฌ pInv1, pInv2๊ฐ
// ๋์์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค.
pInv1 = pInv2; // ๋ณํ์์
11. auto_ptr, tr1::shared_ptr์ ๊ณตํต ํน์ฑ
๏ ์๋ฉธ์ ๋ด๋ถ์์ delete ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
๏ delete [] ์ฐ์ฐ์๊ฐ ์๋๋ค.
๏ ์ฆ, ๋์ ํ ๋นํ ๋ฐฐ์ด์ auto_ptr, tr1::shared_ptr์ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
std::auto_ptr<std::string>aps(new std::string[10]); // error
std::tr1::shared_ptr<int> spi(new int[1024]);; // error
12. RAII ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋ ๋ ์ด๋ป๊ฒ ํด์ผํ๋?
๏ ๋ณต์ฌ๋ฅผ ๊ธ์งํ๋ค.
class Lock : private Uncopyable {
public :
โฆ
};
13. RAII ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋ ๋ ์ด๋ป๊ฒ ํด์ผํ๋?
๏ ๊ด๋ฆฌํ๊ณ ์๋ ์์์ ๋ํด ์ฐธ์กฐ ์นด์ดํ
์ ์ํํ๋ค.
๏ ์์์ ์ฌ์ฉํ๊ณ ์๋ ๋ง์ง๋ง ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋๊น์ง ๊ทธ ์์์ ํด์ ํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ
๏ tr1::shared_ptr๋ฅผ ์ด์ฉ?
๏ tr1::shared_ptr๋ฅผ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋ ๋ ์์ ์ด ๊ฐ๋ฆฌํค๊ณ ์๋ ๋์์ ์ญ์ ํ๋๋ก ๋์ด์๊ธฐ ๋๋ฌธ
์ ์ ๋๋ค.
๏ tr1:shared_ptr๋ โ์ญ์ ์(delete)โ ์ง์ ์ ํ์ฉํ๋ค.
14. shared_ptr ์ญ์ ์ ํ์ฉ
class Lock {
public :
explicit Lock(Mutex *pm) // shared_ptr๋ฅผ ์ด๊ธฐํํ๋๋ฐ, ๊ฐ๋ฆฌํฌ ํฌ์ธํฐ๋ก
: mutexPtr(pm, unlock // Mutex ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ญ์ ์๋ก unlock ํจ์๋ฅผ ์ฌ์ฉ
{
lock(mutexPtr.get());
)
private :
std::tr1::shared_ptr<Mutex>mutexPtr;
}
15. RAII ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋ ๋ ์ด๋ป๊ฒ ํด์ผํ๋?
๏ ๊ด๋ฆฌํ๊ณ ์๋ ์์์ ์ง์ง๋ก ๋ณต์ฌํ๋ค.
๏ ๊น์ ๋ณต์ฌ(deep copy)
16. 17. ๋ช
์์ ๋ณํ(explicit conversion)
๏ tr1::shared_ptr ๋ฐ auto_ptr์ ๋ช
์์ ๋ณํ์ ์ํํ๋ get์ด๋ผ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
๏ get ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ํ์
์ผ๋ก ๋ง๋ ์ค๋งํธ ํฌ์ธํฐ ๊ฐ์ฒด์ ๋ค์ด์๋ ์ค์ ํฌ์ธํฐ๋ฅผ ์ป์ด๋ธ๋ค.
std::tr1::shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment *pi);
// int days = daysHeld(pInv); // error
int days = daysHeld(pInv.get());
18. ์์ ์ ๊ทผ๊ณผ ๋ช
์์ , ์์์ ๋ณํ
๏ ์์ ์ฑ๋ง ๋ฐ์ง๋ง ๋ช
์์ ๋ณํ์ด ๋์ฒด์ ์ผ๋ก ๋ซ๋ค.
๏ ํ์ง๋ง ์ฌ์ฉ์ ํธ์์ฑ์ ๋๊ณ ๋ณด๋ฉด ์์์ ๋ณํ์ด ๊ด์ฐฎ๋ค.
๏ โ๋ง๊ฒ ์ฐ๊ธฐ์๋ ์ฝ๊ฒ, ํ๋ฆฌ๊ฒ ์ฐ๊ธฐ์๋ ์ด๋ ต๊ฒโ
19. 20. 21. ๊ฐ์ฒด ๋ฐฐ์ด delete
st::string *stringPtr1 = new std::string;
st::string *stringPtr1 = new std::string[100];
โฆ
delete stringPtr1;
delete [] stringPtr2;
typedef std::string AddressLines[4];
std::string *pal = new AddressLines
// delete pal;
delete [] pal;
22. new๋ก ์์ฑํ ๊ฐ์ฒด๋ ์ค๋งํธ ํฌ์ธํฐ๋กโฆ
int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);
// processWidget(new Widget, priority()); error!
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
std::tr1::shared_ptr์ ์์ฑ์๋ explicit๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ โnew Widgetโํํ์์ ์ํด ๋ง๋ค์ด
์ง ํฌ์ธํฐ๊ฐ tr1::shared_ptr ํ์
์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ์์์ ์ธ ๋ณํ์ด ์๋ค.
23. ๋งค๊ฐ๋ณ์ ํธ์ถ ์์์ ๋ฐ๋ฅธ ์ํ์ฑ
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
์ฐ์ฐ์ด ์คํ๋๋ ์์
priority -> โnew Widgetโ -> tr1::shared_ptr?
๋ฐ๋์ ์์ ์์๋๋ก ๋์ง๋ ์๋๋ค.
priority๊ฐ ๋ช ๋ฒ์งธ๋ก ํธ์ถ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
๋ฌธ์ ๋ priority ํธ์ถ๋ถ๋ถ์์ error๊ฐ ๋ฐ์ํ๋ฉด โnew Widgetโ์ผ๋ก ๋ง๋ค์๋ ํฌ์ธํฐ๊ฐ ์ ์ค๋ ์ ์๋ค.
24. ํด๊ฒฐ์ฑ
std::tr1::shared_ptr<Widget> pw(new widget); // new๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ค๋งํธ ํฌ์ธํฐ์
processWidget(pw, priority()); // prority ํธ์ถ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ํฌ์ธํฐ ์ ์ค ์์
// memory leak ๋ฐฉ์ง
๊ทธ๋์ new๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ค๋งํธ ํฌ์ธํฐ๋ก ๋ฃ๋ ์ฝ๋๋ ๋ณ๋์ ํ ๋ฌธ์ฅ์ ๋ง๋ค์ด์ผ ํ๋ค.
25. 26. ์ ๋๋ก ์ฐ๊ธฐ ์ฝ๊ฒ, ์ํฐ๋ฆฌ๋ก ์ฐ๊ธฐ ์ด๋ ต๊ฒ
class Date {
public :
Date(int month, int day, int year);
โฆ
};
Date d(30, 3, 1995); // ์, ์ผ์ด ๋ฐ๋
Date d(3, 40, 1955); // ์ผ์ด ์ด์ํ ๊ฐ
struct Day {
explicit Day(int d) : val (d) {}
int val;
};
27. class Date {
public:
Date(const Month& m, const Day& d,
const Year& y);
โฆ
};
Date d(30, 3, 1955) // ์๋ฃํ์ด ํ๋ ธ๋ค.
Date d(Day(30), Month(3), Year(1995));
// ์๋ฃํ์ด ํ๋ ธ๋ค.
Date d(Month(3), Day(30), Year(1995));
28. 29. tr1::shared_ptr์ ํน์ฑ ์ด์ฉ1
๏ ์์ฑ ์์ ์ ์์ ํด์ ํจ์(โ์ญ์ ์โ)๋ฅผ ์ฎ์ ์ ์๋ค.
std::tr1::shared_ptr<Investment>pInv(0, getRidOfInvestment); // error
std::tr1::shared_ptr<Investment*>pInv(static_cast<Investment*>)(0), getRidOfInvestmentl
// 0์ int, tr1::share_ptr๊ฐ ์๊ตฌํ๋ ๊ฒ์ Investmet* ํ์
์ ์ค์ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ static_cast
30. tr1::shared_ptr์ ํน์ฑ ์ด์ฉ2
๏ ๊ต์ฐจ DLL ๋ฌธ์ ํด๊ฒฐ
๏ ๊ฐ์ฒด ์์ฑ ์์ ์ด๋ค ๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ new๋ฅผ ์ผ๋๋ฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ๋๋ ์ด์ ์ DLL๊ณผ
๋ค๋ฅธ DLL์ ์๋ delete๋ฅผ ์ฐ์ ๊ฒฝ์ฐ
๏ tr1::shared_ptr์ ๊ธฐ๋ณธ ์ญ์ ์๋ tr1::shared_ptr์ด ์์ฑ๋ DLL๊ณผ ๋์ผํ DLL์์ delete๋ฅผ ์ฌ์ฉํ
๋๋ก ๋ง๋ค์ด์ ธ ์๋ค.
31. ์ข์ ํด๋์ค ์ค๊ณ
๏ ์๋ก ์ ์ํ ํ์
์ ๊ฐ์ฒด ์์ฑ ๋ฐ ์๋ฉธ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ ธ์ผ ํ๋๊ฐ?
๏ ๊ฐ์ฒด ์ด๊ธฐํ๋ ๊ฐ์ฒด ๋์
๊ณผ ์ด๋ป๊ฒ ๋ฌ๋ผ์ผ ํ๋๊ฐ?
๏ ์๋ก์ด ํ์
์ผ๋ก ๋ง๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ํด ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์ ์ด๋ค ์๋ฏธ๋ฅผ ์ค ๊ฒ์ธ๊ฐ?
๏ ์๋ก์ด ํ์
์ด ๊ฐ์ง ์ ์๋ ์ ๋ฒํ ๊ฐ์ ๋ํ ์ ์ฝ์ ๋ฌด์์ผ๋ก ์ก์ ๊ฒ์ธ๊ฐ?
๏ ๊ธฐ์กด์ ํด๋์ค ์์ ๊ณํต๋ง์ ๋ง์ถ ๊ฒ์ธ๊ฐ?
๏ ์ด๋ค ์ข
๋ฅ์ ํ์
๋ณํ์ ํ์ฉํ ๊ฒ์ธ๊ฐ? (implicity, explicit)
๏ ์ด๋ค ์ฐ์ฐ์์ ํจ์๋ฅผ ๋์ด์ผ ์๋ฏธ๊ฐ ์์๊น?
32. ์ข์ ํด๋์ค ์ค๊ณ
๏ ํ์ค ํจ์๋ค ์ค ์ด๋ค ๊ฒ์ ํ์ฉํ์ง ๋ง ๊ฒ์ธ๊ฐ?
๏ ์๋ก์ด ํ์
์ ๋ฉค๋ฒ์ ๋ํ ์ ๊ทผ๊ถํ์ ์ด๋ ์ชฝ์ ์ค ๊ฒ์ธ๊ฐ?
๏ โ์ ์ธ๋์ง ์์ ์ธํฐํ์ด์คโ๋ก ๋ฌด์์ ๋ ๊ฒ์ธ๊ฐ?
๏ ์๋ก ๋ง๋๋ ํ์
์ด ์ผ๋ง๋ ์ผ๋ฐ์ ์ธ๊ฐ?
๏ ์ ๋ง๋ก ํ์ํ ํ์
์ธ๊ฐ?
33. pass_by_value?
class Person {
public :
Person();
virtual ~ Person();
โฆ
private :
std::string name;
std::string address;
};
class Student : public Person {
public :
Student();
~Student();
โฆ
private:
std::string schoolName;
std::string schoolAddress;
};
34. pass-by-value? ๋น์ฉ์ด ๋๋ฌด ํฌ๋ค.
bool validateStudent(Student s);
Student plato;
bool platoIsOK = validateStudent(plato);
๏ plato๋ก๋ถํฐ ๋งค๊ฐ๋ณ์ s ์ด๊ธฐํ์ํค๊ธฐ ์ํด
Sudent ๋ณต์ฌ ์์ฑ์ ํธ์ถ
๏ s๋ validateStudent๊ฐ ๋ณต๊ทํ ๋ ์๋ฉธ
๏ ๊ฒฐ๊ตญ, ๋ณต์ฌ ์์ฑ์ 1๋ฒ, ์๋ฉธ์ 1๋ฒ
๏ Student๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋๋ง๋ค string ๊ฐ์ฒด 2๊ฐ
์์ฑ
๏ Student๊ฐ์ฒด๋ Person๊ฐ์ฒด ํ์์ด๋ฏ๋ก
Person ์์ฑ, string ๊ฐ์ฒด 2๊ฐ ์์ฑ
๏ ์๋ฉธ๋ ์์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์งโฆ
35. reference-to-const
๏ ํธ์ถ์ ๋ฐ๋ฅด๋ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
bool validateStudent(const Student& s); // ์๋ก ๋ง๋ค์ด์ง๋ ๊ฐ์ฒด ๊ฐ์ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์
// ์์ฑ์์ ์๋ฉธ์๊ฐ ์ ํ ํธ์ถ๋์ง ์๋๋ค.
// const๋ก ์ ๋ฌ๋ student ๊ฐ์ฒด๋ฅผ ๋ณดํธ
36. ๋ณต์ฌ์์ค ๋ฌธ์ (slicing problem)
class Window {
public:
โฆ
std::string name() const;
virtual void display() const;
};
class WindowWithScrollBars : public Window {
public:
โฆ
virtual void display() const;
};
void printNameAndDisplay(Window s)
{
std::cout << w.name();
w.display();
}
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);
37. ๋ณต์ฌ์์ค ๋ฌธ์
๏ ๋งค๊ฐ๋ณ์ w ์์ฑ๋๋ค.
๏ ํ์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ Windows ๊ฐ์ฒด์ด๋ฏ๋ก, ์ด ๊ฐ์ฒด๋ฅผ ์์๋ฐ์ WindowWithScrollBars ๊ฐ์ฒด์ ๊ณ ์
์ ๋ณด๋ค์ ์์ค๋๋ค.
๏ ๊ฒฐ๊ตญ, ํธ์ถํ๋ display()ํจ์๋ Windows ๊ฐ์ฒด์ ๊ฒ์ด๋ค.
38. ๋ณต์ฌ์์ค ๋ฌธ์ ํด๊ฒฐ
void printNameAndDisplay(const Windows& w)
{
std::coutn << w.name();
w.display();
}
w๋ฅผ ์ฐธ์กฐ์๋ก ์ ๋ฌํ๋ฉด w๋ ์ด๋ค ์ข
๋ฅ์ ์๋์ฐ๊ฐ ๋๊ฒจ์ง๋๋ผ๊ณ ๊ทธ ์๋์ฐ์ ์ฑ์ง์ ๊ฐ๊ฒ ๋๋ค.
39. ํจ์์์ ๊ฐ์ฒด ๋ฐํํ ๋ ์ฐธ์กฐ์ ๋ฐํํ์ง๋ง์
class Rational {
public :
Rational(int numerator = 0, int denominator = 1);
โฆ
private :
int n, d;
friend
const Rational
operator*(const Rational& lhs, const Rational rhs);
};
40. 41. ์คํ์ ์ด์ฉํ ๊ฐ์ฒด ๋ฐํ
cosnt Rational& operation*(const Rational& lhs, const Rational& rhs)
{
Rational result(lhs.n * rhs.n, lhs.d * rhs.d); // ์์ฑ์๋ฅผ ํธ์ถ
retrun result; // result๋ ์ง์ญ๊ฐ์ฒด์ผ๋ก ํจ์๊ฐ ๋๋ ๋ ์๋ฉธ๋จ์๋ ๋ถ๊ตฌํ๊ณ ์ฐธ์กฐ์๋ฅผ ๋ฐํ
}
42. ํ์ ์ด์ฉํ ๊ฐ์ฒด ๋ฐํ
const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
Rational *result = new Rational(lhs.n * rhs.n, lhs.d * rhs.d); // ์์ฑ์ ํธ์ถ, delete ๋ถ๋ด
return *result;
}
43. static์ ์ด์ฉํ ๊ฐ์ฒด ๋ฐํ
const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
static Rational result; // ๋ฐํํ ์ฐธ์กฐ์๊ฐ ๊ฐ๋ฆฌํฌ ์ ์ ๊ฐ์ฒด
result = โฆ;
return result;
}
์ ์ ๊ฐ์ฒด๋ ๊ณต์ ํ๋ ๊ฐ์ด๋ฏ๋ก ํ์ฉ์ ์ ํ์ด ์์ ๋ฟ๋๋ฌ, ์ค๋ ๋ ์์ ์ฑ ๋ฌธ์ ๋ ์๋ค.
44. ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
inline const Rational operator*(const Rational& 1hs, const Rational& rhs)
{
return Rational(lhs.n * rhs.n, lhs,d * rsh.d);
}
์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ ๋์ด๋ค.
45. ๋ฐ์ดํฐ ๋ฉค๋ฒ๊ฐ ์ ์ธ๋ ๊ณณ์ private
๏ private์ผ๋ก ์ ์ธํ๋ฉด ๋ฐ์ดํฐ ๋ฉค๋ฒ์ ์ ๊ทผํ๊ธฐ ์ํด์ ๋ฉค๋ฒ ํจ์๋ฅผ ์จ์ผ ํ๋ค.
๏ ์ด๋ค ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ public์ด๊ณ , ์ด๋ค ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ private์ด๋ผ๋ฉด ์ผ๊ด์ฑ์ด ์ฌ๋ผ์ง๋ค.
๏ ํจ์๋ฅผ ํตํด์๋ง ๋ฐ์ดํฐ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋๋ก ๊ตฌํํด ๋๋ฉด, ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ฅผ ๋์ค์ ๊ณ์ฐ์์ผ๋ก
๋์ฒดํ ์ ์์ ๊ฒ์ด๋ค.(์บก์ํ, encapsulation)
๏ public ๋ฐ์ดํฐ ๋ฉค๋ฒ๊ฐ ์๊ณ , ์ด๊ฒ์ ์ ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์บก์ํ๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ์ ์ ์๋ค.
๏ protected๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ํ์ง ์๋ค.
๏ ๊ฒฐ๊ตญ์ ์บก์ํ๋ฅผ ๊ณ ๋ คํ์์ ๋, ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ private์ ์ ์ธํ๋ ๊ฒ์ด ๋ต์ด๋ค.
46. ๋ฉค๋ฒํจ์๋ณด๋ค๋ ๋น๋ฉค๋ฒ ๋นํ๋ ๋ ํจ์
class WebBrowser {
public:
โฆ
void clearCache();
void clearHistory();
void removeCookies();
}
class WebBrowser {
public:
โฆ
void clearEverything(); // clearCache,
// clearHistory,
// removeCookies
โฆ
};
47. 48. ๋น๋ฉค๋ฒ ๋ฒ์ ์ ์ฅ์
๏ ์บก์ํ
๏ ํผํค์ง ์ ์ฐ์ฑ(packaging flexibility)๊ฐ ๋์์ง๋ค.
๏ ์ปดํ์ผ ์์กด๋๋ ๋ฎ์ถ๋ค.
๏ ํ์ฅ์ฑ์ด ๋์์ง๋ค.
๏ ๊ฒฐ๊ตญ, ๋น๋ฉค๋ฒ ๋ฐฉ๋ฒ์ด ๋ฉค๋ฒ ํจ์๋ณด๋ค ์ฌ๋ฌ๋ชจ๋ก ๋ซ๋ค.
49. 50. namesapce๋ฅผ ํ์ฉํ ๋น๋ฉค๋ฒ ํจ์์ ์ฅ์
๏ namespace๋ class์ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ฐ์ ์์ค ํ์ผ์ ๋๋์ด ํฉ์ด์ง ์ ์๋ค.
๏ ๋ค์ ๋งํด, ํ์ํ ๋ ๊ธฐ๋ฅ์ ๋ถ๋ฌ๋ค ์ฐ๋ฉด ๋๋ค. WebBrowser๊ฐ์ฒด๊ฐ ์์ด๋ ์ธ ์ ์๋ค.
๏ ์์ฉ๋๊ฐ ๋์ ํธ์ ํจ์๋ค๊ณผ ์์ฉ๋๊ฐ ๋ฎ์ ํธ์ ํจ์๋ฅผ ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๋ฉด ์ปดํ์ผ ์์กด์ฑ์์ ๋น
๊ต์ ์์ ๋ก์ธ ์ ์๋ค.
๏ ํด๋์ค ๋ฉค๋ฒ ํจ์๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ธฐ๋ฅ์ ์ชผ๊ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๏ ํธ์ ํจ์ ์ ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ํค๋ ํ์ผ์(๊ทธ๋ฌ๋ ํ๋์ namespace) ๋๋์ด ๋์ผ๋ฉด ํธ์ ํจ์ ์ง
ํฉ์ ํ์ฅ๋ ์ฌ์์ง๋ค. ํด๋น ๋ค์์คํ์ด์ค์ ๋น๋ฉค๋ฒ ๋นํ๋ ๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋.
51. ํ์
๋ณํ์ด ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ์ ์ฉ๋๋ค๋ฉด ๋น๋ฉค๋ฒ ํจ์๋ก
// ์ ๋ฆฌ์๋ฅผ ๋ํ๋ด๋ ํด๋์ค
class Rational {
public:
Rational(int numerator = 0, int denominator = 1);
int numerator() const;
int denominator() const;
const Rational operator*(const Rational& rhs) const;
private:
โฆ
};
52. Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; // OK
result = result * oneEighth; // OK
result = oneHalf * 2; // OK
result = 2 * oneHalf; // error
result = oneHalf.operator*(2); // OK
result = 2.operator*(oneHalf); // error
์์์ ํ์
๋ณํ์ ๋ํด ๋งค๊ฐ๋ณ์๊ฐ ๋จนํ๋ค๋ ค๋ฉด
๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ์ ๋ค์ด์์ด์ผ ํ๋ค.
53. ์์์ ๋ณํ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ์ํด์
class Rational {
โฆ
};
const Rational operator*(const Rational& lhs, const Rational& rhs) // ๋น๋ฉค๋ฒ ํจ์๋ก ๋ง๋ค์๋ค.
{ // ๋ชจ๋ ์ธ์์ ๋ํด ์์์ ํ์
๋ณํ
return Raional(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
}
Rational oneFourth(1, 4);
Rational result;
result = oneFourth * 2;
result = 2 * oneFourth;
54. ์์ธ๋ฅผ ๋์ง์ง ์๋ swap
// ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ swap
namespce std {
template<typename T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
}
55. pimpl ๊ด์ฉ๊ตฌ
class Widget Impl {
public :
โฆ
private :
int a, b, c;
std::vector<double> V;
โฆ
};
class Widget {
public :
Widget (const Widget& rhs);
Widget& operator = (const Widget& rhs)
{
โฆ
*pImpl = *(rhs.pImpl);
โฆ
}
โฆ
private :
WidgetImpl *pImpl;
};
56. ํ์ค swap ์๊ณ ๋ฆฌ์ฆ์ ๋นํ
๏ ์์ Widget ๊ฐ์ฒด๋ฅผ ์ง์ ๋ง๋ฐ๊พผ๋ค๋ฉด? pImplํฌ์ธํฐ๋ง ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ค.
๏ Widget ๊ฐ์ฒด ์ธ ๊ฐ๋ฅผ ๋ณต์ฌํ๊ณ , WidgetImpl ๊ฐ์ฒด ์ธ ๊ฐ๋ ๋ณต์ฌํ๋ค.
๏ ๋นํจ์จ์ ์ด๋ค.
57. std::swap ํน์ํ
namespace std {
template<> // ์์ ํ
ํ๋ฆฟ ํน์ํ๋ฅผ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค ์ค๋ค.
void swap<Widget>(Widget& a, Widget& b)
{
swap(a.pImpl, b.pImpl);
}
}
58. class Widget {
public :
โฆ
void swap(Widget& other)
{
using std::swap;
swap(pImpl, other.pImpl);
}
โฆ
};
namespace std {
template<>
void swap<Widget>(Widget& a, Widget& b)
{
a.swap(b);
}
}
59. ํจ์๋ ๋ถ๋ถ ํน์ํ๊ฐ ๋์ง ์๋๋ค.
// Widget์ด ํด๋์ค๊ฐ ์๋ ํด๋์ค ํ
ํ๋ฆฟ
template<typename T>
class WidgetImpl {โฆ};
template<typename T>
class Widget {โฆ};
namespace std {
template<typename T>
void swap<Widget<T>>(Widget<T>& a,
Widget<T>& b)
{ a.swap(b); }
}
์ ์ฝ๋๋ ์ ๋ฒํ์ง ์๋ค.
C++์ ํด๋์ค ํ
ํ๋ฆฟ์ ๋ถ๋ถ ํน์ํ๋ ์ธ์
ํจ์ ํ
ํ๋ฆฟ์ ๋ํด์๋ ํ์ฉํ์ง ์๋๋ค.
60. ํจ์ ํ
ํ๋ฆฟ์ ๋ถ๋ถ์ ํน์ํ๋ ์ค๋ฒ๋ก๋
namespace std {
template<typename T>
void swap(Widget<T>& a,
Widget<T>& b)
{ a.swap(b) };
}
์์ ์ฝ๋๋ ์ ํจํ์ง ์๋ค.
๏ std ๋ด์ ํ
ํ๋ฆฟ์ ๋ํ ์์ ํน์ํ๋ OK
๏ std์ ์๋ก์ด ํ
ํ๋ฆฟ์ ์ถ๊ฐํ๋ ๊ฒ์ OK ์
๋
61. ํ
ํ๋ฆฟ ์ ์ฉ ๋ฒ์ ์ผ๋ก ๋ง๋ค์
namespace WidgetStuff {
โฆ
template<typename T>
class Widget {โฆ};
โฆ
template<typename T> // ๋น๋ฉค๋ฒ swap ํจ์
void swap(Widget<T> a, Widget<T> b) // ์ด๋ฒ์ std ๋ค์์คํ์ด์ค์ ์ผ๋ถ๊ฐ ์๋
{
a.swap(b);
}
}
์ธ์ ๊ธฐ๋ฐ ํ์(argument-dependent lookup) ํน์ ์พจ๋๊ทธ ํ์(Koenig lookup)
62. 63. T ํ์
์ ์ฉ๋ฒ์ ์ด ์ฐ์ ํธ์ถ, ์์ผ๋ฉด ์ผ๋ฐํ
template<typename T>
void doSomething(T& obj1, T& obj2)
{
using std::swap; // std::swap์ ์ด ํจ์ ์์ผ๋ก ๋์ด์จ๋ค.
โฆ
swap(obj1, obj2); // T ํ์
์ ์ฉ์ swap์ ํธ์ถํ๋ค.
}
64. ์ ๋ฆฌํ๋ฉด
๏ std::swap์ด ํน์ ํ์
์ ๋ํด ๋๋ฆฌ๊ฒ ๋์ํ ์ฌ์ง๊ฐ ์๋ค๋ฉด swap ๋ฉค๋ฒ ํจ์๋ฅผ ์ ๊ณตํ์.
๏ ๋ฉค๋ฒ swap์ ์ ๊ณตํ์ผ๋ฉด, ์ด๋ฉค๋ฒ๋ฅผ ํธ์ถํ๋ ๋น๋ฉค๋ swap๋ ์ ๊ณตํ์.
๏ ํด๋์ค์ ๋ํด์๋, std::swap๋ ํน์ํ ํ์.
๏ ์ฌ์ฉ์ ์
์ฅ์์ swap์ ํธ์ถํ ๋๋, std::swap์ ๋ํ using ์ ์ธ์ ๋ฃ์ด ์ค ํ ๋ค์์คํ์ด์ค ํ
์ ์์ด swap์ ํธ์ถํ์.
๏ ์ฌ์ฉ์ ์ ์ ํ์
์ ๋ํ std ํ
ํ๋ฆฟ์ ์์ ํน์ํํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง std์ ์ด๋ค ๊ฒ์ด๋ผ๋ ์๋ก
์ถ๊ฐํ ์๋ ์๋ค.