Search

CPP Module 01

Created
2021/10/07
tag
42์„œ์šธ
42Seoul
CPP Module
Class
Member Function
Standard I/O Stream

Subjects

โ€ข

1. ex00 (BraiiiiiiinnnzzzZ)

Static Member Function

์ž์œ  ๊ณต๊ฐ„์œผ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น ๋ฐ›๋Š” newZombie์™€ ์˜คํ† ๋งคํ‹ฑ์œผ๋กœ ๋‘๋ฉด์„œ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ œ๊ฑฐ๋  ๋•Œ ํ•จ๊ป˜ ํ•ด์ œ๋˜๋Š” randomChump์˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ ํ•จ์ˆ˜๋Š” ์ •ํ•ด์ง„ .cpp ํŒŒ์ผ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๋‘ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ static ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ Zombie ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ๋„ฃ์—ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Zombie ํด๋ž˜์Šค์™€ ๊ฐ ํ•จ์ˆ˜ ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๊ณ , Zombie ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ newZombie์™€ randomChump๋ฅผ Zombie ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

Random Name

std::string Zombie::randomName(void) { static std::string characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; std::string temp(10, '\0'); std::string::iterator iter = temp.begin(); std::string::iterator end = temp.end(); while (iter != end) *iter++ = characters.at(static_cast<int>(Random::randr(0.0, 61.0))); return (temp); }
C++
์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์ œ์•ฝ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Random.cpp์™€ Random.hpp๋ฅผ ์ž‘์„ฑํ•˜์—ฌ Zombie๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๋ฌด์ž‘์œ„ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. a-z, A-Z, 0-9์˜ ๋ฌธ์ž๋“ค์„ ๋ฌด์ž‘์œ„๋กœ 10๊ฐœ๋ฅผ ์„ ์ •ํ•˜์—ฌ ์ด๋ฆ„์„ ๋งŒ๋“ค์—ˆ๊ณ , Random ์ž์ฒด๋Š” ์„ ํ˜• ํ•ฉ๋™ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ๋‹ค. <random>์€ C++๋ถ€ํ„ฐ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์˜€๋‹ค. ์ด์— ๋Œ€ํ•ด์„  ์•„๋ž˜ ๋งํฌ์˜ Random Function Implementation ํ•ญ๋ชฉ์— ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๋‘์—ˆ๋‹ค.

2. ex01 (Moar brainz!)

Initialization

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

3. ex02 (HI THIS IS BRAIN)

์›์‹œ ํฌ์ธํ„ฐ ์ž์ฒด๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ฐธ์กฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค. ์ฐธ์กฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด (์Šคํƒ ํ”„๋ ˆ์ž„์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ•œ) ์ปดํŒŒ์ผ๋Ÿฌ์˜ Aliasing Rule์— ๊ธฐ๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์†Œ๋ชจํ•˜์ง€๋„ ์•Š๊ณ , ์ฝ๋Š”๋ฐ ๋ถˆํ•„์š”ํ•œ ๊ธฐํ˜ธ๋“ค์ด ์—†์–ด ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์ถฉ๋ถ„ํ•˜๋‹ค.
๋‹ค๋งŒ ์ฐธ์กฐ์ž์˜ ๋™์ž‘์ด ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•œ ์ฐธ์กฐ๋กœ ์ด๋ค„์ง„๋‹ค๊ณ  ํ•ด์„œ, ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ์ž๊ฐ€ ๋™์ผํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, ์ฐธ์กฐ์ž๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์ •ํ™•ํ•œ ๊ฐœ๋…์ด ๋’ท๋ฐ›์นจ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฐธ์กฐ์ž๋Š” ์•„๋ž˜ ๋งํฌ์— ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค.

4. ex03 (Unnecessary violence)

Pointer ? Reference ?

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

5. ex04 (Sed is for losers)

Constructor of std::ifstream & std::ofstream

std::ifstream๊ณผ std::ofstream ์€ ์ƒ์„ฑ์ž ์ธ์ž๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ด ๋•๋ถ„์— ๋ฉค๋ฒ„ ํ•จ์ˆ˜ open์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ์ด ์ž˜ ์—ด๋ ธ๋Š”์ง€ ํ™•์ธ์„ ์œ„ํ•ด good ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๊ณ , ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•œ ์ž‘์—…์ด ๋๋‚ฌ๋‹ค๋ฉด close ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
std::ifstream๊ณผ std::ofstream์œผ๋กœ ํŒŒ์ผ์„ ์—ด ๋•Œ๋Š” ios_base::openmode ํƒ€์ž…์˜ Flag ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, std::ifstream์€ std::ifstream::in ๊ทธ๋ฆฌ๊ณ  std::ofstream์€ std::ofstream::out์ด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. ๋งŒ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ์ฝ์–ด์•ผ ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋‚ ๋ฆฌ๊ณ  ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ด์–ด์„œ ์ž‘์„ฑ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ณ„๋„์˜ Flag๋“ค์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

rdbuf & std::stringstream

