Search

CPP Module 00

Created
2021/10/07
tag
42์„œ์šธ
42Seoul
CPP Module
All of C++98
Class
Constructor
Destructor
Standard I/O Stream

Subjects

โ€ข

1. ex00 (Megaphone)

Type Casting

cctype ํ—ค๋”์— ์กด์žฌํ•˜๋Š” std::toupper๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋ ํ…๋ฐ, std::toupper์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด int์ด๋‹ค ๋ณด๋‹ˆ std::cout์„ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ์ˆซ์ž๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ํ˜• ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ๋ฐ, C ์–ธ์–ด ์Šคํƒ€์ผ์˜ (char)๋ณด๋‹ค๋Š” static_cast<char>๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

2. ex01 (PhoneBook)

Name Convention

CPP Module์—์„œ ์ฒ˜์Œ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์„œ๋ธŒ์ ํŠธ ์•ˆ๋‚ด ์‚ฌํ•ญ์— ํด๋ž˜์Šค ๊ตฌํ˜„์ฒด์— ๋Œ€ํ•œ .cpp์™€ .hpp์˜ ์ด๋ฆ„ ํ˜•์‹์ด PascalCase๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์ž. ์˜ˆ๋ฅผ ๋“ค๋ฉด, PhoneBook.cpp PhoneBook.hpp์™€ ๊ฐ™๋‹ค.

Whitespace

๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ์ •ํ™•ํžˆ EXIT, ADD, SEARCH์— ๋Œ€ํ•ด์„œ๋งŒ ์ˆ˜ํ–‰ํ• ์ง€, ์ผ๋ฐ˜์ ์ธ ๋ช…๋ น์–ด์™€ ๊ฐ™์ด ์•ž ๋’ค ์ „ํ›„๋กœ Whitespace๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค ๊ฒƒ์ธ์ง€๋Š” ๊ตฌํ˜„์— ๋‹ฌ๋ ค ์žˆ๋‹ค. ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด๋กœ๋Š” ํ›„์ž์— ๋Œ€ํ•ด์„œ ๊ตฌํ˜„์„ ํ•˜๋ฉด์„œ std::ws๋ฅผ ์จ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

failbit & badbit

std::getline ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ›์€ std::istream ๊ฐ์ฒด์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. ์ด ๋•Œ istream ๊ฐ์ฒด๊ฐ€ ์กฐ๊ฑด๋ฌธ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋ฉด, operator void*() const;๋ผ๋Š” ํƒ€์ž… ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. void * ํƒ€์ž…์€ NULL์ด๋ฉด false, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋กœ ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด bool ํƒ€์ž…์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, std::getline์„ ์กฐ๊ฑด๋ฌธ์— ๊ฑธ์–ด NULL์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์˜ค๋ฅ˜ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. std::getline์ด NULL์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 4๊ฐ€์ง€ Flag Bit (goodbit, failbit, badbit, eofbit) ์ค‘์—์„œ failbit, badbit์— ๊ฑธ๋ฆด ๋•Œ์ด๋‹ค.
failbit๋Š” ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ผœ์ง€๊ณ , badbit์€ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ผœ์ง„๋‹ค.
๊ทธ๋ฆฌ๊ณ  SEARCH ๋ช…๋ น์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด std::getline์ด ์•„๋‹Œ std::cin์„ ํ†ตํ•ด์„œ ์ž…๋ ฅ์„ ๋ฐ›๋„๋ก ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด์— ๋Œ€ํ•ด์„œ๋„ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ์˜ failbit๊ณผ badbit์„ ๊ฒ€์ถœํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค. std::cin์— ๋Œ€ํ•ด์„œ๋Š” std::cin.fail ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด failbit ํ˜น์€ badbit์ด ์ผœ์กŒ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
std::getline๊ณผ std::cin์„ ํ†ตํ•œ ์ž…๋ ฅ์—์„œ ์ œ์‹œ๋œ failbit๊ณผ badbit์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹จ์ˆœ ์ข…๋ฃŒ์™€ ์ŠคํŠธ๋ฆผ ๋ณต๊ตฌ 2๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค. ์ด ์ค‘์—์„œ ํ›„์ž์˜ ๊ฒฝ์šฐ์—๋Š” std::cin ๊ฐ์ฒด์˜ Flag Bit๋“ค์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก std::cin.clear ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , Flag Bit๊ฐ€ ๋ณต๊ตฌ๋˜์—ˆ๋‹ค๋ฉด ์ŠคํŠธ๋ฆผ์˜ ๋ฒ„ํผ๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ std::cin.ignore ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ชจ๋‘ ์ง€์›Œ์•ผ ํ•œ๋‹ค.
std::cin.ignore ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” std::streamsize์™€ int๋ฅผ ๋ฐ›๋Š”๋ฐ, ๋‘ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๋™์ž‘์€ std::streamsize๋งŒํผ์„ int๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์‚ญ์ œํ•œ๋‹ค๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ ์–ผ๋งŒํผ์˜ std::streamsize๋ฅผ ๊ธฐ์žฌํ•ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, <limits>์—์„œ std::numeric_limits ๊ฐ์ฒด์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. std::numeric_limits<std::streamsize>::max๋ผ๋Š” static ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด std::streamsize์˜ ์ตœ๋Œ“๊ฐ’์„ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด, std::streamsize๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  int๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์‚ญ์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. std::cin์—์„œ ๋ฒ„ํผ์— ๋‹ด๊ธด ๋ฌธ์ž๋“ค์˜ ๊ตฌ๋ถ„์€ Whitespace๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ๋Š” ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์œผ๋ฏ€๋กœ int๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž๋Š” ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

