Search

CPP Module 07

Created
2021/10/14
tag
42์„œ์šธ
42Seoul
CPP Module
All of C++98
Template
Data Structure
Dynamic Container

Subjects

โ€ข
โ€ข
โ€ข

1. ex00 (A few functions)

Function Template ? Template Function ? Terms !

C++์˜ ๊ฝƒ์€ ํด๋ž˜์Šค์™€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋“ค ์ˆ˜์žˆ๋Š”๋ฐ, Module 07์€ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๊ฒŒ ๋œ๋‹ค. ํŠนํžˆ ex00์€ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•˜๊ณ , ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋‘ ์šฉ์–ด์˜ ์ฐจ์ด๋Š” ์ž ์‹œ ํ›„์— ์•Œ์•„๋ณด๊ณ , ์šฐ์„  ํ…œํ”Œ๋ฆฟ์ด๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ต์ˆ™ํ•ด์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
์‚ฌ์‹ค Module 07๊นŒ์ง€ ์™”๋‹ค๋ฉด, ์ด๋ฏธ ํ…œํ”Œ๋ฆฟ์„ ๊ฒฝํ—˜ํ•ด๋ณธ ๋ฐ”๊ฐ€ ์žˆ๋‹ค. static_cast<T>, reinterpret_cast<T>, dynamic_cast<T>, const_cast<T>๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ ๋œ๋‹ค. ์ œ์‹œ๋œ ํ˜• ๋ณ€ํ™˜๋“ค์„ ์ด์šฉํ•  ๋•Œ ์ž„์˜์˜ ํƒ€์ž…์„ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ์“ธ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ž„์˜์˜ ํƒ€์ž… T๋ฅผ ๋‘๊ณ  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์ด๊ฒƒ์ด ๊ณง ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์ด ๋œ๋‹ค. ์ฆ‰, ํ…œํ”Œ๋ฆฟ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (์ฝ”๋“œ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์— ์ด์šฉ๋œ๋‹ค.
ํ…œํ”Œ๋ฆฟ์€ template์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๋•Œ <์™€ >๋กœ ๊ฐ์‹ธ์ง„ ์ž„์˜์˜ ํƒ€์ž… T๋ฅผ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ ํ•œ๋‹ค. ํ…œํ”Œ๋ฆฟ์€ ์ž„์˜์˜ ํ•จ์ˆ˜ ํ˜น์€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ชจ๋‘ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, template ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์ด๋ผ ํ•˜๊ณ , ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„  ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ฃผ์–ด์ง„ ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•˜์—ฌ ํƒ€์ž…์„ ํŠน์ •ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ด ๋•Œ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜, ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„  ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋˜ํ•œ <์™€ > ์‚ฌ์ด์— ํŠน์ •๋œ ํƒ€์ž…์„ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๋ฌผ๋ก  ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ vs ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜, ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ vs ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค, ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜ vs ํ…œํ”Œ๋ฆฟ ์ธ์ž๋“ค์„ ๊ตฌ๋ถ„ ์ง“๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์„ ๋•Œ๋„ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘˜ ์ค‘ ์–ด๋Š ์šฉ์–ด๋ฅผ ์ด์šฉํ•˜๋”๋ผ๋„ ๋‘ ๊ฐœ๋…์„ ๋ชจ๋‘ ํฌ๊ด„ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์ด์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜์™€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜, ์ฝ”๋“œ๋กœ ์ •์˜๋œ ํด๋ž˜์Šค์™€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค, ์ฝ”๋“œ๋กœ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…๊ณผ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด์šฉํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ๊ตฌ๋ถ„์„ ์ง“๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด์™€ ๊ฐ™์€ ๊ตฌ๋ถ„์„ ๋ช…ํ™•ํžˆ ์ง€์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Example

template <typename T> class Something { // ... implementation };
C++
ํ…œํ”Œ๋ฆฟ์˜ ์ฃผ๋œ ํŠน์ง•์€ ์ปดํŒŒ์ผ ํƒ€์ž„๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋งŒ์ผ ์ด ์ฝ”๋“œ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด์šฉ๋˜์ง€ ์•Š์œผ๋ฉด, ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—๋Š” ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์ผ ์ด ์ฝ”๋“œ๊ฐ€ int ํƒ€์ž…์˜ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋กœ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, int ํƒ€์ž…์— ๋Œ€ํ•œ ์ฝ”๋“œ๋งŒ ์ƒ์„ฑ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  double ํƒ€์ž…์˜ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋กœ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, double ํƒ€์ž…์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์€ ๋ชจ๋‘ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋ค„์ง€๋Š”๋ฐ, int ํƒ€์ž… ๋”ฐ๋กœ, double ํƒ€์ž… ๋”ฐ๋กœ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ ์„ ํ†ตํ•ด Something<int>์™€ Something<double>์€ ํด๋ž˜์Šค๋งŒ ๊ฐ™๊ณ  ์ „ํ˜€ ๋‹ค๋ฅธ ํƒ€์ž…์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
typename์€ T๊ฐ€ ํƒ€์ž… ์ž„์„ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค. ๋ช…์‹œ๋ผ๋Š” ๋‹จ์–ด ๋•Œ๋ฌธ์— typename์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋ƒ๋Š” ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” ์ž„์˜์˜ ํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠน์ • ๊ฐ’๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๋ฐ›์€ ํŠน์ • ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์ด์–ด์•ผ ํ•˜๊ณ , ์ด๋“ค์€ ํ…œํ”Œ๋ฆฟ์˜ ํƒ€์ž… ๊ฒฐ์ •์ด ์ด๋ค„์ง€๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—ฐ์‚ฐ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—ฐ์‚ฐ์„ ๋๋‚ด๋Š” ํ˜•ํƒœ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๋Ÿฐ ํƒ€์ž„์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์™€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ๋ฐฉ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ธ๋ฐ, ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์ดํ•ด๊ฐ€ ์•ˆ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ํ˜น์€ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์— ํŠน์ • ๊ฐ’์„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •์ง“๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ static const๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ’์„ ๊ฒฐ์ • ์ง“๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„  ๊ทธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ตฌ๋ฌธ์„ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ํ˜น์€ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์— ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, static const๋กœ ์ •์˜ํ•  ๋•Œ๋งŒ ์ด์™€ ๊ฐ™์€ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค ํ˜น์€ ํ•จ์ˆ˜๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ๋กœ ์ƒ์„ฑ๋˜์–ด ์ด์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด, static์˜ ํด๋ž˜์Šค ํ˜น์€ ํ•จ์ˆ˜ ๋‚ด ๊ณต์œ ๋œ๋‹ค๋Š” ํŠน์ง•๊ณผ const์˜ ๋ถˆ๋ณ€ ํŠน์„ฑ์ด ์˜๋ฏธ ์ƒ์œผ๋กœ๋„ ๋งค์šฐ ์ ์ ˆํ•˜๋‹ค.
template <typename T> void swap(T& a, T& b) { T temp; temp = a; a = b; b = temp; }
C++
ํ…œํ”Œ๋ฆฟ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ swap ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ์˜ˆ์‹œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋’€๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€๊ฐ€? ๋ฌผ๋ก  ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ๋” ์–ด๋ ค์šด ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ์•ž์œผ๋กœ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ ์ „์— ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ž˜ ์Œ“์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŽ์€ ์—ฐ์Šต์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. min๊ณผ max ํ•จ์ˆ˜๋„ ์ž˜ ๋งˆ๋ฌด๋ฆฌํ•˜์ž.
์˜ˆ์‹œ์—์„œ ์ œ์‹œ๋œ typename๊ณผ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” class ํ‚ค์›Œ๋“œ๋Š” ์šฉ๋„๊ฐ€ ๊ฐ™๋‹ค. ๋‹ค๋งŒ class ํ‚ค์›Œ๋“œ๊ฐ€ ๋จผ์ € ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, ์ผ๋ฐ˜ class๋ฅผ ์ •์˜ํ•  ๋•Œ์˜ ํ‚ค์›Œ๋“œ์™€ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— typename์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๋งŒ์ผ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ class๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค๋ฉด typename์œผ๋กœ ์ดํ•ดํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด ๋œ๋‹ค.

2. ex01 (Iter)

Function as a Parameter of Function Template

ex01๋„ ex00๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์€, ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์กฐ๊ธˆ ํŠน์ดํ•œ ์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ์ ์ด๋‹ค. ์•„๋งˆ Libft์—์„œ ft_lstiter๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ์ด๋ฒˆ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ๋‚ด์šฉ์ด ์‰ฝ๊ฒŒ ์ดํ•ด๋  ๊ฒƒ์ธ๋ฐ, ์ด๋ฒˆ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ for_each๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ft_listiter ๋•Œ๋Š” ๊ตฌํ˜„ํ•ด๋’€๋˜ t_list์— ๋Œ€ํ•ด ํ•œ์ •๋˜์—ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ์ž„์˜์˜ ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ ๊ฐ ์š”์†Œ์— ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ๋‚ด์šฉ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ž„์˜์˜ ํƒ€์ž…์œผ๋กœ ๋œ ๋ฐฐ์—ด๋กœ ๋“ค์–ด์˜ค๋ฏ€๋กœ typename์ธ T์— ๋Œ€ํ•œ ๋ฐฐ์—ด์„ T*๋กœ ๋ฐ›์•„์˜ค๋„๋ก ๋งŒ๋“ ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ํฌ๊ธฐ์— ๋Œ€ํ•œ ํƒ€์ž…์ด๋ฏ€๋กœ int, unsigned int ๋“ฑ์„ ์ง์ ‘ ๋ช…์‹œํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” std::size_t๋ฅผ ์ด์šฉํ–ˆ๊ณ , ์ด์ฒ˜๋Ÿผ ๊ณ ์ •๋œ ํƒ€์ž…์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” typename์„ ์ด์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ ์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์ด๋‹ค. ์ด ๋•Œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์—†์–ด์•ผํ•˜๊ณ , ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์›๋ณธ ๋‚ด์šฉ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋ฏ€๋กœ ์ฐธ์กฐ์ž ํ˜น์€ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋„๋ก ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์›๋ณธ ๊ฐ’์˜ ํƒ€์ž…์„ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ์™€ ๊ฐ™์€ ํƒ€์ž…์ด ๋˜๋ฏ€๋กœ T๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Calling Arugment on Template Function

๋‚ด ๊ฒฝ์šฐ์—๋Š” iter ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์‹œ ์ด์šฉํ•  ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋“ค์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” print๋ผ๋Š” ํ•จ์ˆ˜๋กœ ๋‘์—ˆ๋‹ค. ๋ฌผ๋ก  ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ํ•จ์ˆ˜๋กœ ์ด์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋”ฐ๋ผ ๋‚ด์šฉ๋„, ์ด๋ฆ„๋„, ์ •์˜๋„ ๋‹ค๋ฅผ ๊ฒƒ์ธ๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„  ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์ด์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ iter ํ•จ์ˆ˜์— ์ด์šฉํ•  ๋•Œ <์™€ >๋กœ ํƒ€์ž…์„ ๋”ฐ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค.
int i[5] = { 1, 2, 3, 4, 5 }; iter<int>(i, sizeof(i) / sizeof (*i), print<int>); iter(i, sizeof(i) / sizeof(*i), print<int>); iter(i, sizeof(i) / sizeof(*i), print);
C++
ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•  ๋•Œ <์™€ >๊ทธ๋ฆฌ๊ณ  T๋ฅผ ์ด์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๋‘ ๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ์ด ๋˜์–ด์•ผํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‚ฌ์‹ค์€ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” iter์˜ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฐฐ์—ด์— ํ•ด๋‹นํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ํ†ตํ•ด T๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„ธ ๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋” ๋‚˜์•„๊ฐ€ print ํ•จ์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ ์ธ์ž ์—ญ์‹œ T๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, T๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ๊ฒฐ์ •์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ print์˜ ํ…œํ”Œ๋ฆฟ ์ธ์ž ์—ญ์‹œ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ์ค„์ฒ˜๋Ÿผ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋ฅผ ๋ชจ๋‘ ์ƒ๋žตํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

3. ex02 (Array)

Definition of Template

ex00 - ex01์—์„œ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ํ•™์Šตํ–ˆ๋‹ค๋ฉด, ex02์—์„œ๋Š” Array ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค. ๊ทธ ์ „์— ํ•˜๋‚˜ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ ์ด ์žˆ๋‹ค. ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ๊ณผ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•  ๋•Œ ์ค‘์š”ํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ์›์น™ ์ƒ ํ…œํ”Œ๋ฆฟ์˜ ์ •์˜๋Š” ํ—ค๋”๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ex00 - ex01์—์„œ ๋ฌด์‹ฌ์ฝ” ์ •์˜๋ฅผ ํ—ค๋”์— ํ•œ ์‚ฌ๋žŒ๋„ ์žˆ์„ ๊ฒƒ์ด๊ณ , ์„œ๋ธŒ์ ํŠธ์— ๋ช…์‹œ๋œ๋Œ€๋กœ ํ—ค๋”์— ์ •์˜ํ•œ ์‚ฌ๋žŒ๋„ ์žˆ์„ ๊ฒƒ์ด๊ณ , ํ—ค๋”์— ์„ ์–ธ๋งŒ ๋‘๊ณ  cpp ํŒŒ์ผ์— ์ •์˜ํ•˜๋ ค๋‹ค๊ฐ€ ๋‘˜๋Ÿฌ์˜จ ์‚ฌ๋žŒ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ฒฝํ—˜ ํ•ด๋ด์„œ ์•Œ๊ฒ ์ง€๋งŒ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ •์˜ํ•œ ์ฝ”๋“œ๋“ค์„ cpp ํŒŒ์ผ๋กœ ์˜ฎ๊ฒจ์„œ ์ด์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ…œํ”Œ๋ฆฟ์˜ ํŠน์ง•์œผ๋กœ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋“  ์—ฐ์‚ฐ์ด ๋๋‚œ๋‹ค๋ผ๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ์ด์™€ ๊ฐ™์€ ํŠน์„ฑ์ด cpp ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ์กฐ๊ธˆ ๋” ์–ธ๊ธ‰ํ•˜์ž๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ cpp ํŒŒ์ผ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ์€ Translation Unit ๋‹จ์œ„์˜ ํŒŒ์‹ฑ์— ๊ทผ๊ฑฐํ•˜๊ณ  ์žˆ๊ณ , ์ด ๋•Œ ํฌํ•จ๋œ ํ—ค๋”์˜ ์„ ์–ธ๊ณผ cpp ํŒŒ์ผ์˜ ์ •์˜๋Š” ๋ณ„๋„์˜ Translation Unit์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ฐ€ ์ข…ํ•ฉํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ…œํ”Œ๋ฆฟ์€ ํ•˜๋‚˜์˜ Translation Unit์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— cpp ํŒŒ์ผ์ฒ˜๋Ÿผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด, ์ปดํŒŒ์ผ ์‹œ์— ์ด๋ฅผ ์ •ํ™•ํžˆ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ex02์—์„œ Array ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•  ๋•Œ๋Š”, ์ œ์ถœ ํŒŒ์ผ ๋ชฉ๋ก ๋•Œ๋ฌธ์—๋„ ๊ทธ๋ ‡๊ณ  ํ…œํ”Œ๋ฆฟ์˜ ์ž‘์„ฑ ์›์น™์— ๋”ฐ๋ผ์„œ๋„ ์„ ์–ธ๊ณผ ์ •์˜๋ฅผ ์˜ˆ์™ธ์ ์œผ๋กœ ํ•จ๊ป˜ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
๋ฌผ๋ก  ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ๊ฝค๋‚˜ ๋ถˆํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ—ค๋”์—์„œ๋Š” ๊ฐ„๋žตํ•˜๊ฒŒ ์„ ์–ธ์„ ํ™•์ธํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ , ์‹ค์ œ ์ •์˜๋Š” ๋”ฐ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ipp ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค. ์‹ค์ œ๋กœ ipp ํŒŒ์ผ์„ ์ด์šฉํ•˜๋ฉด ํ…œํ”Œ๋ฆฟ์˜ ์„ ์–ธ๊ณผ ์ •์˜๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ipp ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ์— ๋Œ€ํ•ด์„  ๋…ผ๋ฆฌ ์ƒ์œผ๋กœ๋งŒ ํ—ค๋”์™€ ๋‚˜๋ˆ ๋†“์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ—ค๋”์˜ ์ฝ”๋“œ๊ฐ€ Translation Unit์œผ๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ์ „, ipp ํŒŒ์ผ์€ ํ—ค๋”๋กœ ํฌํ•จ๋˜์–ด ๋™์ผํ•œ Translation Unit์œผ๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋„๋ก ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค. (๋‹น์—ฐํžˆ ipp ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ํ—ค๋”์— ํฌํ•จํ•œ๋‹ค๋Š” ๋ช…์‹œ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.)

Destructor & Deep Copy

Array ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์€ ์ด๋ฆ„๋งŒ ๋ฐฐ์—ด์ด๊ณ , STL์˜ std::array์™€๋Š” ๊ทธ ์„ฑ๊ฒฉ์ด ๋งค์šฐ ๋‹ค๋ฅด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฐ์—ด์€ std::array์™€ std::vector ์‚ฌ์ด ์–ด๋”˜๊ฐ€์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค. ์šฐ์„  ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์œ  ๊ณต๊ฐ„์—์„œ ๋™์  ํ• ๋‹น์„ ๋ฐ›์•„ ์š”์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ž„์˜์˜ ํƒ€์ž…์œผ๋กœ ๋œ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด ๋•Œ ์–ผ๋งŒํผ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ size์— ๋Œ€ํ•œ ์ •๋ณด๋„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
ํด๋ž˜์Šค ๋‚ด๋ถ€์— ํฌ์ธํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  Module 04์—์„œ ์–ธ๊ธ‰ํ•œ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋„ Module 04์—์„œ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํด๋ž˜์Šค๋ฅผ operator=๋กœ ํ• ๋‹นํ•  ๋•Œ์™€ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ์ž์‹ ์ด ๊ธฐ์กด์— ๊ฐ–๊ณ  ์žˆ๋˜ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๊ธฐ ์ด์ „์— ์ž‘์„ฑํ•ด๋‘” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ตฌ๋ฌธ์—์„œ, ํ• ๋‹น ๋ฐ›์€ ๊ณต๊ฐ„์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก delete [] โ†’ NULL ๋Œ€์ž… โ†’ size = 0์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

operator[] for const or non-const?

operator[]๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, const์™€ non-const์— ๋Œ€ํ•ด์„œ๋„ operator[]๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ๋ ค๊ฐ€ ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด const์™€ non-const์— ๋Œ€ํ•ด์„œ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ ์šฉํ•ด๋ด๋„ ์ข‹๊ณ , ๋ณต์‚ฌ ์ƒ์„ฑ์ž์—์„œ const Array&๋ฅผ ๋ฐ›๋„๋ก ๋˜์–ด์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ๊ฐ’์„ ๋ณต์‚ฌํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋™์ผํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„  Overloading์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐœ์˜ operator[]๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ const๋ฅผ ์œ„ํ•œ operator[]์ด๊ณ , ๋‘ ๋ฒˆ์งธ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ non-const๋ฅผ ์œ„ํ•œ operator[]์ด๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ์žˆ๋‹ค๋ฉด const์™€ non-const์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๊ฐ€ ํ˜๋Ÿฌ๊ฐ€๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๋‹จ, const ํ˜น์€ non-const์˜ operator[]์— ๋Œ€ํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์„ ์ˆ˜ ์žˆ์–ด์„œ ๋‹ค๋ฅธ ํƒ€์ž…์˜ operator[]๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์€ ๋ฌดํ•œ ์žฌ๊ท€์— ๋น ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

Exception

operator[]๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ, index๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ ‘๊ทผ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํžˆ Exception์„ ๋˜์ง€๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. Exception์— ๋Œ€ํ•ด์„  ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜๋ฅผ ํ•˜๋ฏ€๋กœ ์–ด๋–ค ์ด๋ฆ„์ด๋“  ์ƒ๊ด€ ์—†๊ฒ ์ง€๋งŒ, <stdexcept>์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ std::out_of_range๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์Šทํ•œ ์ด๋ฆ„์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.
ํŠนํžˆ size, index, n ๋“ฑ์— ๋Œ€ํ•ด์„œ ํƒ€์ž…์„ unsigned int๋กœ ์ œ์‹œ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด operator[]์˜ ๋ฒ”์œ„ ๊ฒ€์‚ฌ ์‹œ์— ์–‘์ˆ˜๋งŒ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค. unsigned์ด๋ฏ€๋กœ ์Œ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— int๋กœ ์ฒ˜๋ฆฌ ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ๊ณ ๋ คํ•  ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ์ ๋‹ค. ๋˜ํ•œ std::size_t๋Š” unsigned int์™€ ๋™์ผํ•œ ๋ณ„์นญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ ์ƒ ๋” ์ ์ ˆํ•œ std::size_t๋ฅผ ์“ด๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ด๋‹ค.

4. Code of Jseo