std::ifstream์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ŠคํŠธ๋ฆผ ์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ Whitespace ๋‹จ์œ„๋กœ ๋Š์€ ๋’ค์— ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ์ฝ์–ด์˜ฌ ์ˆ˜๋„ ์žˆ๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ๋ฌธ์ž ํƒ€์ž…์œผ๋กœ ์ฝ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ istream_iterator<T>๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ณ , ํ›„์ž์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ istreambuf_iterator<T>๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
๋งŒ์ผ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ˆ˜, ์‹ค์ˆ˜, ํ˜น์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ ์ด๋ฅผ ์ ์ ˆํžˆ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋–„๋Š” ํ…์ŠคํŠธ ๋ชจ๋“œ์˜ istream_iterator<T>์™€ >> ๋ผ๋Š” ์ถ”์ถœ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ์ •๋ง ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™˜์— ์ทจ์•ฝํ•˜๋‹ค. ์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ ๋˜์ฐพ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ตฌ๋ถ„์ง€์œผ๋ ค๋ฉด ์ง์ ‘ Whitespace๋ฅผ ๋ฐ์ดํ„ฐ์— ๋ถ™์—ฌ์•ผ ํ•˜๋ฉฐ, Whitespace ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„์ง“๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ Whitespace๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์ด๋ฅผ ์›๋ž˜ ๋ชจ์Šต์œผ๋กœ ๋ถ™์—ฌ๋‚ด๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ธŒ์ ํŠธ์—์„œ ์›ํ•˜๋Š” replace ์ž‘์—…์€ ์ •๋ง ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Whitespace์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ istream_iterator<T>๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๊ทธ๋ฆฌ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค.
๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” istreambuf_iterator<T>๋Š” ์ŠคํŠธ๋ฆผ์˜ ํŒŒ์ผ ๋ฒ„ํผ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ํ…์ŠคํŠธ ๋ชจ๋“œ์™€ ๋‹ฌ๋ฆฌ ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋ณ€ํ™˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— istream_iterator<T>๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜ Endian๋งŒ ๋™์ผํ•˜๋‹ค๋ฉด ๋ฒ„ํผ์—์„œ ์ฝ์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™˜์— ๋Œ€ํ•ด์„œ๋„ ๊ฑฑ์ •์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋‹ค๋งŒistream_iterator<T>์—์„œ๋Š” ์–ด๋Š ํƒ€์ž…์œผ๋กœ๋“  ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค๋ฉด, istreambuf_iterator<T>๋Š” ๋ฌธ์ž ํƒ€์ž…์œผ๋กœ๋งŒ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋‹ˆ istreambuf_iterator<T>๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•ด ๋ณด์ธ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ std::ifstream์„ ์ฝ์–ด์˜ค๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋‘ iterator๋Š” ํŒŒ์ผ ํƒ์ƒ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ํŒŒ์ผ์€ ๋””์Šคํฌ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฒ„ํผ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๊ฝค๋‚˜ ํฐ ๋‹จ์ ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฒ„ํผ๋กœ ์˜ฎ๊ฒจ์„œ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ ์ ˆํ•˜๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด std::stringstream์ด๋‹ค. std::ifstream์˜ ๋ฐ์ดํ„ฐ๋ฅผ std::stringstream์œผ๋กœ ๊ฐ–๊ณ  ์˜ฌ ๋•Œ๋Š” ์ œ์‹œ๋œ 2๊ฐ€์ง€ iterator๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ŠคํŠธ๋ฆผ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ด๋™์€ rdbuf๋ผ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. rdbuf๋Š” basic_filebuf๋ผ๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด๋ฅผ << ๋ผ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฌผ๋ก  ์ด๋ฒˆ ์„œ๋ธŒ์ ํŠธ์—์„œ๋Š” 1ํšŒ์„ฑ์œผ๋กœ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋ฉด ๋˜๋ฏ€๋กœ ์ง€๊ธˆ ์†Œ๊ฐœ๋œ ๋ฒ„ํผ๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  istreambuf_iterator<T>๋ฅผ ์ด์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
std::ifstream์˜ rdbuf ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ basic_filbuf ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ << ๋กœ std::stringstream์— ์‚ฝ์ž…ํ–ˆ๋‹ค๋ฉด, std::ifstream์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ๋กœ ์ด๋™๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ std::stringstream์˜ str ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด std::string์œผ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด๋ฅผ std::string ๊ฐ์ฒด์— ์ €์žฅํ•˜์—ฌ replace๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

replace