3. ex02 (The Job Of Your Dreams)

STL & Implicit Conversion

Module 00์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋Š” tests.cpp์˜ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์ฃผ์–ด์ง„ .log ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ํ˜•ํƒœ์˜ ์ถœ๋ ฅ์„ ๊ฐ–๋„๋ก ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ std::vector, std::pair ๋ผ๋Š” Container์™€ Container์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” iterator์™€ ๊ฐ™์€ Modern C++์˜ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ์•„์ฃผ ๊ฐ„๋žตํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.
iterator๋ผ๊ณ  ํ•จ์€ std::vector, std::pair์™€ ๊ฐ™์€ Container์˜ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฐ์ฒด์ด๋‹ค. ์˜๋ฏธ์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๋Š” ํฌ์ธํ„ฐ์˜ ๋™์ž‘๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด์— ๋ฐฐ์—ด์—์„œ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐ์ž‘์„ ํ–ˆ๋˜ ๊ฒƒ์„ ์ƒ๊ฐํ–ˆ์„ ๋•Œ Container์—์„œ๋Š” iterator๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  Container์—์„œ๋„ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ทธ๋ฆฌ ํŠน๋ณ„ํ•œ ์ด์œ  ์—†์ด๋Š” iterator๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. iterator์˜ ์‚ฌ์šฉ ๋ชฉ์ ์€ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๊ตฌ์กฐ๋“ค์„ ๊ตฌํ˜„ํ•œ Container๋“ค์˜ ์—ฐ์‚ฐ์„ ์ผ๋ฐ˜ํ™” ํ•˜๋Š”๋ฐ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด์˜ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด์„  ++์„ ์ด์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด์„  ++ ๋ณด๋‹ค๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ iterator๋ฅผ ์ด์šฉํ•˜๋ฉด iterator์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ++๋กœ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ ์—ฐ์‚ฐ์—๋งŒ ํ•œ์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, STL์˜ <algorithm> ์ „์—ญ์— ํ•ด๋‹น๋˜์–ด ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ผ๋ฐ˜ํ™”๋œ ์ฝ”๋“œ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
std::pair๋Š” <์™€ >๋กœ ๋ฌถ์ธ 2๊ฐœ์˜ template ์ธ์ž๋ฅผ ํƒ€์ž…์œผ๋กœ ํ•˜์—ฌ, first์™€ second๋ฅผ ๊ฐ–๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, std::pair<int, int>(3, 5)๋ผ๊ณ  ํ•˜๋ฉด first์™€ second ๋ชจ๋‘ int ํƒ€์ž…์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, first๋Š” 3 ๊ทธ๋ฆฌ๊ณ  second๋Š” 5๊ฐ€ ๋œ๋‹ค.
std::vector๋Š” ๋™์  ํ• ๋‹น์„ ์ด์šฉํ•œ ๋ฐฐ์—ด์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์  ํ• ๋‹น์„ ์ด์šฉํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ํ•œ ๋ฒˆ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์กŒ๋‹ค๊ณ  ํ•ด์„œ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. std::vector ๋‚ด์—๋Š” ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ๋„ ํŠน์ • ๋ฒ”์œ„๋ฅผ iterator๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ Range Constructor๋ผ๊ณ  ํ•œ๋‹ค. ํŠน์ • ๋ฒ”์œ„์˜ ์š”์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์™€์„œ vector์˜ ์š”์†Œ๋กœ ๋‘”๋‹ค. ์ด ์ •๋„ ์„ค๋ช…์ด๋ฉด ์ฃผ์–ด์ง„ tests.cpp๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ํฌ๊ฒŒ ์–ด๋ ค์›€์ด ์—†๋‹ค.
Account::t๋ผ๊ณ  ์“ฐ์ธ ๊ฒƒ์€ typedef๋ฅผ ์ด์šฉํ•œ Aliasing์— ๋ถˆ๊ณผํ•œ๋ฐ, ๊ทธ๋ƒฅ Account๋ผ๊ณ  ์ดํ•ดํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ดˆ๊ธฐ์— ์ฃผ์–ด์ง„ 2๊ฐœ์˜ typedef๋Š” ๊ฐ๊ฐ std::vector<Account>, std::vector<int>๋ฅผ ์˜๋ฏธํ•˜๊ณ , ๋งˆ์ง€๋ง‰ typedef๋Š” std::vector<Account>์˜ iterator์™€ std::vector<int>์˜ iterator๋ฅผ ์Œ์œผ๋กœ ๊ฐ–๋Š” std::pair์— ๋Œ€ํ•œ Aliasing์ด๋‹ค.
์ดํ›„์— ๊ฐ ๊ฐœํ–‰ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋œ 3๊ฐœ์˜ ๋ฌธ๋‹จ์€ ๊ฐ๊ฐ std::vector<Account>์˜ ์ดˆ๊ธฐํ™”, std::vector<int> ํƒ€์ž…์ธ Deposit์˜ ์ดˆ๊ธฐํ™”, std::vector<int> ํƒ€์ž…์ธ Withdrawal์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋œ๋‹ค. 3๊ฐœ์˜ Container ์ดˆ๊ธฐํ™”๋Š” ๋ชจ๋‘ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋˜ Range Constructor๋ฅผ ํ†ตํ•ด์„œ ์ด๋ค„์ง€๋Š”๋ฐ, ๋งˆ์ง€๋ง‰ 2๊ฐœ์˜ ์ดˆ๊ธฐํ™”๋ถ€ํ„ฐ ๋จผ์ € ์‚ดํŽด๋ณด์ž.
Deposit๊ณผ Withdrawal๊ฐ’์€ 8๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” d์™€ w๋ผ๋Š” ๋ฐฐ์—ด๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด ๋•Œ std::vector<int> ํƒ€์ž…์ธ deposits์™€ withdrawals์˜ ์ดˆ๊ธฐํ™”๋Š” (d, d + d_size) ์™€ (w, w + w_size)๋กœ ์ฃผ์–ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋“ค์€ ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด์˜ ๋ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๋‹ค. ํฌ์ธํ„ฐ๋Š” iterator๊ฐ€ ์•„๋‹˜์—๋„ Range Constructor์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Š” ํฌ์ธํ„ฐ๊ฐ€ iterator๋กœ ํ•ด์„๋˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ๋ฐฐ์—ด์— ์กด์žฌํ•˜๋Š” int ํƒ€์ž…์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์ด int ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” deposits๊ณผ withdrawals์— ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋œ๋‹ค.
๋‹น์—ฐํžˆ ํฌ์ธํ„ฐ๊ฐ€ iterator์™€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , iterator์˜ ๊ฐœ๋…์ด ํฌ์ธํ„ฐ์˜ Semantic์„ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  Container์˜ iterator๊ฐ€ ํฌ์ธํ„ฐ์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘๊ณ , ์ด์™€ ๊ด€๋ จํ•ด์„œ๋Š” iterator์˜ 5๊ฐœ Category์— ๋Œ€ํ•ด์„œ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
Account ํƒ€์ž…์˜ ์š”์†Œ๋“ค์„ ๊ฐ–๊ณ  ์žˆ๋Š” accounts์˜ ์ดˆ๊ธฐํ™”๋Š” ์œ„์—์„œ ์ œ์‹œ๋œ deposits์™€ withdrawal ์ฒ˜๋Ÿผ Range Constructor๋กœ ์ดˆ๊ธฐํ™” ๋˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€๋Š” ๋™์ผํ•˜๋‹ค. ์ด์ „ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์€ int โ†’ int ์—ฌ์„œ ํƒ€์ž…์ด ์„œ๋กœ ๋งž์ง€๋งŒ, accounts์˜ ๊ฒฝ์šฐ์—๋Š” int โ†’ Account์ธ๋ฐ tests.cpp์˜ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์€ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์ง€๊ทนํžˆ ์ •์ƒ์ ์ธ ๊ตฌ๋ฌธ์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” int ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ Account๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, Account.hpp์—์„œ int ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ Account ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ณ€ํ™˜๋„ Implicit Conversion์ด๋ผ๊ณ  ๋ณธ๋‹ค. ๋”ฐ๋ผ์„œ Range Constructor์— Account ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ๋„ฃ์ง€ ์•Š์•„๋„, Account๋กœ ์ƒ์„ฑ๋˜์–ด accounts์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋‹ค.

std::for_each

<functional>์— ์กด์žฌํ•˜๋Š” std::for_each ํ•จ์ˆ˜๋Š” ์‹œ์ž‘ ์ง€์ ๊ณผ ๋ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฐ›์•„์„œ iterator๋กœ ์ฐธ์กฐ๋˜๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•ด 3๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. std::for_each์˜ 3๋ฒˆ์งธ ์ธ์ž๋กœ ์ค„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์˜ Signature๋Š” void(T&)์ด๋‹ค. ์ด ๋•Œ tests.cpp์—์„œ๋Š” std::for_each์˜ ์ธ์ž๋ฅผ std::mem_fun_ref๋กœ ํŠน์ • ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ Wrappingํ•˜์—ฌ ์ œ๊ณตํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, std::mem_fun_ref ๊ฐ์ฒด๋Š” Deprecated ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์ž. ์ด๋Š” std::function๊ณผ std::bind๋ฅผ ํ†ตํ•ด์„œ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์ž.

delete

delete๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” Free Space (์ž์œ  ๊ณต๊ฐ„ - C++์—์„œ์˜ Heap์„ ์ง€์นญํ•˜๋Š” ๋ง)์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ์ต์ˆ™ํ•  ๊ฒƒ์ด๋‹ค. Modern C++์—์„œ๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ˜น์€ ์†Œ๋ฉธ์ž์— ๋Œ€ํ•ด์„œ delete๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด ๋•Œ delete์˜ ์—ญํ• ์€ ๋ช…์‹œ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํŠน์ • ์ƒ์„ฑ์ž ํ˜น์€ ์†Œ๋ฉธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ฆฌ๋Š”๋ฐ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, C++98 ์—์„œ๋Š” ์ƒ์„ฑ์ž ํ˜น์€ ์†Œ๋ฉธ์ž์— ๋Œ€ํ•ด์„œ delete ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์œผ๋ ค๋ฉด ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.
๋‹จ์ˆœํ•˜๊ฒŒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, C++98 ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž, ๋Œ€์ž… ์—ฐ์‚ฐ์ž, ๋ณต์‚ฌ ์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด์„œ ์ž๋™์œผ๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„  ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผํ•˜๋ฏ€๋กœ private ์˜์—ญ์œผ๋กœ ๋นผ์•ผ ํ•œ๋‹ค. ์ฆ‰, Account.cpp์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ˜ธ์ถœ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
Modern C++์— ์˜ค๋ฉด์„œ Move Semantic์ด ์ƒ๊น€๊ณผ ๋™์‹œ์— ์ด ๋•Œ๋ถ€ํ„ฐ๋Š” ์ด๋™ ์ƒ์„ฑ์ž๋„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ •์˜๋œ๋‹ค.