์œ„ ๊ณผ์ •์—์„œ ํŒŒ์ผ ๋‚ด์šฉ์„ std::stringstream์— ๋‹ด์€ ํ›„, std::stringstream ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ str ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด std::string์œผ๋กœ ๋ถˆ๋Ÿฌ์™”๋‹ค๋ฉด replace ์ž์ฒด๋Š” std::string์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๋ฏ€๋กœ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฟ ์žˆ๊ฒ ์ง€๋งŒ std::string์˜ find์™€ substr์ด๋ผ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ 2๊ฐœ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งˆ์น  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ std::string์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์€ ๋Œ€์ฒด์ ์œผ๋กœ iterator ํ˜•์‹์ด ์•„๋‹Œ index ๊ฐ’๊ณผ ๊ด€๋ จ์žˆ๋‹ค.
์ดˆ๊ธฐ ๊ฐ’ 0์„ ๊ฐ–๊ณ  ์žˆ๋Š” index๋ฅผ find ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ์ง€์†์ ์œผ๋กœ ์ด์šฉํ•œ๋‹ค. find ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด s1์ด ์œ„์น˜ํ•œ index๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ index์— ํ• ๋‹นํ•˜์—ฌ ๊ทธ ๊ฐ’์ด std::string::npos์™€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์ผ ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด s1์„ ์ฐพ์€ ๊ฒƒ์ด๋ฏ€๋กœ, index๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ ๋‚ด์šฉ์—์„œ s1 ์ด์ „ ๋ถ€๋ถ„๊ณผ s1 ์ดํ›„ ๋ถ€๋ถ„์„ substr ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด s2 ์–‘ ์˜†์— ๋ถ™์ธ๋‹ค. ์ดํ›„ ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์—์„œ๋Š” ์ฐพ์•„ ๋†“์€ index๊ฐ€ find ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ์ง€์†ํ•ด์„œ ๊ฐœ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ง€์ ๋ถ€ํ„ฐ ์ด์–ด์„œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด, ๋ฐ˜๋ณต ํšŒ์ฐจ๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
substr ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ O(n)O(n)์œผ๋กœ ์ƒ๊ฐ๋ณด๋‹ค ๋น„์‹ผ ๊ฒƒ์ด ์•„์‰ฌ์šด ์ ์ด๋‹ค. ๋‹ค๋งŒ Modern C++์—์„œ๋Š” std::string_view๋ผ๋Š” ์ฐธ์กฐํ˜• ์ฝ๊ธฐ ์ „์šฉ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค. std::string๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ๋ฐ, ์ฐธ์กฐํ˜• ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ substr ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ์‹ธ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์˜ substr์€ ๋ฌธ์ž์—ด์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์ฐธ์กฐํ˜• ์ฝ๊ธฐ ์ „์šฉ ํด๋ž˜์Šค์ธ std::string_view๋ฅผ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— O(1)O(1)๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์–ป์€ std::string_view๋Š” data ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด std::string์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

File Out

ํŒŒ์ผ์„ ์ฝ์–ด์˜ฌ ๋•Œ std::ifstream์„ ์ด์šฉํ–ˆ๋‹ค๋ฉด, ํŒŒ์ผ์„ ์“ธ ๋•Œ๋Š” std::ofstream์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ์–ด์ฐจํ”ผ ์ƒˆ๋กœ์šด ํŒŒ์ผ์— ์ €์žฅ์„ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ, std::ofstream::trunc๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด ๋œ๋‹ค. std::ifstream์„ ์ด์šฉํ–ˆ์„ ๋•Œ์ฒ˜๋Ÿผ ํŒŒ์ผ์ด ์ž˜ ์—ด๋ ธ๋Š”์ง€ good ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์ž˜ ํ™•์ธํ•œ ํ›„์— << ๋ผ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

6. ex05 (Karen 2.0)

Array of Member Function Pointer

Logging Level์—๋Š” 4๊ฐ€์ง€๊ฐ€ ๊ณ ์ •์ ์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ, ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ if / else if / else ์˜ ๋ฐฐ์น˜๋ณด๋‹ค๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์š”๊ตฌ๋œ๋‹ค. ์ด๋Š” ์•„์˜ˆ if ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ Logging Level์˜ ๋น„๊ต ์‹œ if ๋ฌธ์„ ๋งˆ๊ตฌ์žก์ด๋กœ ๋‚˜์—ดํ•˜์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์—๋Š” 4๊ฐœ์˜ Logging Level์—์„œ if / else if / else if / else๊ฐ€ ์š”๊ตฌ๋˜์—ˆ๋‹ค๋ฉด, ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด๊ณผ std::string์„ ๋‹ด๋Š” ๋ฐฐ์—ด์„ ํ™œ์šฉ ํ•˜๋ฉด loop / if ๋งŒ์œผ๋กœ Logging Level์— ๋งž๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

7. ex06 (Karen-filter)

Finding Level

์ด์ „ ๋ฌธ์ œ์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚  ํ•„์š” ์—†์ด ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด๊ณผ std::string์„ ๋‹ด์€ ๋ฐฐ์—ด์— Filtering์„ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ์š”์†Œ๋ฅผ ๊ฐ๊ฐ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ์ง€์ •๋œ Level ์ด์ƒ์˜ Logging๋“ค์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํ˜„์žฌ Level์„ ์ฐพ์€ ๋’ค์— Filtering๋งŒ ์•„๋‹ˆ๋ผ๋ฉด loop๋ฅผ ํ†ตํ•ด ์ฐพ์€ Level ์ด์ƒ์˜ Logging๋“ค์„ ๊ฐ„๋‹จํžˆ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

8. Code of Jseo