Destruction

์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์ž‘์„ฑ ํ›„ std::vector์˜ Account ์†Œ๋ฉธ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•˜๋ฉด ์‚ฌ๋ญ‡ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Account๋ฅผ 0~7๋ฒˆ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, ์ผ๋ถ€ ์‹œ์Šคํ…œ์—์„œ๋Š” 0~7๋ฒˆ ์ˆœ์„œ๋กœ ์†Œ๋ฉธํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ํŠนํžˆ Mac OS X์—์„œ๋Š” 0~7๋ฒˆ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ์ด์˜ ์—ญ์ˆœ์œผ๋กœ ์†Œ๋ฉธํ•˜๊ณ , Ubuntu์˜ ๊ฒฝ์šฐ์—๋Š” 0~7๋ฒˆ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ˆœ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉฐ ์†Œ๋ฉธ๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ์‹œ์Šคํ…œ๋งˆ๋‹ค ์†Œ๋ฉธ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋Š” std::vector์˜ ์†Œ๋ฉธ์ž ๊ตฌํ˜„์ด ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฅธ๋ฐ ์žˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์†Œ๋ฉธ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— .log ํŒŒ์ผ์—์„œ ๋ช…์‹œ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •ํ™•ํžˆ ๋งž์ถฐ์•ผ ํ•˜๋Š”๊ฐ€ ๋ผ๋Š” ์˜๋ฌธ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์†Œ๋ฉธ์ž๋ฅผ ๊ฐ•์ œ๋กœ ์กฐ์ž‘ํ•ด์„œ ๋‚ด๋ถ€์˜ ์†Œ๋ฉธ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์—๋Š” ์–ด๋–ค ์˜๋ฏธ๋„ ๋ถ€์—ฌ๋  ์ˆ˜ ์—†๊ณ , ์–ด๋–ค ๊ฒƒ๋„ ์–ป์„ ์ˆ˜ ์—†๋‹ค. ํ˜„์žฌ ํ—ˆ์šฉ์ด ๋œ ๊ฒƒ์€ Account์— ๋Œ€ํ•œ ๊ตฌํ˜„์ผ ๋ฟ์ด๊ณ , ์ด ๋ฌธ์ œ์˜ ์›์ธ์€ std::vector์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. std::vector์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ Account๋ผ๋Š” ๋‚ด๋ถ€ ์š”์†Œ ์ƒ์—์„œ ์กฐ์ž‘ํ•˜๋Š” ํ–‰์œ„๋Š” Undefined Behavior๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค. ๋”ฐ๋ผ์„œ ์ด์™€ ๊ฐ™์€ ๋ฌด์˜๋ฏธํ•œ ์ฝ”๋“œ ์กฐ์ž‘์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์ธ ์ถ”์ธก์ธ๋ฐ, CPP Module์ด ์ „์ฒด์ ์œผ๋กœ ๋ฆฌ๋‰ด์–ผ ๋˜๋ฉด์„œ ์„œ๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค. ๋ฆฌ๋‰ด์–ผ ์ „์˜ ์„œ๋ธŒ์ ํŠธ์˜ ex02์—๋Š” Old Ubuntu Server๋ผ๊ณ  ๋ช…์‹œ๊ฐ€ ๋˜์–ด ์žˆ์—ˆ๊ณ , Ubuntu๋Š” ์œ„์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์ธ ์†Œ๋ฉธ์„ ์ง€์›ํ•œ๋‹ค. ๋‹ค๋งŒ ๋ฆฌ๋‰ด์–ผ ํ›„์—๋Š” ์ด ๊ตฌ๋ฌธ์ด ์ง€์›Œ์กŒ๋Š”๋ฐ, ์ด ๋•Œ .log ํŒŒ์ผ์€ ๋ฆฌ๋‰ด์–ผ ์ด์ „์˜ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

Chrono

<chrono>๋Š” C++11๋ถ€ํ„ฐ ์ง€์›์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ <ctime>์˜ time_t ๊ทธ๋ฆฌ๊ณ  struct tm์„ ์ด์šฉํ•˜์—ฌ timestamp๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ ์— ์ฃผ์˜ํ•œ๋‹ค.

4. Code of Jseo