java_data

Page 1

์ œ1์žฅ ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ์š” ์ด ์žฅ์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•œ๋‹ค.

1.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์ ˆ์ฐจ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชฉํ‘œ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก  ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก  ์†Œํ”„ํŠธ์›จ์–ด ์ •ํ™•์„ฑ ๊ฒ€์ฆ ๋ฐฉ๋ฒ• ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ์š”

1.2. ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™

์†Œํ”„ํŠธ์›จ์–ด ์ ˆ์ฐจ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์ฝ”๋”ฉ ์™ธ์— ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ์ด์Šˆ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ํŒ€ ํ”„๋กœ์ ํŠธ ์ˆ˜ํ–‰์‹œ ๋”์šฑ ์ค‘์š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ๋‹จ๊ณ„ ๋ฌธ์ œ ๋ถ„์„: ํƒ€๋‹น์„ฑ ์กฐ์‚ฌ, ์„ฑ๊ฒฉ, ๋ฒ”์œ„, ๋ชฉ์  ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„: ์‚ฌ์šฉ์ž ๋ฐ ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ ์†Œํ”„ํŠธ์›จ์–ด ๋ช…์„ธ์„œ: not how but what ์„ค๊ณ„ ์œ„ํ—˜ ๋ถ„์„ ๊ตฌํ˜„ ๊ฒ€์‚ฌ์™€ ๊ฒ€์ฆ ์šด์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ƒ๋ช…์ฃผ๊ธฐ(lifecycle) ์œ ์ง€๋ณด์ˆ˜ not sequential!!!

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

- 1 -


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

์†Œํ”„ํŠธ์›จ์–ด ์ ˆ์ฐจ โ€“ ๊ณ„์† ๋ฌธ์ œ/์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ํ•  ๋•Œ ๊ณ ๋ ค ์‚ฌํ•ญ ์ž…๋ ฅ์˜ ํ˜•ํƒœ, ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ํŒ๋‹จ ๊ธฐ์ค€, ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž ์œ ํ˜•, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ˜•ํƒœ, ์˜ˆ์™ธ์ ์ธ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์˜ ์กด์žฌ ์—ฌ๋ถ€, ๋ฏธ๋ž˜์— ์ถ”๊ฐ€๋  ๊ธฐ๋Šฅ ๊ฐœ๋ฐœํ•  ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ”„๋กœํ† ํƒ€์ž…(prototype) ๋˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ์š”์†Œ์˜ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๋ฉด ๊ด€๋ จ ์‚ฌ๋žŒ๋“ค๊ฐ„์— ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์œ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ •ํ™•ํ•œ ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™(software engineering): ๊ณ ํ’ˆ์งˆ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ๊ฐœ๋ฐœ์˜ ๋ชจ๋“  ์ธก๋ฉด๊ณผ ๊ด€๋ จ๋œ ํ•™๋ฌธ์„ ๋งํ•จ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ๊ณผ ํ–‰์œ„(๋ฌธ์„œํ™”, ํŒ€์›Œํฌ ๋“ฑ)๋ฅผ ๋ชจ๋‘ ํฌํ•จ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์„ธ์Šค(software process): ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค ๊ฐœ์ธ ๋˜๋Š” ์กฐ์ง์ด ์‚ฌ์šฉํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ๊ธฐ์ˆ ์˜ ์ง‘ํ•ฉ์„ ๋งํ•จ ์‚ฌ์šฉํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ์ˆ  ๋˜๋Š” ๋„๊ตฌ ํ•˜๋“œ์›จ์–ด ์†Œํ”„ํŠธ์›จ์–ด: ์ปดํŒŒ์ผ๋Ÿฌ, ๋””๋ฒ„๊ฑฐ ๋“ฑ ์•„์ด๋””์–ด์›จ์–ด: ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์ง€์‹

์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™(software engineering)์ด๋ž€ ๊ณ ํ’ˆ์งˆ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ๋ชจ๋“  ์ธก๋ฉด๊ณผ ๊ด€๋ จ๋œ ํ•™๋ฌธ์„ ๋งํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ–‰์œ„๋„ ํฌํ•จ๋œ ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์„ธ์Šค(software process)๋ž€ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์ธ ๋˜๋Š” ์กฐ์ง์ด ์‚ฌ ์šฉํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™ ๊ธฐ์ˆ ์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์†Œ ํ”„ํŠธ์›จ์–ด ๊ธฐ์ˆ ์€ ํฌ๊ฒŒ ํ•˜๋“œ์›จ์–ด, ์†Œํ”„ํŠธ์›จ์–ด, ์•„์ด๋””์–ด์›จ์–ด(ideaware)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ค‘ ์ด ๊ณผ๋ชฉ๊ณผ ๊ฐ€์žฅ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ๊ฒƒ์€ ์•„์ด๋””์–ด์›จ์–ด์ด๋‹ค. ์•„์ด๋””์–ด์›จ์–ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์‹์„ ๋งํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์•„์ด๋””์›จ์–ด๋กœ๋Š” ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ผ๋ จ์˜ ์œ ํ•œ ์ ˆ์ฐจ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜(algorithm), ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด ์ •๋ณด๋ฅผ ๋ชจ๋ธ๋ง

- 2 -


ํ•˜๊ธฐ

์œ„ํ•ด

์‚ฌ์šฉํ•˜๋Š”

์ž๋ฃŒ๊ตฌ์กฐ(data

structure),

๊ฐ์ฒด์ง€ํ–ฅ๊ฐœ๋ฐœ๋ก ๊ณผ

๊ฐ™์€

๊ฐœ๋ฐœ๋ฐฉ๋ฒ•๋ก ,

UML(Unified Modeling Language)์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„์‹ํ™” ๋„๊ตฌ ๋“ฑ ์ด ์žˆ๋‹ค.

๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชฉํ‘œ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค. ๊ณ ํ’ˆ์งˆ SW๋Š” ๊ทธ๊ฒƒ์˜ ์ž„๋ฌด๋ฅผ ์ •ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์™„์ „์„ฑ, ์ •ํ™•์„ฑ, ์‚ฌ์šฉ์˜ ํŽธ๋ฆฌ์„ฑ, ํšจ์œจ์„ฑ ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ์ˆ˜์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ ์œ ์ง€๋ณด์ˆ˜: ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€, ๊ฒ€์‚ฌ ๊ณผ์ •์—์„œ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ •์ด ์šฉ์ดํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ร† ๋ฌธ์„œํ™” ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ •๋„์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ร† ๋ชจ๋“ˆํ™” ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์š”๊ตฌ๋œ ์‹œ๊ฐ„ ๋‚ด์— ๊ทธ๋ฆฌ๊ณ  ์ฑ…์ •๋œ ๋น„์šฉ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๊ณ  ์™„์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํฌ๊ฒŒ ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ์ ‘๊ทผ๋œ๋‹ค. z ์™„์ „์„ฑ(completeness): ์›๋ž˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. z ์ •ํ™•์„ฑ(correctness): ๊ฐ ๊ธฐ๋Šฅ์ด ์š”๊ตฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์–ด์•ผ ํ•œ๋‹ค. z ์‚ฌ์šฉ์˜ ํŽธ๋ฆฌ์„ฑ(usability): ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. z ํšจ์œจ์„ฑ(efficiency): ์ตœ์†Œํ•œ ์š”๊ตฌ๋œ ์ˆ˜์ค€๋งŒํผ์˜ ํšจ์œจ์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์ดˆ์ฐฝ๊ธฐ์—๋Š” ์™„์ „์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๊ฐ•์กฐํ•˜์˜€์ง€๋งŒ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์ด ๋ฐœ๋‹ฌํ•จ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์˜ ํŽธ๋ฆฌ์„ฑ์— ๋” ๋งŽ์€ ์ดˆ์ ์„ ๋‘”๋‹ค. ์ด ๊ด€์ ์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธก์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž ์ธก๋ฉด์—์„œ ์ด๋Ÿฐ ํŠน์„ฑ๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜์—ฌ์•ผ ํ•˜์ง€๋งŒ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ˆ˜์ • ๋ฐ ํ™•์žฅ์ด ์šฉ์ดํ•˜๋„๋ก ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์†Œํ”„ ํŠธ์›จ์–ด ์ „์ฒด ๊ฐœ๋ฐœ ๋น„์šฉ์—์„œ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋น„์šฉ๋ณด๋‹ค๋Š” ์œ ์ง€๋ณด์ˆ˜์— ๋” ๋งŽ์€ ๋น„์šฉ์ด ์†Œ์š”๋˜๊ธฐ ๋•Œ ๋ฌธ์ด๋‹ค.

- 3 -


๋ฌธ์ œ์˜ ์ดํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ˆ™์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์œผ๋กœ ๋ถ„๋Ÿ‰์ด 12ํŽ˜์ด์ง€์ธ ๋ฌธ์„œ๊ฐ€ ํ•™์ƒ๋“ค์—๊ฒŒ ์ œ์‹œ๋˜์—ˆ๋‹ค. ๊ธฐ๊ฐ„์€ ์ผ์ฃผ์ผ์ด ์ฃผ์–ด์กŒ๋‹ค. ๋‹ค์Œ์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•™์ƒ๋“ค์˜ ๋ฐ˜์‘์„ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. Panic and do nothing 39% Panic and drop the course 30% Sit down at the computer and begin typing 27% Stop and think 4%

๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ๊ฐ€์žฅ ์ฒซ ๋‹จ๊ณ„์ด๋‹ค. ์ƒ๊ฐ์„ ์ถฉ๋ถ„ํ•˜ ์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ํ•˜๊ฒŒ ๋˜๋ฉด ์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ์•„์ด๋””์–ด๋ฅผ ๋ฒ„๋ฆฌ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด๊ฒƒ์€ ์ธ๊ฐ„ ์˜ ์–ด๋–ค ๋ณธ์งˆ์ ์ธ ํŠน์„ฑ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜๊ณ  ๋ถ„์„ํ•œ ๋‹ค์Œ์— ๊ตฌํ˜„์— ์ฐฉ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ์˜ ์ดํ•ด โ€“ ๊ณ„์† ์ž์„ธํ•œ ๋ฌธ์ œ์˜ ๋ช…์„ธ์„œ ์ž‘์„ฑ ์š”๋ น: ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ•ด๋ณธ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค: ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์˜€์„ ๋•Œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ผ๋ จ์˜ ์‚ฌ๊ฑด ์˜ˆ1.1) ATM ๊ธฐ๊ณ„ ๊ณ ๊ฐ์€ ์€ํ–‰ ์นด๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ATM์€ ์นด๋“œ๋กœ๋ถ€ํ„ฐ ๊ณ„์ขŒ๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ธ๋‹ค. ATM์€ PIN ๋ฒˆํ˜ธ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๊ณ ๊ฐ์€ PIN ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ATM์€ PIN ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•œ๋‹ค. ATM์€ ๊ฑฐ๋ž˜ ์ข…๋ฅ˜(์ž…๊ธˆ, ์ด์ฒด, ์กฐํšŒ, ์ข…๋ฃŒ)๋ฅผ ๋ฌผ์–ด๋ณธ๋‹ค. ๊ณ ๊ฐ์€ ์กฐํšŒ๋ฅผ ์„ ํƒํ•œ๋‹ค. ATM์€ ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์„ ์ฝ๊ณ  ๊ทธ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์ค€๋‹ค. ATM์€ ๊ฑฐ๋ž˜ ์ข…๋ฅ˜๋ฅผ ๋‹ค์‹œ ๋ฌผ์–ด๋ณธ๋‹ค. ๊ณ ๊ฐ์€ ์ข…๋ฃŒ๋ฅผ ์„ ํƒํ•œ๋‹ค. ATM์€ ์€ํ–‰์นด๋“œ๋ฅผ ๋˜๋Œ๋ ค์ค€๋‹ค.

๋ฌธ์ œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋™์ž‘ ์‹œ๋‚˜๋ฆฌ ์˜ค๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

- 4 -


์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ถ”์ƒํ™”(abstraction): ํŠน์ • ๊ด€์ฐฐ์ž ์ž…์žฅ์—์„œ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜์ ์ธ ์ถ”์ƒํ™” ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ชจ๋ธ ๊ด€์ฐฐ์ž๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ˆ˜์ค€์˜ ์„ธ๋ถ€์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ณ ๋ ค ์—†์ด ์ ์ ˆํ•œ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. (stepwise-refinement) ์ถ”์ƒํ™”๋œ ๊ฒƒ์€ ์ ์ง„์ ์œผ๋กœ ์„ธ๋ถ„ํ™”๋˜์–ด ๊ตฌ์ฒดํ™”๋œ๋‹ค. ํ•˜ํ–ฅ์‹(top-down) ์ƒํ–ฅ์‹(bottom-up) ๊ฐ์ฒด์ง€ํ–ฅ ์ ‘๊ทผ ๋ถ„ํ• ์ •๋ณต(divide-and-conquer): ๋ณต์žกํ•œ ๋ฌธ์ œ์ผ ์ˆ˜๋ก ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๋ถ„ํ• ์ •๋ณต ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค.

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

์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ โ€“ ๊ณ„์† ์ „์ฒด ๋ฌธ์ œ์˜ ์ž‘์€ ์ผ๋ถ€๋ถ„์„ ๋ชจ๋“ˆ(module)์ด๋ผ ํ•œ๋‹ค. ๋ชจ๋“ˆ ์ •๋ณด ์€๋‹‰(information hiding): ๋ชจ๋“ˆ์€ ๊ทธ๊ฒƒ์˜ ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์€๋‹‰ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธด๋‹ค. ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ชฉ์  ๋ชจ๋“ˆ์€ ๊ทธ๊ฒƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค. ๋ชจ๋“ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ฑ(loosely-coupled): ๋ชจ๋“ˆ์€ ์ƒํ˜ธ ๋…๋ฆฝ์ ์ด์–ด์•ผ ๊ฒฐํ•ฉ์„ฑ ํ•œ๋‹ค. ํ•œ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๋†’์€ ์‘์ง‘์„ฑ(highly-cohesive): ์ž˜ ์ •์˜๋œ ๋‹จ์ผ ์ž‘์—…๋งŒํ•ด์•ผ ํ•œ๋‹ค. ์‘์ง‘์„ฑ

ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์—์„œ๋Š” ์ „์ฒด ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ , ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ณด๋‹ค ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์ด๋ผ ํ•œ๋‹ค. ๋ถ„ํ• ์ •๋ณต์„ ํ†ตํ•ด ์–ป์–ด์ง€๊ฒŒ ๋˜๋Š” ์ „์ฒด ๋ฌธ์ œ์˜ ์ž‘์€ ์ผ๋ถ€๋ถ„ ์„ ๋ชจ๋“ˆ(module)์ด๋ผ ํ•œ๋‹ค. ๋ชจ๋“ˆ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์ •๋ณด ์€๋‹‰์ด๋‹ค. ์ฆ‰, ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๊ทธ๊ฒƒ์˜ ๋‚ด๋ถ€์˜ ์ž์„ธํ•œ ๋‚ด์šฉ ๋˜๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋“ˆ์€ ์˜ค์ง ๊ทธ๊ฒƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต

- 5 -


ํ•ด์„œ๋งŒ ์ดํ•ด๋˜๋ฉด ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋ชจ๋“ˆ์€ ๊ฒฐํ•ฉ์„ฑ์ด ๋Š์Šจํ• ์ˆ˜๋ก, ์‘ ์ง‘์„ฑ์ด ๋†’์„์ˆ˜๋ก ๋ฐ”๋žŒ์งํ•˜๋‹ค. ๊ฒฐํ•ฉ์„ฑ์ด ๋Š์Šจํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋“ˆ ๊ฐ„์— ์˜์กด์„ฑ์ด ์ ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์‘์ง‘์„ฑ์ด ๋†’๋‹ค๋Š” ๊ฒƒ์€ ์ž˜ ์ •์˜๋œ ๋‹จ์ผ ์ž‘์—…๋งŒ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ํ•œ ๋ชจ๋“ˆ์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•  ๊ฒฝ์šฐ์—๋Š” ํŠน์ • ์ž‘์—…์˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์— ์˜ํ–ฅ์„ ์ค„ ํ™•๋ฅ ์ด ๋†’๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ โ€“ ๊ณ„์† ๊ฐ ๋ชจ๋“ˆ์˜ ์„ค๊ณ„ํ•  ๋•Œ ์ค‘์š”ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ ํ๋ฆ„(data flow) ํ๋ฆ„ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๋ชจ๋“ˆ๋งˆ๋‹ค ๋‹ค์Œ์ด ๊ณ ๋ ค๋˜์–ด์•ผ ํ•œ๋‹ค. (input input) ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ œ๊ณต๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š”? (assumption assumption) ๋ชจ๋“ˆ์ด ์–ด๋–ค ๊ฒƒ์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? (output output) ๋ชจ๋“ˆ์˜ ํ–‰๋™์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์ด ์‹คํ–‰๋œ ํ›„์— ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Šต์€? ํ›„์— ์„ค๋ช…ํ•˜๋Š” ์‚ฌ์ „/์‚ฌํ›„์กฐ๊ฑด๊ณผ ์—ฐ๊ด€๋˜๋ฉฐ, ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ํ†ต์‹  ์ˆ˜๋‹จ์ด ๋œ๋‹ค. ๋น„๊ณ . ๋น„๊ณ . ์ด๋Ÿฐ ํ๋ฆ„์€ ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€์˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๋‹ค.

๊ฐ ๋ชจ๋“ˆ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„ค๊ณ„ ๊ณผ์ •์—์„œ ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„๋„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ฐ ๋ชจ๋“ˆ ์ธก๋ฉด์—์„œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ๊ณ ๋ ค๋œ๋‹ค. ์ฒซ์งธ, ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ชจ๋“ˆ์— ์ œ๊ณต๋˜๋Š” ๋˜๋Š” ์ œ๊ณต๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋‘˜์งธ, ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์ •์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์…‹์งธ, ๋ชจ๋“ˆ์˜ ํ–‰๋™๊ณผ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์ด ์‹ค ํ–‰๋œ ํ›„์— ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Šต์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์€ ํ›„ ์— ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ์‚ฌ์ „, ์‚ฌํ›„์กฐ๊ฑด๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜ ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•˜๋Š” ํŒ€์› ๊ฐ„์— ์ค‘์š”ํ•œ ํ†ต์‹  ์ˆ˜๋‹จ์ด ๋œ๋‹ค. ์—ฌ๊ธฐ ์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ•์กฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์€ ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ ๋ฒ•๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“ˆ์ด ์–ด๋–ค ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š”์ง€๋Š” ๊ทธ๊ฒƒ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

- 6 -


๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์™€ ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„์˜ ์ฐจ์ด์  ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„(object-oriented design)๋Š” ๋ฌธ์ œ์—์„œ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ์„ค๊ณ„ ์ด ๊ฐ์ฒด๋“ค์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋ธ๋งํ•œ๋‹ค. (๋ช…์‚ฌ) ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์‹ค์„ธ๊ณ„์™€ ๊ฐ€๊น๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Œ ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„(structured design)๋Š” ๋ฌธ์ œ์—์„œ ํ–‰์œ„๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ์„ค๊ณ„ ํ–‰์œ„ ์œ„์ฃผ๋กœ ๋ชจ๋ธ๋งํ•œ๋‹ค. (๋™์‚ฌ) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์‹ฌ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ 1. ์บก์Šํ™”(encapsulation): ๋ฐ์ดํ„ฐ์™€ ํ–‰์œ„์˜ ๊ฒฐํ•ฉ 2. ์ƒ์†(inheritance): ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ 3. ๋‹คํ˜•์„ฑ(polymorphism): ์‹คํ–‰์‹œ๊ฐ„์— ๊ฐ์ฒด์— ์˜ํ•ด ํ–‰์œ„๊ฐ€ ๊ฒฐ์ •๋จ

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

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ํด๋ž˜์Šค ๋ฐœ๊ฒฌ ๋ฌธ์ œ ์ •์˜์—์„œ ๋ช…์‚ฌ์™€ ๋™์‚ฌ๋ฅผ ์ฐพ๋Š”๋‹ค. ๋ช…์‚ฌ๋Š” ๊ฐ์ฒด๋กœ ๋™์‚ฌ๋Š” ๊ฐ์ฒด์˜ ํ–‰์œ„๋กœ ๋ณดํ†ต ๋ชจ๋ธ๋ง๋œ๋‹ค. ๋ณดํ†ต ์ฃผ์š” ํด๋ž˜์Šค๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๊ณ„์ธต๊ตฌ์กฐ๋กœ ์กฐ์งํ™”ํ•œ๋‹ค. ๊ฐ ํด๋ž˜์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜์˜ ์ฃผ์š” ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ง€๋„๋ก ํ•œ๋‹ค. ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์„  ์ž์„ธํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค๊ณผ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ(brainstorming)์„ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ•ด๋ณธ๋‹ค.

์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ํ•ต์‹ฌ์€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํด๋ž˜์Šค๋Š” ๊ฐ™์€ ์ข… ๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ‹€์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ์—์„œ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค. ํด๋ž˜์Šค๋Š” ๋ฌธ์ œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“ˆ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ž์„œ ์„ค ๋ช…ํ•œ ๋ชจ๋“ˆ์ด ๊ฐ–์ถ”์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์„ ํด๋ž˜์Šค๋„ ๊ฐ–์ถ”์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ํ•œ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ์™€ ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ํ•œ ํด๋ž˜์Šค๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์ฃผ์š” ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

- 7 -


๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์˜ˆ) ๋ฌธ์ œ์˜ ์ •์˜: ์ฃผ์†Œ๋ก ์ฑ… ์ž‘์„ฑ ์ž ์žฌ์  ๊ฐ์ฒด ๊ฒ‰์žฅ ํ•ญ ํŽ˜์ด์ง€ ์ด๋ฆ„ ์ง‘์ „ํ™”๋ฒˆํ˜ธ ์ „ํ™”๋ฒˆํ˜ธ ํšŒ์‚ฌ์ „ํ™”๋ฒˆํ˜ธ ํŒฉ์Šค๋ฒˆํ˜ธ ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ

์ƒ๋…„์›”์ผ ์ฃผ์†Œ ์ง‘์ฃผ์†Œ ํšŒ์‚ฌ์ฃผ์†Œ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ํšŒ์‚ฌ์ด๋ฆ„ - ํ•„์š”์—†๋‹ค๊ณ  ํŒ๋‹จ ๋‹ฌ๋ ฅ ์†Œ์œ ์ž ์ •๋ณด ์‚ฌ์šฉ์ž ร† ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค

์–ด๋–ค ์ฃผ์–ด์ง„ ๋ฌธ์ œ์—์„œ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋Š” ์ฃผ์†Œ๋ก ์ฑ… ์ž‘์„ฑ์ด๋‹ค. ์šฐ์„  ์‹ค์„ธ๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์†Œ๋ก์„ ๊ด€์ฐฐํ•˜๊ณ  ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ๊ฐ๋‚˜ ๋Š” ์ž ์žฌ์  ๊ฐ์ฒด๋“ค์„ ๋ชจ๋‘ ๋‚˜์—ดํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ๋‚˜์—ด๋œ ๊ฒƒ๋“ค์—์„œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ, ํ†ตํ•ฉ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ, ์ƒ์† ๊ฐœ๋…์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹ค์„ธ๊ณ„์˜ ์ฃผ์†Œ๋ก์€ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ์ธก๋ฉด์—์„œ๋Š” ํŽ˜์ด ์ง€๋ผ๋Š” ๊ฐœ๋…์€ ํ•„์š” ์—†๊ณ , ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ์‚ฌ๋žŒ์˜ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•ญ(entry)์ด ํ•„์š”ํ•˜๋‹ค. ๋˜ ์ง‘์ „ํ™”๋ฒˆํ˜ธ, ํšŒ์‚ฌ์ „ํ™”๋ฒˆํ˜ธ, ํŒฉ์Šค๋ฒˆํ˜ธ ๋“ฑ์€ ๋ณดํ†ต ๋ชจ๋‘ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•˜์ง€ ์•Š ์„ ๊ฒƒ์ด๋‹ค. ์ด๋“ค์€ ์ „ํ™”๋ฒˆํ˜ธ๋ผ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ณดํ†ต ๋‚˜ํƒ€๋‚ผ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์นœ ๋‹ค์Œ์—๋Š” ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค CRC(Class, Responsibility, Collaboration) ์นด๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ, ๊ฐ ๊ฐ์ฒด ์˜ ์ฑ…์ž„๊ณผ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์–ด๋–ค ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์˜ˆ) ๊ณ„์† ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค CRC(Class, Responsibility, Collaboration) ์นด๋“œ๋ฅผ ์ž‘์„ฑ ํด๋ž˜์Šค ์ด๋ฆ„: entry

๋ถ€๋ชจ ํด๋ž˜์Šค:

์ž์‹ ํด๋ž˜์Šค:

์ฃผ์š” ์ฑ…์ž„: ์ฃผ์†Œ๋ก ํ•œ ํ•ญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฑ…์ž„

ํ˜‘๋™

์ „์ฒด ์ด๋ฆ„์„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ์ œ๊ณต

name ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์„ฑ์„ name ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ด๋ฆ„์„

์ฃผ์†Œ ์ œ๊ณต

์—†์Œ

- 8 -


๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์˜ˆ) ๊ณ„์† ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒ€ํ†  ์‚ฌ์šฉ์ž๊ฐ€ ์ฃผ์†Œ๋ก์—์„œ ์ฃผ์†Œ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ด๋ฆ„์„ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ์–ด๋””์„œ ์ฐพ๋‚˜? ร† ์ฃผ์†Œ๋ก ์ „์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•จ ๋น„๊ต๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ์–ด๋””์„œ? ร† ์ฃผ์†Œ๋ก or ํ•ญ ํ•ญ์—์„œ ์ด๋ฆ„์„ ๋ฐ›์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฆ„๊ณผ ๋น„๊ตํ•œ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์œผ๋ฉด ๊ทธ ํ•ญ์œผ๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒ€ํ†  ์ƒˆ ํ•ญ์˜ ์ถ”๊ฐ€, ๊ธฐ์กด ํ•ญ์˜ ์‚ญ์ œ ๋“ฑ

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

์†Œํ”„ํŠธ์›จ์–ด์˜ ์ •ํ™•์„ฑ ๊ฒ€์ฆ ํ…Œ์ŠคํŒ…(testing): ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • ๋””๋ฒ„๊น…(debugging): ๋ฐœ๊ฒฌ๋œ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ • ์Šน์ธ ์‹œํ—˜(acceptance test): ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์‹œ์Šคํ…œ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ • ์˜ค๋ฅ˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ผ์ฐ ๋ฐœ๊ฒฌํ• ์ˆ˜๋ก ์ˆ˜์ • ๋น„์šฉ์ด ์ €๋ ดํ•˜๋‹ค. ๋ช…์„ธ์„œ ๋˜๋Š” ์„ค๊ณ„ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ€์žฅ ์น˜๋ช…์ ์ด๋‹ค.

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

- 9 -


๊ตฌํ˜„ ์˜ค๋ฅ˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜(compile-time error): ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์˜ค๋ฅ˜(run-time error) ์ž˜ ๋ชป๋œ ๊ฐ€์ •: result = dividend / divisor ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ค๋ฅ˜ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ๊ทธ๊ฒƒ์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ•๊ฑด์„ฑ (robustness)์ด๋ผ ํ•œ๋‹ค. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(exception handling) ์„ค๊ณ„๋ถ€ํ„ฐ ์–ด๋–ค ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•จ what, where, how

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

์ •ํ™•์„ฑ์„ ์œ„ํ•œ ์„ค๊ณ„ ์‚ฌ์ „์กฐ๊ฑด(precondition): ์‚ฌํ›„์กฐ๊ฑด์ด ๋ณด์žฅ๋˜๊ธฐ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ์— ์‚ฌ์ „์กฐ๊ฑด ์ง„์ž…ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์ • ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์ฑ…์ž„ ์‚ฌ์ „์กฐ๊ฑด์ด ์œ„๋ฐฐ๋œ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ? ๋ฐฉ๋ฒ•1. ๋ฐฉ๋ฒ•1. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•2. ๋ฐฉ๋ฒ•2. ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‚ฌํ›„์กฐ๊ฑด(postcondition): ์‚ฌ์ „์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์—ˆ์„ ๋•Œ, ์‚ฌํ›„์กฐ๊ฑด ๊ธฐ๋Œ€๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ์–ด๋–ป๊ฒŒ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ฑ…์ž„ ์‚ฌ์ „, ์‚ฌํ›„์กฐ๊ฑด์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด๊ฐ€ ์—†์œผ๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

- 10 -


์ •ํ™•์„ฑ์„ ์œ„ํ•œ ์„ค๊ณ„ โ€“ ๊ณ„์† ์‚ฌํ›„์กฐ๊ฑด์˜ ์ข…๋ฅ˜ ์ข…๋ฅ˜ 1. ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ •ํ™•์„ฑ ์ข…๋ฅ˜ 2. ๊ฐ์ฒด์˜ ์ƒํƒœ ์‚ฌ์ „, ์‚ฌํ›„์กฐ๊ฑด์˜ ์˜ˆ) void RemoveLast() ํšจ๊ณผ: ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ์‚ฌ์ „์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์‚ฌํ›„์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์žˆ๋‹ค. WARNING If you try to execute this operation when the preconditions are not true, the results are not guaranteed

Deskchecking โ€“ Design ๊ฐ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ๊ณผ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•œ๊ฐ€? ํฐ ํด๋ž˜์Šค๋ฅผ ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์—†๋Š”๊ฐ€? ๊ณตํ†ต๋œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํด๋ž˜์Šค๋“ค์ด ์žˆ๋Š”๊ฐ€? ์žˆ์œผ๋ฉด ์ด๋“ค์„ ์ƒ์† ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๋ชจ๋“  ๊ฐ€์ •์ด ํ•ฉ๋‹นํ•˜๋ฉฐ, ๋ฌธ์„œ์— ์ž˜ ๋‚˜ํƒ€๋‚˜ ์žˆ๋Š”๊ฐ€? ๋ชจ๋“  ์‚ฌ์ „/์‚ฌํ›„์กฐ๊ฑด์ด ์ •๋‹นํ•œ๊ฐ€? ๋ช…์„ธ์„œ์™€ ๋น„์ถ”์–ด ๋ดค์„ ๋•Œ ์„ค๊ณ„๊ฐ€ ์™„์ „ํ•˜๊ณ  ์ •ํ™•ํ•œ๊ฐ€?

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

- 11 -


Deskchecking โ€“ Coding ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ์„ค๊ณ„์— ๋‚˜ํƒ€๋‚œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ฉ”์†Œ๋“œ๋“ค์ด ๊ตฌํ˜„๋˜์—ˆ๋Š”๊ฐ€? ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ์‹ค์ œ ์ธ์ˆ˜์™€ ๋ฉ”์†Œ๋“œ ์ •์˜์— ์„ ์–ธ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€? ๊ฐ ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ๋Š”๊ฐ€? ๋ชจ๋“  ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒํ•˜๋Š”๊ฐ€? ๋งค์ง ๊ฐ’๋“ค์€ ์—†๋Š”๊ฐ€? (๋งค์ง ๊ฐ’์€ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณด๋ฉด ๊ทธ ์˜๋ฏธ๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฐ’ ร† ๋ช…๋ช…๋œ ์ƒ์ˆ˜ ์‚ฌ์šฉ) ๊ฐ ์ƒ์ˆ˜, ํด๋ž˜์Šค, ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ์ ์ ˆํ•œ๊ฐ€?

ํ…Œ์ŠคํŒ… โ€“ ๋‹จ์œ„ ํ…Œ์ŠคํŒ… ๋ธ”๋ž™ ๋ฐ•์Šค ํ…Œ์ŠคํŒ… (๋ฐ์ดํ„ฐ ์œ„์ฃผ ํ…Œ์ŠคํŒ…) ๊ธฐ๋Šฅ ์˜์—ญ: ์œ ํšจํ•œ ์ž…๋ ฅ์˜ ์ง‘ํ•ฉ ๊ธฐ๋Šฅ ์˜์—ญ์ด ์ž‘์œผ๋ฉด ๋ชจ๋“  ๊ฒฝ ์šฐ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋žœ๋ค ๊ฒ€์‚ฌ: ๊ธฐ๋Šฅ ์˜์—ญ์—์„œ ๋ช‡ ๊ฐœ์˜ ์ž…๋ ฅ์„ ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•˜์—ฌ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ธฐ๋Šฅ ์˜์—ญ์„ ๋ถ„๋ฅ˜ํ•˜์—ฌ ๊ฐ ์†Œ ์˜์—ญ ๋ณ„ ํ•˜๋‚˜์˜ ์ž…๋ ฅ์„ ๊ฒ€์‚ฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์˜ˆ) ์ž…๋ ฅ์ด ์ •์ˆ˜: ์Œ์ˆ˜, 0, ์–‘์ˆ˜

ํˆฌ๋ช… ๋ฐ•์Šค ํ…Œ์ŠคํŒ… (์ฝ”๋“œ ์œ„์ฃผ ํ…Œ์ŠคํŒ…) ๋ฉ”์†Œ๋“œ์˜ ๊ฐ ๋ฌธ์žฅ์„ ์ฐจ๋ก€๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ถ„๊ธฐ(branch): ํ•ญ์ƒ ์‹คํ–‰ ๋˜์ง€ ์•Š๋Š” ์ผ๋ จ์˜ ๋ฌธ์žฅ ๊ฒฝ๋กœ(path): ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰ ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ถ„๊ธฐ์˜ ์กฐํ•ฉ ๊ฒฝ๋กœ ๊ฒ€์‚ฌ(path testing): ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๋‹ค ์‹คํ–‰ํ•˜๋ฉด์„œ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ…Œ์ŠคํŒ…์ด๋ž€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์„ค๊ณ„๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜ ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋Ÿฐ ํ…Œ์ŠคํŒ…์€ ํฌ๊ฒŒ ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŒ…, ํˆฌ๋ช… ๋ฐ•์Šค ํ…Œ์ŠคํŒ…, ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ๋ธ”๋ž™ ๋ฐ•์Šค ํ…Œ์ŠคํŒ…์€ ๊ตฌํ˜„์˜ ๋‚ด๋ถ€ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ณ ๋ ค์—†์ด ์–ด๋–ค ์ž…๋ ฅ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ์„ ์ฃผ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ํˆฌ๋ช… ๋ฐ•์Šค ํ…Œ์ŠคํŒ…์€ ๊ตฌํ˜„์˜ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ๊ณ ๋ คํ•˜ ์—ฌ ์ž…๋ ฅ์„ ์ •ํ•˜์—ฌ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

- 12 -


๋ฃจํ”„์˜ ์ •ํ™•์„ฑ ๊ฒ€์ฆ ๋ฃจํ”„ ๋ถˆ๋ณ€์กฐ๊ฑด(loop invariant): ๋ฃจํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „, ๋ฃจํ”„๊ฐ€ ๋ฐ˜๋ณต๋œ ๋ถˆ๋ณ€์กฐ๊ฑด ํ›„, ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์— ํ•ญ์ƒ ๋งŒ์กฑ๋˜์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์„ ๋งํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ •ํ™•์„ฑ์„ ์ถฉ์กฑ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์˜ˆ1.2) ๋ฐฐ์—ด item์— ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ int sum = 0; int i = 0; while(i<n){ sum += item[i]; i++; }

๋ฃจํ”„ ๋ถˆ๋ณ€์กฐ๊ฑด. sum์€ item[0]๋ถ€ํ„ฐ item[i-1]๊นŒ์ง€์˜ ํ•ฉ์ด์–ด์•ผ ํ•œ๋‹ค.

๋ฃจํ”„์˜ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฃจํ”„ ๋ถˆ๋ณ€์กฐ๊ฑด(loop invariant)์„ ํ™•์ธ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฃจํ”„ ๋ถˆ๋ณ€์กฐ๊ฑด์ด๋ž€ ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „, ๋ฃจํ”„๊ฐ€ ๋ฐ˜๋ณต๋œ ํ›„, ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ์— ํ•ญ์ƒ ๋งŒ์กฑ๋˜์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ์„œ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ •ํ™•์„ฑ๊ณผ ์ผ์น˜๋˜๋Š” ์กฐ๊ฑด์ด์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ถˆ๋ณ€์กฐ๊ฑด์ด ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•ด์•ผ ํ•œ๋‹ค.

1.3. ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ์š” ์ž๋ฃŒ๊ตฌ์กฐ(data structure)๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํ“จํ„ฐ์— ํ‘œํ˜„, ์ €์žฅ, ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

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

๋ฐ์ดํ„ฐ๋ž€ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ •๋ณด๋ฅผ ๋งํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋กœ์„œ, ์ด ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ๊ณผ ์ด ์š”์†Œ๋“ค ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์˜ ์ง‘ํ•ฉ์— ์˜ํ•ด ์ •์˜๋œ๋‹ค. ๋ณดํ†ต ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์€ ์‹œ์Šคํ…œ ์ •์˜ ํƒ€์ž…๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. ์‹œ์Šคํ…œ ์ •์˜ ํƒ€์ž…์€ ๋‹ค ์‹œ ํฌ๊ฒŒ ๋‹จ์ˆœ ํƒ€์ž…๊ณผ ๋ณตํ•ฉ ํƒ€์ž…์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋ฉฐ, ๋‹จ์ˆœ ํƒ€์ž…์€ ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ•ดํ•  ์ˆ˜

- 13 -


์—†๋Š” ํƒ€์ž…์ด๊ณ , ๋ณตํ•ฉํƒ€์ž…์€ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ํƒ€์ž…์ด๋‹ค. ๋ณตํ•ฉ ํƒ€์ž…์—์„œ ๋Š” ๊ฐ ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์—ฐ์‚ฐ์ด ์ค‘์š”ํ•˜๋‹ค.

์ถ”์ƒํ™” ์ ˆ์ฐจ์˜ ์ถ”์ƒํ™”(procedural abstraction) ์ถ”์ƒํ™” ๋ฉ”์†Œ๋“œ์˜ ๋ชฉ์ ๊ณผ ๊ทธ๊ฒƒ์˜ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ ๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”(data abstraction, encapsulation) ์ถ”์ƒํ™” ๋ฐ์ดํ„ฐ์— ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ๋ฒ• ๋ฐ ์—ฐ์‚ฐ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…(ADT, Abstract Data Type) ํƒ€์ž… ํŠน์ • ๊ตฌํ˜„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํŠน์„ฑ์ด ๋ช…์‹œ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” int ํƒ€์ž… ์—ญ์‹œ ADT๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ชฐ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ์— ์žˆ์–ด์„œ๋„ ์ถ”์ƒํ™”๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ œ๊ณต ๋˜๊ณ  ์žˆ๋Š” ์ •์ˆ˜ํ˜• ํƒ€์ž…์ธ int์˜ ๊ฒฝ์šฐ์—๋„ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ๊ทธ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์—ฐ์‚ฐ๋“ค์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ณผ๋ชฉ์—์„œ ๋ฐฐ์šฐ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํฐ ํ•ต์‹ฌ์€ ๊ฐ ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํ“จํ„ฐ์— ํ‘œํ˜„, ์ €์žฅ, ๊ด€๋ฆฌ ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด ๋•Œ ๊ฐœ๋ฐœ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๊ทธ๊ฒƒ์˜ ์ž ์„ธํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•Œ์ง€ ๋ชปํ•˜์—ฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํŠน์„ฑ์„ ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€ ์ž…(ADT, Abstract Data Type)์ด๋ผ ํ•œ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์ž๋ฃŒ๊ตฌ์กฐ(data structure) ์ž๋ฃŒ๊ตฌ์กฐ ์ •์˜1. ์ •์˜1. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ์„œ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค ์˜ ๋ชจ์Œ์„ ๋ชจ์Œ ๋งํ•œ๋‹ค. ์ด ๋ชจ์Œ์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์„ฑ์€ ๊ฐœ๋ณ„ ์š”์†Œ ๊ฐ„์— ๋…ผ๋ฆฌ์  ๊ด€๊ณ„๋ฅผ ๊ด€๊ณ„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ •์˜2. ์ •์˜2. ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Œ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ ‘๊ทผ ์—ฐ์‚ฐ์— ์˜ํ•ด ํŠน์ง•์ง€์–ด์ง„๋‹ค. ํŠน์ง• ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ADT๋กœ ๊ตฌํ˜„๋œ๋‹ค.

์ •์ˆ˜์™€ ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž…์€ ์นด์šดํ„ฐ๋‚˜ ๋ฐฐ์—ด์˜ ์ƒ‰์ธ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋Š” ์ •์ˆ˜์™€ ๊ฐ™์€ ๋‹จ ์ˆœ ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋” ๋งŽ๋‹ค. ๋ณดํ†ต์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•œ ๋ณตํ•ฉ ํƒ€์ž…์„ ๋งŽ ์ด ์ด์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„ฑ์  ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ•™์ƒ์— ๊ด€ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด

- 14 -


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

์ž๋ฃŒ๊ตฌ์กฐ โ€“ ๊ณ„์† ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ถ„ํ•ด๋  ์ˆ˜ ์žˆ๋‹ค. ์š”์†Œ๋“ค์ด ์กฐ์ง๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๋Š” ๊ฐ ๊ฐœ๋ณ„ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์— ์˜ํ–ฅ์„ ์ค€๋‹ค. ์กฐ์ง๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ์™€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์—ฐ์‚ฐ์˜ ๋ถ„๋ฅ˜ ์ƒ์„ฑ์ž: ์ƒ์„ฑ์ž ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ ๊ธฐ์กด ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋ณต์‚ฌ ์ƒ์„ฑ์ž(copy constructor)๋ผ ํ•œ๋‹ค. ์ˆ˜์ •์ž: ์ˆ˜์ •์ž ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋“ค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ ๊ด€์ฐฐ์ž: ๊ด€์ฐฐ์ž ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋“ค์˜ ์ƒํƒœ๋ฅผ ์—ด๋žŒํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ ๋ฐ˜๋ณต์ž(iterator): ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์žˆ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ˜๋ณต์ž ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฐ์ดํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜(algorithm): ์œ ํ•œ ๋‹จ๊ณ„ ๋‚ด์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ณ„๋กœ ๊ธฐ์ˆ ํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋กœ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ฌ๋ผ์ง„๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ ํ•œ ๋‹จ๊ณ„ ๋‚ด์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ๊ธฐ์ˆ ํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์–ด๋–ค ๋ฌธ ์ œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์—์„œ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๊ฒƒ์ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์— ๋Š” ์„ ํ˜• ๊ฒ€์ƒ‰์ด ์•„๋‹Œ ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 15 -


์ œ2์žฅ ์ž๋ฐ” ๋ณต์Šต ์ด ์žฅ์—์„œ๋Š” ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ณต์Šตํ•œ๋‹ค.

2.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์ž๋ฐ”์˜ ํŠน์„ฑ ์ดํ•ด์™€ ๋ณต์Šต

2.2. ์ž๋ฐ”์˜ ์—ญ์‚ฌ

์ž๋ฐ” ์—ญ์‚ฌ 1991๋…„: Sun Microsystems ์‚ฌ์˜ James Gosling๊ณผ Patrick Naughton์ด ๊ฐœ๋ฐœํ•œ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ช…: Green ์›๋ž˜๋Š” ์ง€๋Šฅํ˜• TV์™€ ๊ฐ™์€ ๊ฐ€์ •์šฉ ๊ฐ€์ „ ์ œํ’ˆ์— ์‚ฌ์šฉ๋  ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋จ ๊ฐ ์ œ์กฐ์—…์ฒด๋Š” ๋‹ค๋ฅธ CPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠน์ • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์— ๋…๋ฆฝ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ค๊ณ„ ๋ชฉํ‘œ์˜€๋‹ค. ๊ธฐ๊ณ„์–ด์™€ ๋…๋ฆฝ์ ์ธ ์ค‘๊ฐ„ ์ฝ”๋“œ(intermediate code)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์ด๋™ ๊ฐ€๋Šฅ ์–ธ์–ด ๊ฐœ๋ฐœ (write-once run anywhere) C++ ๊ธฐ๋ฐ˜: ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด ์—…๊ณ„ ๋ฐ˜์‘: ๋ƒ‰๋Œ€

1991๋…„ Sun ์‚ฌ์˜ James Gosling๊ณผ Patrick Naughton์€ ์ผ€์ด๋ธ” TV ์Šค์œ„์น˜ ๋ฐ•์Šค์™€ ๊ฐ™์€ ๊ฐ€ ์ „์ œํ’ˆ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค. ๊ฐ€์ „์ œํ’ˆ์˜ ๊ฐ ์ œ์กฐ ์—…์ฒด๋Š” ๋‹ค๋ฅธ CPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์‹์„ฑ(portability)์ด ์ด๋“ค์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ค ๊ณ„ ๋ชฉํ‘œ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ฒ˜๋Ÿผ ๊ธฐ๊ณ„์— ์˜์กด์ ์ธ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด

- 17 -


์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ธฐ๊ณ„์™€ ๋…๋ฆฝ์ ์ธ ์ค‘๊ฐ„์ฝ”๋“œ(intermediate code)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ ํƒํ•˜์˜€๋‹ค.

์ด

์ค‘๊ฐ„์ฝ”๋“œ๋ฅผ

๋ฐ”์ดํŠธ

์ฝ”๋“œ(bytecode)๋ผ

ํ•˜๋ฉฐ,

์ด

์ฝ”๋“œ๋Š”

๊ฐ€์ƒ๊ธฐ๊ณ„(virtual

machine)๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ(interpreter) ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. Sun ์‚ฌ๋Š” UNIX ๊ธฐ๋ฐ˜ ์›Œํฌ์Šคํ…Œ์ด์…˜์ด ์ฃผ๋ ฅ ์ œํ’ˆ์ด๋ฏ€๋กœ ์ด๋“ค์€ C++ ์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํƒ„์ƒ๋œ ์–ธ ์–ด๊ฐ€ ์ž๋ฐ”์ด์ง€๋งŒ ์ฒ˜์Œ์—๋Š” ํฐ ๋ฐ˜์‘์„ ์–ป์ง€ ๋ชปํ•˜์˜€๋‹ค.

์ž๋ฐ” ์—ญ์‚ฌ โ€“ ๊ณ„์† WWW์˜ ๊ธ‰์„ฑ์žฅ Gosling ๋“ฑ์€ ์ด ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ 1995๋…„๋„์— HotJava๋ผ๊ณ  ํ•˜๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐœ๋ฐœํ•จ ์ด ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ฌ๋ฆฌ ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฟ (applet)์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์„ ์›น์—์„œ ๋‹ค์šด๋ฐ›์•„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ ์•ˆ์ „์„ฑ๊ณผ ์ด์‹์„ฑ์ด ์ค‘์š”ํ•œ ์ด์Šˆ ํ˜„์žฌ๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ์—์„œ๋„ ์ง€์› 1996๋…„: Sun Microsystems ์‚ฌ๋Š” ์ž๋ฐ”์˜ ์ฒซ ๋ฒ„์ „ ์ถœ์‹œ ์‹ค์ œ ์‘์šฉ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ์—๋Š” ๊ธฐ๋Šฅ์ด ๋ฏธํก 1998๋…„: Java 2 ์ถœ์‹œ ํ˜„์žฌ๋Š” J2SE(Core/Desktop), J2EE(Enterprise), J2ME(Mobile) ์„ธ ์ข…๋ฅ˜์˜ ๋ฒ„์ „์„ ์ œ๊ณต

์ž๋ฐ”๊ฐ€ ๊ฐœ๋ฐœ๋œ ์‹œ๊ธฐ๋Š” ์šฐ์—ฐํžˆ ์ธํ„ฐ๋„ท ํŠนํžˆ ์›”๋“œ์™€์ด๋“œ์›น(WWW, World Wide Web)์ด ํญ๋ฐœ ์ ์œผ๋กœ ๊ธ‰์„ฑ์žฅํ•œ ์‹œ๊ธฐ์™€ ์ผ์น˜ํ•˜์˜€๋‹ค. Gosling์€ ์ž์‹ ์ด ๊ฐœ๋ฐœํ•œ ์ž๋ฐ” ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ทธ ๋‹น ์‹œ๊นŒ์ง€๋Š” ์ƒ์ƒ์„ ํ•˜์ง€ ๋ชปํ•˜์˜€๋˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ์ด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฟ(applet)์ด๋ผ๊ณ  ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์›น์—์„œ ๋‹ค์šด๋ฐ›์•„ ์›น ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์‹ค ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๊ฐœ๋…์ด ํฐ ํ˜ธ์‘์„ ์–ป์—ˆ์œผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ์ž๋ฐ” ์–ธ์–ด๋„ ์ „์„ธ๊ณ„์ ์ธ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. ์ดํ›„ Sun์‚ฌ๋Š” 1996๋…„์— ์ž๋ฐ”์˜ ์ฒซ ๋ฒ„์ „์„ ๊ณต์‹œ์ ์œผ๋กœ ์ถœ์‹œํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ฒซ ๋ฒ„์ „์€ ๋†’์€ ์ˆ˜์ค€์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ๋ถ€์กฑํ•˜์˜€๋‹ค. 1998๋…„ Java 2๊ฐ€ ์ถœ ์‹œ๋˜๋ฉด์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์–ด๊นจ๋ฅผ ๋‚˜๋ž€ํžˆ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

- 18 -


2.3. ์ž๋ฐ”์˜ ํŠน์„ฑ

์ž๋ฐ”์˜ ์žฅ์  ๋‹จ์ˆœ: C++์—์„œ ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ ์ œ๊ฑฐ ์™„์ „ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด: C++๋ณด๋‹ค ๋” ์•ˆ์ „์„ฑ ํ–ฅ์ƒ(bug-free) ํƒ€์ž…์˜ ๊ฐ•์ œ์„ฑ ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ ์ œ๊ฑฐ ร† garbage collection ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ์ œ๊ฑฐ ํ• ๋‹น ์—ฐ์‚ฐ๊ณผ ๋น„๊ต ์—ฐ์‚ฐ ํ˜ผ๋™ ์ œ๊ฑฐ ๋‹ค์ค‘ ์ƒ์† ์ œ๊ฑฐ, ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋… ๋„์ž… ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ์ด์‹์„ฑ์ด ๋†’์Œ ํ•ด์„ ๊ธฐ๋ฐ˜(cf. ์ปดํŒŒ์ผ) ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ ์ง€์› ๋ถ„์‚ฐ ์ง€์›: TCP/IP ํ†ต์‹  ์ง€์›

์ž๋ฐ”๋Š” ๋งŽ์€ ์žฅ์ ์„ ์ง€๋‹Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ์ฒซ์งธ, ์ž๋ฐ”๋Š” C++๋ฅผ ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์–ธ ์–ด์ด์ง€๋งŒ C++์— ์กด์žฌํ•˜๋Š” ๋ชจํ˜ธํ•œ ๊ธฐ๋Šฅ ๋˜๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ณด๋‹ค ์‰ฝ ๊ฒŒ ๋ฐฐ์šฐ๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ๋‘˜์งธ, ์ž๋ฐ”๋Š” ์™„์ „ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๋‹ค.

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

์ž๋ฐ”์— ๋Œ€ํ•œ ์˜คํ•ด ์ž๋ฐ”๋Š” HTML์˜ ํ™•์žฅ์ด๋‹ค. ์ž๋ฐ”๋Š” ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ์ž๋ฐ”๋Š” ํ”„๋กœ๊ทธ๋žจํ•˜๊ธฐ ์‰ฌ์šด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. ์ž๋ฐ”๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์„ ์œ„ํ•œ ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ๋ชจ๋“  ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์›น ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค. ์ž๋ฐ” applet์€ ๋ณด์•ˆ์ ์œผ๋กœ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์˜ ๋‹จ์ˆœ ๋ฒ„์ „์ด๋‹ค.

๋ณดํ†ต ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์˜คํ•ด๋ฅผ ํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค. ์ž๋ฐ”๋Š” ์›น์— ์žˆ๋Š” ์• ํ”Œ๋ฆฟ์„ ํ†ตํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”๊ฐ€ HTML์˜ ํ™•์žฅ์œผ๋กœ ์˜คํ•ดํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”๋Š” ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ์›น๊ณผ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ๋„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”๋Š” ๋ฐฐ์šฐ๊ธฐ

- 19 -


์‰ฌ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค. ์ž๋ฐ”๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์— ๋น„ํ•ด ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ์‰ฌ์šด ์ธก๋ฉด๋„ ์žˆ์ง€๋งŒ ์ž๋ฐ”์ฒ˜๋Ÿผ ๊ฐ•๋ ฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์„ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งŽ์€ ๋…ธ ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค. ์ž๋ฐ”๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์‰ฌ์šด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ตœ ๊ทผ์— ์–ด๋Š ์ •๋„ ํ˜„์‹คํ™”๋˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดˆ์ฐฝ๊ธฐ์—๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ Visual ์–ธ์–ด๋“ค์ด ์ œ๊ณต ํ•˜๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ์—†์—ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์˜ ๋‹จ์ˆœ ๋ฒ„์ „์œผ๋กœ ์ƒ ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๋ฆ„๋งŒ ์œ ์‚ฌํ•  ๋ฟ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Š” Netscape ์‚ฌ์—์„œ ๊ฐœ๋ฐœํ•œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ด๋ฉฐ, ์ž๋ฐ”์™€ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์  ๊ตฌ์กฐ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด ๊ทธ๋“ค์ด ์ด๋ฆ„์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ช…๋ช…ํ•œ ๊ฒƒ์ผ ๋ฟ ์ž๋ฐ”์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค.

2.4. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

OOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ์ฒด(object)๋กœ ๊ตฌ์„ฑ๋จ ๊ฐ์ฒด ๊ฐ์ฒด๋Š” ํ–‰์œ„(behavior), ์ƒํƒœ(state), ์‹๋ณ„์ž(identity)๋ฅผ ๊ฐ€์ง ์บก์Šํ™”(encapsulation): ๋ฐ์ดํ„ฐ์™€ ํ–‰์œ„๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” donโ€™t care ํ•œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ๋Œ€ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š์Œ ํด๋ž˜์Šค(class) ํด๋ž˜์Šค ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„ ํด๋ž˜์Šค๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๋ฉฐ, ๋ฉค๋ฒ„๋ณ€์ˆ˜(member/instance variable, field, attribute)์™€ ๋ฉ”์†Œ๋“œ(method, member function)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํด๋ž˜์Šค ๊ฐ„์— ๊ด€๊ณ„: use, has-a(aggregation), is-a(generalization) ์ธ์Šคํ„ด์Šค(instance): ํด๋ž˜์Šค์˜ ํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค

์ž๋ฐ” ์–ธ์–ด๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ์ฒด๋“ค ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•œ๋‹ค. ๊ฐ์ฒด๋Š” ํ–‰์œ„, ์ƒํƒœ, ์‹๋ณ„์ž๋ฅผ ์ง€๋‹Œ๋‹ค. ๋ณด๋‹ค ์ค‘์š” ํ•œ ๊ฒƒ์€ ์ด์ „ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์—์„œ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์กด์žฌํ•˜์˜€ ์ง€๋งŒ ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฐ์‚ฐ์ด ๊ฒฐํ•ฉ๋˜์–ด ๊ฐ์ฒด๋ผ๋Š” ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ์™€ ํ–‰์œ„๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์บก์Šํ™”๋ผ ํ•œ๋‹ค. ๊ฐ์ฒด๋Š” ๊ทธ๊ฒƒ์ด ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์™€ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค. ์™ธ๋ถ€์—์„œ๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ ํ•„์š” ๊ฐ€ ์—†๋‹ค. ํด๋ž˜์Šค๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ด€์ ์—์„œ ๋ณด๋ฉด ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ๋ชจ์Šต์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” ํ‹€์ด๋‹ค. ํด๋ž˜์Šค๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํด๋ž˜์Šค ๊ฐ„์— ๊ด€๊ณ„ ๋Š” ํฌ๊ฒŒ ์‚ฌ์šฉ(use), ํฌํ•จ(has-a), ์ƒ์†(is-a) ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ๊ด€๊ณ„๋Š” ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ทธ์—๊ฒŒ ์ฃผ์–ด์ง„ ์ผ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ํฌํ•จ ๊ด€๊ณ„๋Š” ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์ƒ์† ๊ด€๊ณ„๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ณด๋‹ค ์ž์„ธํžˆ ์„ค๋ช…ํ•œ๋‹ค. ํด๋ž˜์Šค์˜ ํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค(instance)๋ผ ํ•œ๋‹ค.

- 20 -


OOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ƒ์†(inheritance): is-a ๊ด€๊ณ„ ์ƒ์† super/sub, base/derived, parent/child ์„ธ๋ถ„ํ™”(specialization), ์ผ๋ฐ˜ํ™”(generalization) ์žฌ์‚ฌ์šฉ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๊ด€๋ จ ํ‚ค์›Œ๋“œ: extends, super ์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์† ๊ณ„์ธต๊ตฌ์กฐ, ์ƒ์† ์ฒด์ธ ๋‹คํ˜•์„ฑ(polymorphism) ์—ฐ์‚ฐ์€ ๊ฐ์ฒด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ–‰์œ„๋ฅผ ํ•œ๋‹ค. (late binding) overloading cf. overriding

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

- 21 -


ํด๋ž˜์Šค ์„ค๊ณ„ ์š”๋ น ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ private ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ํด๋ž˜์Šค ๋‚ด์— ๊ธฐ๋ณธ ํƒ€์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ์˜ˆ) private String street; private Address addr;

private String city; private String state;

๋ชจ๋“  ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ์—ด๋žŒ์ž์™€ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ํ‘œ์ค€ ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. (ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ตฌ์„ฑ) ํด๋ž˜์Šค ์ด๋ฆ„: ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ: camel case ํ•œ ํด๋ž˜์Šค์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ฃผ๋Š” ๊ฒƒ์€ ํ”ผํ•˜๋ผ. ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์ ์ ˆํ•˜๊ฒŒ ๋ถ€์—ฌํ•˜๋ผ.

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

2.5. ์ž๋ฐ”์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•œ ์งˆ๋ฌธ ๋ชฉ๋ก

์งˆ๋ฌธ ์ž๋ฐ”๋Š” ์ฒ ์ž ๊ตฌ๋ถ„์„ ํ•˜๋Š”๊ฐ€? ํ•œ ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“) ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ํƒ€์ž…(์›์‹œ ํƒ€์ž…)์€? ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์„ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•˜๋ฉด? C์—์„œ int ํƒ€์ž…๊ณผ ์ž๋ฐ”์˜ int ํƒ€์ž…์˜ ์ฐจ์ด์ ์€? C์—์„œ char ํƒ€์ž…๊ณผ ์ž๋ฐ”์˜ char ํƒ€์ž…์˜ ์ฐจ์ด์ ์€? ์ง€์—ญ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“) ์ž๋ฐ”์—๋Š” ์—ด๊ฑฐํ˜• ํƒ€์ž…์ด ์žˆ๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“) ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ final์˜ final ์šฉ๋„๋Š”? for(int i=0; i<10; i++) {}์—์„œ i์˜ scope๋Š”? int n = 2.5; ๋ฌธ์žฅ์€ ์˜ค๋ฅ˜์ธ๊ฐ€?

- 22 -


์งˆ๋ฌธ &&, || ์—ฐ์‚ฐ์ž์™€ &, | ์—ฐ์‚ฐ์ž์˜ ์ฐจ์ด์ ์€? short-circuit evaluation์ด๋ž€? dangling-else ๋ฌธ์ œ๋ž€? switch ๋ฌธ์—์„œ โ€œfall throughโ€ ํ–‰์œ„๋ž€? new ์—ฐ์‚ฐ์ž์˜ ์šฉ๋„? ๋ฌธ์ž์—ด ์ƒ์„ฑ์˜ ํŠน์ดํ•œ ์ ์€? int[ ] nlist = new int[10]; int[ ] alist = nlist; alist[3]=2; ๊ทธ๋Ÿฌ๋ฉด nlist[3]? call-by-value์™€ call-by-reference์˜ ์ฐจ์ด์ ? garbage๋ž€, garbage collection์ด๋ž€?

]

์งˆ๋ฌธ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ๋ช…๋ฐฑํ•˜๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“) ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ข…๋ฅ˜? ๊ฐ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ์ดˆ๊ธฐ๊ฐ’์€? public, private, protected, default access specifier๋ž€? ์ƒ์„ฑ์ž(constructor) ๋ฉ”์†Œ๋“œ๋ž€? ์ƒ์„ฑ์ž์˜ ์ข…๋ฅ˜๋Š”? ๋ฉ”์†Œ๋“œ ์„œ๋ช…(method signature)์ด๋ž€? ์ˆจ๊ฒจ์ง„ ์ธ์ˆ˜(implicit argument)๋ž€? ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“) ์ˆ˜์ •์ž(mutator) ๋ฉ”์†Œ๋“œ์™€ ์—ด๋žŒ์ž(accessor) ๋ฉ”์†Œ๋“œ๋ž€? ๋‹ค๋ฅธ ๋ง๋กœ transformer, observer ๋ฉ”์†Œ๋“œ

- 23 -


์งˆ๋ฌธ public ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ์—ด๋žŒ์ž, ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ public ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š”? super ํ‚ค์›Œ๋“œ? super๋‚˜ this๋ฅผ ์ด์šฉํ•œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์˜ ์ œํ•œ์€? static ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ์˜ ์˜๋ฏธ? cf. ํด๋ž˜์Šค ๋ณ€์ˆ˜ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•œ๋‹ค. public static final int MAX = 100; ์—ฌ๊ธฐ์„œ public, static, final์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”? ํด๋ž˜์Šค B๊ฐ€ ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•˜์˜€๋‹ค. a๋Š” A์˜ ์ธ์Šคํ„ด์Šค์ด๊ณ , b๋Š” B์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค. a=b์™€ b=a ์ค‘ ์–ด๋Š ๊ฒƒ์ด ์œ ํšจํ•œ ๋ฌธ์žฅ์ธ๊ฐ€?

์งˆ๋ฌธ package๋ž€? ์–ด๋–ค ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•? ์ž๋ฐ” ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ import ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š”? import java.awt.*;์„ ์‚ฌ์šฉํ•˜๋ฉด java.awt ํŒจํ‚ค์ง€์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ํฌํ•จ๋œ๋‹ค. (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“)? instanceof ์—ฐ์‚ฐ์ž์˜ ๊ธฐ๋Šฅ์€? cf. getClass() ๋ฉ”์†Œ๋“œ abstract ๋ฉ”์†Œ๋“œ๋ž€, abstract ํด๋ž˜์Šค๋ž€? ๋ถˆ๋ณ€ ๊ฐ์ฒด(immutable object)๋ž€? Object ํด๋ž˜์Šค๋ž€? Wrapper ํด๋ž˜์Šค๋ž€? ์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ œ๊ณตํ•˜๋‚˜? interface๋ž€?, ๊ทธ๊ฒƒ์˜ ์šฉ๋„๋Š”? ๋‚ด๋ถ€(inner) ํด๋ž˜์Šค๋ž€?

- 24 -


์ œ3์žฅ ๋ฐฐ์—ด ์ด ์žฅ์—์„œ๋Š” ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ณตํ•ฉ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ธ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

3.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์ž๋ฐ” ๋ฐฐ์—ด ArrayList Vector

3.2. ๋ฐฐ์—ด

๋ฐฐ์—ด

z z z

์šฉ๋Ÿ‰: 10 ํฌ๊ธฐ: 3

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

๋ฐฐ์—ด์€ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๋ฐฐ์—ด์€ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฒซ์งธ, ๋™์งˆ๊ตฌ์กฐ์ด๋‹ค. ์ฆ‰, ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๊ฐ™์€ ํƒ€์ž…์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์ด๋ผ ํ•˜์—ฌ ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •์ˆ˜ ๋ฐฐ์—ด์— ์ฒซ ๋ฒˆ์งธ ์š”์†Œ

- 25 -


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

(capacity)์€ ๋ฐฐ์—ด์— ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ(size)๋Š” ํ˜„์žฌ ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋„ท์งธ, ๋ฐฐ์—ด์€ ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•œ๋‹ค. ์ƒ‰์ธ ์ •๋ณด๋งŒ ์žˆ์œผ๋ฉด ๋ฐฐ์—ด ๋‚ด์—์„œ ์š”์†Œ์˜ ์œ„์น˜์™€ ์ƒ๊ด€ ์—†์ด ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์šฉ๋Ÿ‰์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ผ์ฐจ์› ๋ฐฐ์—ด ์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์€ ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค. ์ผ์ฐจ์› ๋ฐฐ์—ด์˜ ์„ ์–ธ ์˜ˆ2.2) int[] numbers; // reference type C/C++์ฒ˜๋Ÿผ int numbers[];์™€ ๊ฐ™์ด ์„ ์–ธ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค๋ฅธ ์ฐธ์กฐ ํƒ€์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ new๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ2.3) numbers = new int[10]; C/C++์ฒ˜๋Ÿผ int numbers[10];๊ณผ ๊ฐ™์ด new๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค. ์„ ์–ธ๊ณผ ์ƒ์„ฑ์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.4) int[] numbers = new int[10]; new๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐ๊ฐ’์€? ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์€ ์ฐธ์กฐ ํƒ€์ž…์œผ๋กœ์„œ new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ๋‹ค. ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ์—๋Š” ๋ฐฐ์—ด์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด โ€˜[]โ€™์„ ํƒ€์ž…๋ช… ๋˜๋Š” ๋ฐฐ์—ด๋ช… ๋’ค์— ์ฒจ๊ฐ€ํ•œ๋‹ค. ๋ณดํ†ต ํƒ€์ž…๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด ๋ฅผ ํ•œ ๊ณณ์—์„œ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…๋ช… ๋’ค์— ์ฒจ๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์ดˆ๊ธฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๋ชจ๋“  ์š”์†Œ์˜ ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

- 26 -


์ผ์ฐจ์› ๋ฐฐ์—ด โ€“ ๊ณ„์† ๋ฐฐ์—ด์˜ ์š”์†Œ ์ ‘๊ทผ: [] ์—ฐ์‚ฐ์ž ์ด์šฉ ์˜ˆ2.5) numbers[2] = 5; value = numbers[i]; ์ƒ‰์ธ๊ฐ’์ด 0์—์„œ 9์‚ฌ์ด์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ฉด ์ž๋ฐ”๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์˜ˆ์™ธ: ArrayIndexOutofBoundException ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์€ public ๋ฉค๋ฒ„๋ณ€์ˆ˜์ธ length๋ฅผ ์ด์šฉํ•œ๋‹ค. ์˜ˆ2.6) numbers.length ์‚ฌ์šฉ์ž๋Š” ์ด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ2.7) numbers.length = 10; ๋น„๊ณ . ๋น„๊ณ . String์—์„œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” length() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉ numbers length

5/22

์ž๋ฐ”์—์„œ ๊ฐ ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” []

์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผํ•œ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒ‰์ธ ๊ฐ’์„ ์‚ฌ์šฉ

ํ•˜๋ฉด ArrayIndexOutofBoundException์ด๋ผ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์€ ํ•ญ์ƒ

length๋ผ๋Š” public ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉด ์ด ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด ๊ทธ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ๋งค ๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ์ ์œผ๋กœ String ํƒ€์ž…์—์„œ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜ ๊ฐ€ ์•„๋‹Œ length()๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ผ์ฐจ์› ๋ฐฐ์—ด โ€“ ๊ณ„์† ์ดˆ๊ธฐ๊ฐ’์„ ์ œ๊ณตํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.8) int[] numbers = new int[] {5, 7, 4, 3, 10, 22, -6, -3}; ์ด ๋•Œ numbers์˜ ์šฉ๋Ÿ‰์€ 8์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด new int[] ๋ถ€๋ถ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.9) int[] numbers = {5, 7, 4, 3, 10, 22, -6, -3}; ๋Œ€์ž…๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ดˆ๊ธฐ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค. int[] age = {2, 12, 10}; ์ด ํ˜•ํƒœ๊ฐ€ ๋” ํšจ์œจ์ 

int[] age = new int[3]; age[0] = 2; age[1] = 12; age[2] = 10;

์˜ˆ2.8) int[] numbers = new int[8] {5, 7, 4, 3, 10, 22, -6, -3};

6/22

๋ฐฐ์—ด์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ œ๊ณตํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๋•Œ new ์—ฐ์‚ฐ์ž์˜ ์‚ฌ์šฉ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ๊ฐ’ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ๋Œ€์ž…๋ฌธ์„ ์ด์šฉํ•˜ ์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ดˆ๊ธฐ๊ฐ’ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ˆ๋ฌด ํฐ ๋ฐฐ์—ด ์€ ์ดˆ๊ธฐ๊ฐ’์„ ๋ชจ๋‘ ๋‚˜์—ดํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

- 27 -


๋ฌธ์ž ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด ๋ฌธ์ž ๋ฐฐ์—ด์€ String ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค. ์˜ˆ2.10)

void f1(String s){ โ€ฆ } void f2(){ char[] fruit = {โ€˜aโ€™, โ€˜pโ€™, โ€˜pโ€™, โ€˜lโ€™, โ€˜eโ€™}; String s = fruit; // error f1(fruit); // error }

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ž ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.11) char[] fruit = {โ€˜aโ€™, โ€˜pโ€™, โ€˜pโ€™, โ€˜lโ€™, โ€˜eโ€™}; String s1 = new String(fruit); String s2 = new String(fruit, 2, 3);

์ด ์ฒ˜๋Ÿผ String๋„ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณดํ†ต new๋ฅผ ์ƒ๋žตํ•œ๋‹ค. ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

// ok // ok โ€œpleโ€

๋ฌธ์ž ๋ฐฐ์—ด์€ ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.12) char[] fruit = {โ€˜aโ€™, โ€˜pโ€™, โ€˜pโ€™, โ€˜lโ€™, โ€˜eโ€™};

๊ฒฐ๊ณผ: apple

System.out.println(fruit);

7/22

C/C++์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ”์—์„œ๋„ ๋ฌธ์ž ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์€ ๊ตฌ๋ถ„๋œ๋‹ค. ์ฆ‰, ๋ฌธ์ž ๋ฐฐ์—ด์€ String ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ž ๋ฐฐ์—ด์„ ์‰ฝ๊ฒŒ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ์ž ๋ฐฐ ์—ด์€ ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ2.11์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ

String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณดํ†ต String ๊ฐ์ฒด๋Š” new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•œ๋‹ค.

๋ฐฐ์—ด์˜ ๋ณต์‚ฌ numbers ๋‘ ๋ฐฐ์—ด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ํƒ€์ž…์ด๋ฉด ์ƒํ˜ธ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.13) int[] numbers = {1, 2, 3, 4}; int[] values = numbers; values๋Š” numbers์™€ ๊ฐ™์€ ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. values ํ•œ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋‹ค๋ฅธ ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด System.arraycopy ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ์˜ˆ2.14) int[] numbers = {1,2,3,4,5}; int[] values = {11,12,13,14,15}; System.arraycopy(numbers,0,values,2,3);

numbers

1 2 3 4 5

values

11 12 13 14 15

numbers

1 2 3 4 5

values

System.arraycopy(์†Œ์Šค๋ฐฐ์—ด, ์†Œ์Šค๋ฐฐ์—ด์˜ ์‹œ์ž‘์œ„์น˜, ๋ชฉ์ ๋ฐฐ์—ด, ๋ชฉ์ ๋ฐฐ์—ด์˜ ์‹œ์ž‘์œ„์น˜, ๋ณต์‚ฌํ•  ์š”์†Œ์˜ ๊ฐœ์ˆ˜)

1 2 3 4

11 12 1 2 3

8/22

์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ C/C++์ฒ˜๋Ÿผ ์ƒ์ˆ˜ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ํƒ€์ž…์˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด ๋ณ€์ˆ˜๋ฅผ = ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋Œ€์ž…์€ ๊ฐ’๋“ค์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์ด ์•„ ๋‹ˆ๋ผ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด์ด ๋‹ฌ๋ผ์งˆ ๋ฟ์ด๋‹ค. ๋ฐฐ์—ด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์˜ ๋ณ€ํ™” ์—†์ด ์–ด๋–ค ๋ฐฐ์—ด์˜ ๊ฐ’๋งŒ์„ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ž๋ฐ”์—์„œ๋Š” System ํด๋ž˜์Šค์˜ arraycopy ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

- 28 -


ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐฐ์—ด์˜ ์ „๋‹ฌ ์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์€ ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ์ธ์ž๋กœ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ๋ฐฐ์—ด์„ ์กฐ์ž‘ํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚œ ํ›„์—๋„ ์กฐ์ž‘ ๊ฒฐ๊ณผ๊ฐ€ ๊ณ„์† ์œ ์ง€๋œ๋‹ค. void f1(int[] a){ ์˜ˆ2.15) a[2] = 10; ๊ฒฐ๊ณผ: 1,2,10,4 } void f2(){ int[] A = {1,2,3,4}; f1(A); void f1(int[] a){ for(int i=0; i<4; i++) int[] B = {5,6,7,8}; System.out.println(A[i]); a = B; ๊ฒฐ๊ณผ: 1,2,3,4 } }

ํ•˜์ง€๋งŒ ์ด ์—ญ์‹œ call-by-value ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ2.16)

void f2(){ int[] A = {1,2,3,4}; f1(A); for(int i=0; i<4; i++) System.out.println(A[i]); } 9/22

์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ๋‚ด ์—์„œ ๋ฐฐ์—ด์„ ์กฐ์ž‘ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚œ ํ›„์—๋„ ๊ณ„์† ์œ ์ง€๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š”

call-by-value ๋ฐฉ์‹๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฐฐ์—ด ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ณ€ ๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค.

Call-by-value์™€ ์ฐธ์กฐ ๋ณ€์ˆ˜ public class A{ private int value; public void set(int n) { value = n; } public int get() { return value; } } // class A public class B{ public static void f(A b){ A c = new A(); b.set(10); b = c; } // f public static void main(String[] args){ A a = new A(); a.set(5); f(a); System.out.println(a.get()); } // main ๊ฒฐ๊ณผ: 10 } // class B

a

value v 10 5

b

c value

v

10/22 10/22

์ด ์Šฌ๋ผ์ด๋“œ์˜ ์˜ˆ์—์„œ๋Š” call-by-value์™€ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š”

call-by-value ๋ฐฉ์‹์˜ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ๋ฒ•๋งŒ ์ œ๊ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ swap ๋ฉ”์†Œ๋“œ๋Š” ์ž๋ฐ”์—์„œ๋Š” ์ ˆ๋Œ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ฐธ์กฐ ํƒ€์ž… ๊ฐœ๋…์— ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ€ ๋งˆ์น˜ call-by-reference๋กœ ์ „๋‹ฌํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. f2() ๋ฉ”์†Œ๋“œ์—์„œ a๋ผ๋Š” ๊ฐ์ฒด๋Š” a.set(5) ๋•Œ๋ฌธ์— a์˜ value ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’์ด 5๊ฐ€ ๋œ๋‹ค. ์ด ๊ฐ์ฒด๋ฅผ f1() ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜๋ฉด a๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ f1์—์„œ

b๋Š” a์™€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋ฉฐ, b.set(10) ๋•Œ๋ฌธ์— a์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’์€ 10์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋‹ค. ํ•˜์ง€๋งŒ call-by-value ๋ฐฉ์‹์ด๋ฏ€๋กœ b = c์— ์˜ํ•ด b๊ฐ€ c๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋”๋ผ๋„ a์—๋Š” ์˜ํ–ฅ ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

- 29 -


๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋ฐฐ์—ด์„ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ2.17) int[] doubeTheSize(int[] a){ 2 int[] b = new int[a.length*2]; 3 System.arraycopy(a,0,b,0,a.length); 4 return b; void f(){ } int[] A = {1,2,3,4}; 1 2 5 A = doubleTheSize(A); A[4] = 5; 6 b for(int i=0; i<5; i++) System.out.println(A[i]); } 3

a

A 1 2

5

1 2

4

3 4

1

2

3

4

1

2

3

4

6

5 11/22 11/22

๋ฐฐ์—ด์„ ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด์„ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ ๋‹ค. ์˜ˆ2.7์—์„œ๋Š” doubleTheSize ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์„ ๋‘ ๋ฐฐ๋กœ ํ™•์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ฒฐ์ •๋˜์–ด ๊ณ ์ •๋˜๋ฏ€๋กœ ๊ธฐ์กด ๊ณต๊ฐ„์„ ๋‘ ๋ฐฐ๋กœ ํ™•์žฅํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์š”ํ•œ ์šฉ๋Ÿ‰์˜ ๊ณต๊ฐ„์„ ์ƒˆ๋กญ๊ฒŒ ํ™•๋ณดํ•œ ๋‹ค์Œ, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , ๋ฐฐ์—ด ์ด๋ฆ„์„ ์ƒˆ๋กญ๊ฒŒ ํ™•๋ณดํ•œ ๊ณต๊ฐ„์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด ๋ฐฐ์—ด ์˜ˆ2.18) Circle[] allCircles = new Circle[5]; Circle ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ 5๊ฐœ๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋œ๋‹ค. 5๊ฐœ์˜ Circle ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐ ํ•ญ์€ null๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๊ฐ ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋ฉด ์ถ”๊ฐ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. for(int i=0; i<allCircles.length; i++){ allCircles[i] = new Circle(); }

12/22 12/22

์›์‹œ ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํด๋ž˜์Šค ํƒ€์ž…์˜ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์˜€๋‹ค๊ณ  ํ•˜์—ฌ ๊ทธ ๋งŒ ํผ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด ์Šฌ๋ผ์ด๋“œ์˜ ์˜ˆ์ฒ˜๋Ÿผ Circle[] allCircles = new

Circle[5]์„ ํ•˜๊ฒŒ ๋˜๋ฉด 5๊ฐœ์˜ Circle ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Circle ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ 5๊ฐœ๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋•Œ ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ์€ null ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

- 30 -


final๊ณผ ๋ฐฐ์—ด ์˜ˆ2.19)

void f(){ final int[] numbers = new int[5]; numbers[3] = 4; // ok numbers = new int[3]; // error }

final int[] numbers = new int[5]์—์„œ final์€ numbers์™€ ์—ฐ๊ด€์ด ์žˆ๋Š” ๊ฒƒ์ด์ง€ ๋ฐฐ์—ด ์ž์ฒด์™€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„๋งŒ final

13/22 13/22

์ž๋ฐ”์—์„œ final์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” ์ฃผ๋กœ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ’์ด 10์ธ ์ƒ์ˆ˜ ์ •์ˆ˜ ๋ณ€์ˆ˜๋Š” ์ž๋ฐ”์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•œ๋‹ค.

public static final int CAPACITY = 10; ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด ์ด๋ฆ„ ์ž์ฒด๊ฐ€ final์ด ๋˜์–ด ๋ฐฐ์—ด์˜ ์ด๋ฆ„์ด ๊ฐ€ ๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์ง€๋งŒ ๋ฐฐ์—ด ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ์—ฌ์ „ํžˆ ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ์˜ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์ฐจ์› ๋ฐฐ์—ด 2์ฐจ์› ๋ฐฐ์—ด์€ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์˜ ์„ ์–ธ ์˜ˆ2.20) double[][] alpha = new double[100][10]; ์ฒซ ๋ฒˆ์งธ [100]์€ ํ–‰์„ ๋‘ ๋ฒˆ์งธ [10]์€ ์—ด์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ ‘๊ทผ alpha[0][5] = 36.4; ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜ ํ–‰์˜ ๊ฐœ์ˆ˜: alpha.length ์—ด์˜ ๊ฐœ์ˆ˜: alpha[i].length

14/22 14/22

์ž๋ฐ”๋„ ๋‹ค๋ฅธ ์ผ๋ฐ˜ ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ 2์ฐจ์› ์ด์ƒ์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค. ๋˜ํ•œ ์ž๋ฐ”์—์„œ

2์ฐจ์› ๋ฐฐ์—ด์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ 2์ฐจ์› ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ํ•œ ๊ฐ€์ง€ ๋…ํŠนํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ 2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์˜ ์šฉ๋Ÿ‰์€ ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

- 31 -


๋‹ค์ฐจ์› ๋ฐฐ์—ด โ€“ ๊ณ„์† ์ผ๋ฐ˜์ ์œผ๋กœ 2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์˜ ์šฉ๋Ÿ‰์€ ๊ฐ™๋„๋ก ๋งŒ๋“ ๋‹ค. ์˜ˆ2.21) int[][] a = new int[10][5]; ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ํ–‰์˜ ์šฉ๋Ÿ‰์ด ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ2.22) int[][] a = new int[2][]; a[0] = new int[5]; a[1] = new int[3];

15/22 15/22

3.3. ArrayList ArrayList๋Š” java.util ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ์„œ, ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์šฉ๋Ÿ‰ ์ด ๋ถ€์กฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€๋œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ž๋ฐ” 1.2๋ถ€ํ„ฐ ์ œ๊ณต๋œ ํด๋ž˜์Šค์ด๋ฉฐ, ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ArrayList ArrayList๋Š” java.util ํŒจํ‚ค์ง€์— ์ •์˜๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋กœ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์šฉ๋Ÿ‰์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ์•Š๋‹ค ์ฆ‰, ํ•„์š”์— ๋”ฐ๋ผ ์šฉ๋Ÿ‰์ด ๋ณ€ํ•œ๋‹ค. ArrayList๋Š” size() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์€ ํŠน์ • ํƒ€์ž…์„ ์ €์žฅํ•˜๋„๋ก ์„ ์–ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ArrayList๋Š” Object ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฐธ์กฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.) ๋”ฐ๋ผ์„œ ์›์‹œ ํƒ€์ž…์€ wrapper ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ’์„ ArrayList์˜ ์š”์†Œ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ int[] a = new int[10]; a[0] = 3; a[1] = 2.5; // error

ArrayList a = new ArrayList(); a.add(new Integer(10)); a.add(new Double(2.5)); ๋ฐ”๋žŒ์งํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์€ ์•„๋‹ˆ๋‹ค.

ArrayList๋Š” ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ ํŠน์ • ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ํ•„์š”ํ•œ ์–ด๋–ค ์ข…๋ฅ˜ ์˜ ๋ฐ์ดํ„ฐ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ Object ๋ฐฐ์—ด์„ ์ด์šฉํ•œ๋‹ค. ์ƒ์† ๊ด€๊ณ„์—์„œ ์ž์† ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ์กฐ์ƒ ํด๋ž˜์Šค ๊ฐ์ฒด ํƒ€์ž…์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์—์„œ Object ํด๋ž˜์Šค๋Š” ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ int,

double๊ณผ ๊ฐ™์€ ์›์‹œ ํƒ€์ž…์€ Object ํƒ€์ž…์— ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์œ„ํ•ด ์ž๋ฐ”๋Š” Wrapper ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Wrapper ํด๋ž˜์Šค๋Š” ์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ ๋Š” ํด๋ž˜์Šค์ด๋‹ค. Object ๋ฐฐ์—ด์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์€ ๋ฐฐ์—ด์˜ ๋™์งˆ ๊ตฌ์กฐ ํŠน์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๋Š”

- 32 -


๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์ฆ‰, ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ”์™€ ๊ฐ™์ด ๊ฐ ํ•ญ์— ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

ArrayList โ€“ ๊ณ„์† ArrayList๋Š” ํด๋ž˜์Šค์ด๋ฉฐ, ์ž๋ฐ”๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ [ ] ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ArrayList๋„ ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ‰์ธ์„ ์ด์šฉํ•˜์—ฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ‰์ธ์˜ ์‹œ์ž‘์€ ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 0์ด๋‹ค. add()์™€ get() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. void add(Object element): ๋งจ ๋์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. void add(int index, Object element): ์ฃผ์–ด์ง„ ์ƒ‰์ธ ์œ„์น˜์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋•Œ ์ƒ‰์ธ ์œ„์น˜์— ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ทธ ์š”์†Œ๋ถ€ํ„ฐ ๋ชจ๋“  ์š”์†Œ๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ด๋™๋œ๋‹ค. Object get(int index): ์ƒ‰์ธ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ index๊ฐ€ ์œ ํšจํ•œ ์ƒ‰์ธ(0โ‰คindex<size())์ด ์•„๋‹ˆ๋ฉด IndexOutOfBoundsException์„ ๋ฐœ์ƒํ•œ๋‹ค.

ArrayList๋Š” ์ž๋ฐ” ์ž์ฒด์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณต ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. ๋˜ํ•œ ์ž๋ฐ”๋Š” C++ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ [] ์—ฐ์‚ฐ์ž ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ณ„ ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹ ์— add, get์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ณ„ ์š” ์†Œ์— ์ ‘๊ทผํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ‰์ธ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์ƒ‰์ธ์€ ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด

0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ArrayList๋Š” ์‚ฝ์ž…๋œ ์š”์†Œ๋“ค์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ €์žฅํ•œ๋‹ค. ์ฆ‰, ์ค‘๊ฐ„์— ๋นˆ ํ•ญ ์ด ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ add ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์–ด์ง„ ์š”์†Œ๋ฅผ ๋งจ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค. ์ด ๊ฒƒ์€ ๊ธฐ์กด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ €๋ ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ArrayList โ€“ ๊ณ„์† ํ•ญ์ƒ ArrayList์˜ ์˜ค๋ฅธ์ชฝ์€ ๋น„์–ด์žˆ๋‹ค. (์™ผ์ชฝ์ •๋ ฌ ๋ฐฉ์‹) ์ค‘๊ฐ„์— ๋นˆ ์Šฌ๋กฏ์ด ์žˆ์„ ์ˆ˜ ์—†๋‹ค. ์—†๋‹ค Object set(int index, Object element): ์ƒ‰์ธ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ๋˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์ด์ „์— ๊ทธ ์œ„์น˜์— ์žˆ๋˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ index๊ฐ€ ์œ ํšจํ•œ ์ƒ‰์ธ์ด ์•„๋‹ˆ๋ฉด IndexOutOfBoundsException์„ ๋ฐœ์ƒํ•œ๋‹ค. Object remove(int index): ์ƒ‰์ธ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๊ทธ ๋’ค ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ํ•˜๋‚˜์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๋˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์‚ญ์ œํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ index๊ฐ€ ์œ ํšจํ•œ ์ƒ‰์ธ์ด ์•„๋‹ˆ๋ฉด IndexOutOfBoundsException์„ ๋ฐœ์ƒํ•œ๋‹ค. void trimToSize(): ArrayList์˜ ์šฉ๋Ÿ‰์„ ํ˜„์žฌ์˜ ํฌ๊ธฐ๋กœ ์ถ•์†Œํ•œ๋‹ค.

add์™€ get ๋ฉ”์†Œ๋“œ ์™ธ์— ArrayList๋Š” set, remove์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. set์€ ์ฃผ์–ด์ง„ ์ƒ‰์ธ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ฃผ์–ด์ง„ ์š”์†Œ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด๊ณ , remove๋Š” ์ฃผ์–ด์ง„ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

- 33 -


ArrayList โ€“ ๊ณ„์† add/remove ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์  add๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ remove๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ ํฌ๊ธฐ๊ฐ€ ์šฉ๋Ÿ‰๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ๋ณด๋‹ค ํฐ ์šฉ๋Ÿ‰์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— ๊ธฐ์กด ๋ฐฐ์—ด์—์„œ ์š”์†Œ๋“ค์„ ๋ณต์‚ฌํ•œ๋‹ค. get ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์  ๋ฐ˜ํ™˜ํƒ€์ž…์ด Object์ด๋ฏ€๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ArrayList์˜ ์ƒ์„ฑ์ž ArrayList() : ์šฉ๋Ÿ‰์ด 10์ธ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ArrayList(int capacity): ์ฃผ์–ด์ง„ ์ธ์ž์— ํ•ด๋‹นํ•˜๋Š” ์šฉ๋Ÿ‰์˜ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ArrayList๋Š” ์ค‘๊ฐ„์— ๋นˆ ํ•ญ์ด ์กด์žฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ add ๋˜๋Š” remove ๋ฉ”์†Œ๋“œ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ชจ๋‘ ํ•˜๋‚˜์”ฉ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. add ์˜ ๊ฒฝ์šฐ ๋งจ ์ฒซ ํ•ญ์— ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์ด๊ณ , remove๋„ ๋งจ ์ฒซ ํ•ญ์— ์žˆ ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์ด๋‹ค. ๋˜ํ•œ get, set, remove ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด

Object์ด๋ฏ€๋กœ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ๊ฐ์ฒด๋Š” ์›๋ž˜์˜ ํƒ€์ž…์œผ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•œ ํ›„์— ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ˜๋ณต์ž ArrayList๋Š” ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฐ˜๋ณต์ž๋ž€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งํ•œ๋‹ค. ๋ฐ˜๋ณต์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ๋‘ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค. boolean hasNext(): ๋” ์ด์ƒ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ Object next(): ๋‹ค์Œ ์š”์†Œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ์˜ˆ2.23) void printVector(ArrayList list){ Iterator i = list.iterator(); while(i.hasNext()){ System.out.println(i.next()); } }

20/22 20/22

์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ˜๋ณต์ž(iterator)๋ผ๋Š” ๋ฉ”์†Œ๋“œ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ค€๋‹ค. ๋ฐ˜๋ณต์ž๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜๋ณต ์ž ๊ฐ์ฒด๋Š” hasNext(), next() ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ค€๋‹ค. hasNext() ๋ฉ”์†Œ๋“œ๋Š” ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋ฉฐ, ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฐธ์„ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ ์—๋Š” next() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. Iterator๋Š” java.util ํŒจํ‚ค์ง€์— ์ •์˜ ๋˜์–ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

- 34 -


๋‹จ์ˆœ ๋ฐฐ์—ด vs. ArrayList ๋‹จ์ˆœ ๋ฐฐ์—ด ๊ณต๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์š”๊ตฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๋งˆ๋‹ค ํฌ๊ฒŒ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ์˜ ์œ„์น˜๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

ArrayList ๊ณต๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์š”๊ตฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๋งˆ๋‹ค ํฌ๊ฒŒ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ทน๋‹จ์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ์˜ ์œ„์น˜๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ/์‚ฝ์ž…์ด ๋Œ€๋ถ€๋ถ„ ๋์— ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ

ArrayList๋Š” ์ผ๋ฐ˜ ๋‹จ์ˆœ ๋ฐฐ์—ด์— ๋น„ํ•ด ์šฉ๋Ÿ‰์— ์ œํ•œ์ด ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ํ˜„์žฌ ์šฉ๋Ÿ‰์ด ๊ฝ‰ ์ฐจ ์šฉ๋Ÿ‰์„ ๋Š˜๋ ค์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” ๋งŽ์€ ๋น„์šฉ์ด ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ๋ฐฐ์—ด ๋Œ€์‹ ์— ArrayList๋ฅผ ์‚ฌ์šฉํ•˜ ๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค. ์ฆ‰, ๊ณต๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์„ ๋‹จ์ˆœ ๋ฐฐ์—ด๋กœ ํ™• ๋ณดํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ๋ฉด์—์„œ ArrayList๋ณด๋‹ค ์ข‹๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์š”๊ตฌ ๋˜๋Š” ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ArrayList๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ๊ทธ๋žจ ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ทน๋‹จ์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹จ์ˆœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

Vector java.util ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ArrayList์™€ ๊ทธ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ Vector๋Š” ๋‹ค์ค‘์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ  ArrayList๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์ค‘์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ฉด Vector ๋Œ€์‹ ์— ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ArrayList์™€ ๋‹ฌ๋ฆฌ capacity() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์šฉ๋Ÿ‰์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. Vector์— ๋” ์ด์ƒ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ์ง€์ •ํ•ด ๋†“์€ ์šฉ๋Ÿ‰๋งŒํผ ๋˜๋Š” ๊ธฐ๋ณธ ์ฆ๊ฐ€ ์šฉ๋Ÿ‰๋งŒํผ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ธฐ๋ณธ ์ฆ๊ฐ€ ์šฉ๋Ÿ‰์€ ํ˜„์žฌ ์šฉ๋Ÿ‰์˜ ๋‘ ๋ฐฐ์ด๋‹ค. Vector() Vector(int capacity) ์ฆ๊ฐ€ํ•˜๋Š” ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด์•ผ ํ•œ๋‹ค. Vector(int capacity, int increment)

Vector ํด๋ž˜์Šค๋Š” java.util ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ArrayList์™€ ์œ ์‚ฌํ•œ ํด๋ž˜์Šค๋กœ์„œ, ์ด ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์˜ ์ดˆ๊ธฐ ๋ฒ„์ „๋ถ€ํ„ฐ ์ œ๊ณต๋œ ํด๋ž˜์Šค์ด๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋˜ํ•œ ArrayList์™€ ๋‹ฌ๋ฆฌ ๋‹ค์ค‘์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Vector๋Š” ํ˜„์žฌ ์šฉ๋Ÿ‰์ด ๊ฝ‰ ์ฐผ์„ ๋•Œ ์ฆ๊ฐ€ํ•˜๋Š” ์ •์ฑ…์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 35 -


์ œ4์žฅ ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ ์ด ์žฅ์—์„œ๋Š” ์ž๋ฐ”๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ์  ๊ณผ ๊ทธ๊ฒƒ์˜ ํ•ด๊ฒฐ์ฑ…์„ ์‚ดํŽด๋ณธ๋‹ค.

4.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ Object ํด๋ž˜์Šค equals ๋ฉ”์†Œ๋“œ clone ๋ฉ”์†Œ๋“œ Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ compareTo ๋ฉ”์†Œ๋“œ ๋ณต์‚ฌ ๋ฐฉ์‹ vs. ์ฐธ์กฐ ๋ฐฉ์‹ clone ๋ฉ”์†Œ๋“œ Listable ์ธํ„ฐํŽ˜์ด์Šค

4.2. ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ

๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ โ€“ ๊ฐœ์š” (1) ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€ ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ3.1) Point ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” PointList ADT๋Š” ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ž๋ฐ”์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋•Œ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Object ํด๋ž˜์Šค์ด๋‹ค. ํด๋ž˜์Šค Object ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋ฉฐ, ๋ช…๋ฐฑํ•˜๊ฒŒ ๋ถ€๋ชจ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ๋Š” ํ•ญ์ƒ ์ž๋™์œผ๋กœ Object ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. ๊ฐ์ฒด๋Š” ๊ทธ๊ฒƒ์˜ ์กฐ์ƒ ํด๋ž˜์Šค ํƒ€์ž… ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” Object ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€ ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค. 2์žฅ์—์„œ ์‚ดํŽด๋ณธ

ArrayList ํด๋ž˜์Šค๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์ด์ง€๋งŒ ์‹ค์Šต 3์—์„œ ๊ตฌํ˜„ํ•œ

- 37 -


Point ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” PointList ADT๋Š” ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค. ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Object ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ๋ช…๋ฐฑํ•˜๊ฒŒ ๋ถ€๋ชจ ํด ๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Object ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Object ํด๋ž˜์Šค๋Š” ์ž ๋ฐ”์—์„œ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋‹ค. ์ด ๋•Œ๋ฌธ์— ์ด ํƒ€์ž…์˜ ๋ณ€์ˆ˜์—๋Š” ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ์ฒด๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ โ€“ ๊ฐœ์š” (2) Object ํƒ€์ž…์„ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„์˜ ๋ฌธ์ œ์  ๋ฌธ์ œ์  1. ์›์‹œํƒ€์ž…์€ Object ํƒ€์ž…์— ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ํ•ด๊ฒฐ์ฑ…. ํ•ด๊ฒฐ์ฑ…. Wrapper ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌธ์ œ์  2. ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค ๊ทธ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ์š”์†Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ3.2) ์ •๋ ฌ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์ €์žฅ๋˜๋Š” ๋‘ ์š”์†Œ์˜ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•จ. ์˜ˆ3.3) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ณต์‚ฌ ๋ฐฉ์‹ ๋˜๋Š” ์ฐธ์กฐ ๋ฐฉ์‹ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๋ณต์‚ฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•จ Object ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. Object ํƒ€์ž…์— ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ Object ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์ฒซ์งธ, ์›์‹œํƒ€์ž… ์€ Object ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, Object ํƒ€์ž… ๋ณ€์ˆ˜์— Rectangle, Student๊ณผ ๊ฐ™ ์€ ํด๋ž˜์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋“ค์€ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ int, double๊ณผ ๊ฐ™์€ ์›์‹œํƒ€์ž…์€ ์ €์žฅํ•  ์ˆ˜ ์—† ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ์ง€๋งŒ ์ด ๋ฌธ์ œ์ ์€ Wrapper ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ, ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ ๋‹ค ๊ทธ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ์š”์†Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค ์–ด ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ €์žฅ๋˜๋Š” ์š”์†Œ๋“ค์ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„œ๋Š” ๋‘ ์š”์†Œ์˜ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์—์„œ๋Š” ํ•œ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋Š” ๊ทธ ํƒ€์ž…์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Object ํƒ€์ž…์˜ ๋ณ€์ˆ˜์ด๋ฉด

Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์ž‡๋Š” ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ ํ•ด Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๊ฐ€ ์–ด๋ ต ๋‹ค. ์ด ์žฅ์—์„œ๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

- 38 -


4.3. Object ํด๋ž˜์Šค

Object ํด๋ž˜์Šค ์ž๋ฐ”์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋ช…๋ฐฑํ•˜๊ฒŒ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž๋™์œผ๋กœ Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ƒ์† ๊ณ„์ธต๊ตฌ์กฐ ์ƒ์—์„œ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋‹ค. Object ํด๋ž˜์Šค๋Š” toString, equals, clone๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ์ค‘ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” equals์™€ clone์ด๋‹ค. equals ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. clone ๋ฉ”์†Œ๋“œ๋Š” ์ƒํƒœ๊ฐ€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜(override)ํ•˜์ง€ ์•Š์œผ๋ฉด Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์ž๋ฐ”์—์„œ Object ํด๋ž˜์Šค๋Š” ์ƒ์† ๊ณ„์ธต๊ตฌ์กฐ ์ƒ์—์„œ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋‹ค. ์–ด๋–ค ํด๋ž˜ ์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ช…๋ฐฑํ•˜๊ฒŒ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ Object ํด๋ž˜์Šค๊ฐ€ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. Object ํด๋ž˜์Šค๋Š” toString, equals, clone์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ๋ฉ”์†Œ๋“œ ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ์ค‘์— equals์™€ clone์€ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค. equals ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๊ณ , clone์€ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด ๋ฅผ ๋ณต์ œํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜(override)ํ•˜์ง€ ์•Š์œผ๋ฉด Object ํด๋ž˜์Šค ์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”๋ฐ, Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ์ด๋“ค ๋ฉ”์†Œ๋“œ๋Š” ๋ณด ํ†ต ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค.

equals ๋ฉ”์†Œ๋“œ Object์˜ equals ๋ฉ”์†Œ๋“œ์˜ ๋ฌธ์ œ์  Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ: ๋‘ ๊ฐ์ฒด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” equals์˜ ํšจ๊ณผ๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ Object์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ณดํ†ต ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ณดํ†ต ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ฉ”์†Œ๋“œ๋Š” ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

equals ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด์ง€๋งŒ Object์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์› ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

- 39 -


clone ๋ฉ”์†Œ๋“œ Object์˜ clone ๋ฉ”์†Œ๋“œ์˜ ๋ฌธ์ œ์  Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” clone ๋ฉ”์†Œ๋“œ: ์ด ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ธ์Šคํ„ด์Šค ํ•„๋“œ์˜ ๊ฐ’์„ ์ž๋™์œผ๋กœ ๋ณต์‚ฌํ•œ๋‹ค. (shallow copy) ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘ ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ3.4) public class logbook{ private int logMonth; private int logYear; private int entry = new int[31]; โ€ฆ }

logMonth

logMonth

logYear

logYear

entry

entry

equals ๋ฉ”์†Œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ธ์Šคํ„ด์Šค ํ•„๋“œ์˜ ๊ฐ’์„ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•œ๋‹ค. ์ด๋Ÿฐ ๋ณต์ œ๋ฅผ shallow copy๋ผ ํ•œ๋‹ค. ๋”ฐ๋ผ ์„œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ค‘ ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ๋ณต์ œํ•œ ํ›„์— ๋‘ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฒƒ ์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

boolean equals(Object other) equals ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„ ์‚ฌ์ „์กฐ๊ฑด: ์‚ฌ์ „์กฐ๊ฑด ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด์–ด์•ผ ํ•œ๋‹ค. ์‚ฌํ›„์กฐ๊ฑด: ์‚ฌํ›„์กฐ๊ฑด ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ๊ฐ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• instanceof ์—ฐ์‚ฐ์ž: ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•˜์œ„ ํด๋ž˜์Šค๋„ ์ด ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๊ฒ€์‚ฌ์—์„œ ํ†ต๊ณผํ•˜๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. Object ํด๋ž˜์Šค์˜ Class getClass() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ์ถ”๊ฐ€์  ๊ณ ๋ ค์‚ฌํ•ญ ๋™์ผ ๊ฐ์ฒด์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ร† if(this==other) return true; ์ธ์ˆ˜์˜ ํƒ€์ž…์ด Object์ด๋ฏ€๋กœ ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•œ ๋‹ค์Œ์— ๊ฐ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.

Object์˜ equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฒซ์งธ, ๋น„๊ตํ•˜๊ณ  ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด์–ด์•ผ ํ•œ๋‹ค. ๋ณดํ†ต ์ž๋ฐ”์—์„œ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํŠน์ • ํƒ€์ž… ์ธ์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ์—๋Š” instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ instanceof ์—ฐ์‚ฐ์ž๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ๋„ ์ด ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ equals ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ด ์—ฐ์‚ฐ์ž ๋Œ€์‹ ์— Class ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” getClass ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘˜์งธ, ๋™์ผ ๊ฐ์ฒด๊ฐ€ ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค. ์…‹์งธ, ์ธ์ž์˜ ํƒ€์ž…์ด Object์ด๋ฏ€๋กœ ๋ฐ›์€ ์ธ์ž๋ฅผ ๊ฐ• ์ œ ํƒ€์ž… ๋ณ€ํ™˜ํ•œ ํ›„์— ๋‚ด๋ถ€ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋“ค์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.

- 40 -


boolean equals(Object other) โ€“ ๊ณ„์† ์˜ˆ3.5) public class Date{ private int year; private int month; private int day; โ€ฆ public boolean equals(Object other){ if(other==null||getClass() != other.getClass()) return false; if(this == other) return true; Date o = (Date)other; public class MyDate extends Date{ return year==o.year&& private int val; month==o.month&& โ€ฆ day==o.day; public boolean equals(Object other){ } if(!super.equals(other)) return false; โ€ฆ MyDate o = (MyDate)other; } return val == o.val; } ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ

Date๋ผ๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๋ณด์ž. ์šฐ์„  ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ Date ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, Date์˜ ํ•˜ ์œ„ ํด๋ž˜์Šค์— ํ•ด๋‹น๋˜๋Š” ๊ฐ์ฒด์™€๋Š” ๋น„๊ตํ•  ์ˆ˜ ์—†๋‹ค. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹ˆ๊ณ 

Date ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๋ฉด ์ฃผ์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ํ˜„์žฌ ๊ฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ๋จผ์ € ๊ฒ€์‚ฌํ•œ๋‹ค. ์ด ๋Ÿฐ ๊ฒ€์‚ฌ๊ฐ€ ๋๋‚˜๋ฉด ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ Date ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ์— Date์˜ ๊ฐ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•œ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ด๋ฏธ equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์šฐ์„  ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ equals ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น„๊ตํ•˜๊ณ , ์ด ๋น„๊ต์— ์„ฑ๊ณตํ•˜๋ฉด ํ˜„์žฌ ํด๋ž˜์Šค์— ์ถ”๊ฐ€๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋“ค์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

Object clone() Object ํด๋ž˜์Šค์˜ clone ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘์— ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฉ”์†Œ๋“œ๋Š” protected๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. clone์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ค‘ ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ๊ทธ ๋ณ€์ˆ˜๋งˆ๋‹ค ๊ทธ ๋ณ€์ˆ˜์˜ clone์„ ํ˜ธ์ถœํ•œ๋‹ค.

public class Customer implements Cloneable{ private String name; private BankAccount account; โ€ฆ public Object clone(){ try{ Customer cloned = (Customer)super.clone(); cloned.account = (BankAccount)account.clone(); return cloned; } catch(CloneNotSupportedException e){ return null; } } }

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” shallow copy ๋ฐฉ์‹์˜ ๋ณต์ œ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘์— ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ ์— Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” protected ๋ฉค๋ฒ„๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ

clone ๋ฉ”์†Œ๋“œ๋ฅผ public ๋ฉค๋ฒ„๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ์ฒด ํ•ธ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์—† ๋‹ค. clone์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ‘œ๊ธฐํ•˜์—ฌ, ์ด ์‚ฌ์‹ค์„

- 41 -


์™ธ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค. clone ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์šฐ์„  ๋ถ€ ๋ชจ ํด๋ž˜์Šค์˜ clone์„ ํ˜ธ์ถœํ•˜์—ฌ ์ดˆ๊ธฐ ๋ณต์ œ๋ฅผ ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ์ฐธ์กฐ ํƒ€์ž… ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์€ shallow copy๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ์ถ”๊ฐ€๋กœ ๋ณต์ œํ•œ๋‹ค.

protected package pack1; class A{ private int a; public A(int val){ a = val; } protected void f(){ System.out.println(โ€œHa Ha!!!โ€); } } class B extends A{ private int b; public B(int val){ super(val); b = val; } public void g(){ f(); } public void test(){ a = 10; // error } }

package pack2; class C{ private int c; public void test(){ A o1 = new A(10); o1.a = 20; // error o1.f(); // error B o2 = new B(20); o2.g(); // ok } } ์ƒ์†ํ•œ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๊ด€๋ จ์ด ์—†๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์—๋Š” protected๋Š” private๊ณผ ๊ทธ ํšจ๊ณผ๊ฐ€ ๊ฐ™๋‹ค.

clone์ด Object์˜ protected ๋ฉค๋ฒ„์ด๋ฏ€๋กœ ์ž๋ฐ”์—์„ธ ์ œ๊ณตํ•˜๋Š” ์ ‘๊ทผ ์ง€์‹œ์ž์— ๋Œ€ํ•ด ๋ณต์Šตํ•˜์—ฌ ๋ณด ์ž. ์ž๋ฐ”๋Š” public, private, protected, default ๋„ค ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ ‘๊ทผ ์ง€์‹œ์ž๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํŒจํ‚ค ์ง€ ๊ฐœ๋…์— ๋•Œ๋ฌธ์— ์ด๋“ค์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ๋ณต์žกํ•˜๋‹ค. ์ด ์ค‘์— protected๋Š” ์ƒ ์†๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์œ„ ์˜ˆ์—์„œ B๋Š” A๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ B๋Š” ๊ทธ๊ฒƒ์˜ ๋ฉ”์†Œ๋“œ์—์„œ A ์˜ protected ๋ฉค๋ฒ„์ธ f()๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜

protected ๋ฉค๋ฒ„๋ฅผ public ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ C๋Š” A๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์ง€๋„ ์•Š์œผ ๋ฉฐ, A ๋˜๋Š” B์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ C ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋Š” A์˜

protected ๋ฉค๋ฒ„์ธ f()๋Š” private ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ A๋‚˜ B์˜ ๊ฐ์ฒด ํ•ธ๋“ค์„ ์ด์šฉํ•˜์—ฌ f() ๋ฉ”์†Œ ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

- 42 -


4.4. Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„

Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ์š”์†Œ๋“ค์„ ์–ด๋–ค ๊ธฐ์ค€์— ์˜ํ•ด ์ •๋ ฌํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…์€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์‚ญ์ œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ˜„์žฌ ๊ตฌ์กฐ ๋‚ด์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค. Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์— ๋‚ด๋ถ€ ์ž๋ฃŒ๊ตฌ์กฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด Object ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Object ํด๋ž˜์Šค์— equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์˜. ์ฃผ์˜. Object ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์‹ค์ œ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด์— equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์žฌ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜๋Š” ์š”์†Œ๋“ค์ด ์–ด๋–ค ๊ธฐ์ค€์— ์˜ํ•ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ญ์ œ๋Š” ์‚ฝ์ž…๊ณผ ๋‹ฌ๋ฆฌ ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ์œ ์ง€๋˜๊ณ  ์žˆ๋Š”์ง€์™€ ์ƒ๊ด€์—†์ด ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์ž๋ฃŒ๊ตฌ์กฐ ๋‚ด์— ์žˆ๋Š”์ง€ ํ•ญ์ƒ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒ ๋Œ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Š” ๋ณดํ†ต ๋‚ด๋ถ€ ์ž๋ฃŒ๊ตฌ์กฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ ๋ฉ”์†Œ๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„

Object ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Object ํด๋ž˜์Šค์—๋Š” equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ ์œผ๋ฏ€๋กœ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฐพ๊ณ ์žํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ด ๋•Œ

Object ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ equals ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ ๊ฐ€ ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.

Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ์˜ˆ3.6) public class UnsortedList{ Object[] list; int size = 0; public UnsortedList(int capacity){ list = new Object[capacity]; } public boolean delete(Object item){ for(int i=0; i<size; i++){ if(item.equals(list[i])){ โ€ฆ } } } โ€ฆ }

์ž๋ฐ”์˜ late binding ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ Object์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ item์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด ์Šฌ๋ผ์ด๋“œ์˜ ์˜ˆ์—์„œ delete ์—ฐ์‚ฐ์˜ ์ธ์ž ํƒ€์ž…์€ Object์ด๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ์ธ์ž์˜ equals ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๊ตฌ์กฐ ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋˜๋Š” ๊ฐ์ฒด๋Š” Object๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…์ผ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์˜ late

- 43 -


binding ํŠน์„ฑ ๋•Œ๋ฌธ์— Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ item์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์— ์ •์˜๋˜์–ด ์žˆ๋Š” equals ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ์š”์†Œ๋“ค์„ ์–ด๋–ค ๊ธฐ์ค€์— ์˜ํ•ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…ํ•  ๋•Œ ๊ธฐ์กด ์š”์†Œ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž… ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋น„๊ต๋Š” ์ž๋ฐ”์—์„œ๋Š” ๋ณดํ†ต compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. Object ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์—๋Š” Object ํด๋ž˜์Šค์—๋Š” compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ˆ3.6์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. Object ํƒ€์ž… ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด์— compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์–ด๋„ Object ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋Š” compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„์—์„œ๋Š” ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€์ˆ˜์— ์ €์žฅ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ์š”์†Œ๋“ค์ด ์–ด๋–ค ๊ธฐ์ค€์— ์˜ํ•ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…ํ•  ๋•Œ ๊ธฐ์กด ์š”์†Œ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž… ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ๋ณดํ†ต compareTo ๋ฉ”์†Œ ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋Ÿฐ ๋น„๊ต๋ฅผ ํ•œ๋‹ค. ๋งŒ์•ฝ Object ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด Object ํด๋ž˜์Šค์—๋Š” compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์•ž์„œ ์‚ดํŽด ๋ณธ ์˜ˆ 3.6๊ณผ ๋‹ฌ๋ฆฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜ํ•˜์—ฌ compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.

Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ์˜ˆ3.7)

public class Test{ public static void main(String[] args){ public class SortedList{ SortedList list = new SortedList(10); Object[] list; list.insert(new Integer(10)); int size = 0; } public SortedList(int capacity){ } list = new Object[capacity]; } public void insert(Object item){ for(int i=0; i<size; i++){ int comp = item.compareTo(list[i]); // error โ€ฆ } ์ด ์˜ˆ์ œ์—์„œ Integer ํด๋ž˜์Šค๋Š” } compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด โ€ฆ ์žˆ์ง€๋งŒ SortedList์˜ add ๋ฉ”์†Œ๋“œ๋Š” } ์ „๋‹ฌ๋œ ๊ฐ์ฒด์˜ ํƒ€์ž…๊ณผ ์ƒ๊ด€์—†์ด item์€ Object ํƒ€์ž…์ด๋ฏ€๋กœ item์„ ์ด์šฉํ•˜์—ฌ compareTo๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

์ด ์Šฌ๋ผ์ด๋“œ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์‹ค์ œ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ Integer ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€ ์ง€๊ณ  ์žˆ์ง€๋งŒ insert ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ item์€ Object ํƒ€์ž…์ด๋ฏ€๋กœ late binding๊ณผ ์ƒ๊ด€์—†์ด ๋ฌธ๋ฒ” ์ ์œผ๋กœ compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

- 44 -


ํ•ด๊ฒฐ์ฑ… 1. public class SortedList{ Object[] list; int size = 0; public SortedList(int capacity){ list = new Object[capacity]; } public void insert(Object item){ Comparable x = (Comparable)item; for(int i=0; i<size; i++){ int comp = x.compareTo(list[i]); // ok โ€ฆ } ์ด ๋•Œ item์ด Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  } ์žˆ์ง€ ์•Š์œผ๋ฉด ClassCastException์ด ๋ฐœ์ƒํ•œ๋‹ค. โ€ฆ }

compareTo ๋ฌธ์ œ๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์˜ˆ์ฒ˜๋Ÿผ ์ „๋‹ฌ๋œ ์ธ์ž๋ฅผ compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜ ๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์ „๋‹ฌ๋œ ์ธ ์ž๊ฐ€ Comparable ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์—†์œผ๋ฉด ClassCastException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋ฉ” ์†Œ๋“œ์˜ ์„œ๋ช…๋งŒ ๋ณด๋ฉด Comparable ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ ๋ฒ•๋ณด๋‹ค๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•˜๋‹ค.

ํ•ด๊ฒฐ์ฑ… 2. public class SortedList{ Comparable[] list; // Object[] list; int size = 0; public SortedList(int capacity){ list = new Comparable[capacity]; } public void insert(Comparable item){ for(int i=0; i<size; i++){ int comp = item.compareTo(list[i]); // ok โ€ฆ } } โ€ฆ }

compareTo ๋ฉ”์†Œ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ insert์˜ ์ธ์ž ํƒ€์ž…์„ Object๊ฐ€ ์•„๋‹Œ Comparable ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜์—ฌ, Comparable ํƒ€์ž… ์™ธ์—๋Š” ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ ๋‚ด๋ถ€ ๋ฐฐ์—ด์€ Comparable ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , Object ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

4.5. ๋ณต์‚ฌ๋ฐฉ์‹ VS. ์ฐธ์กฐ๋ฐฉ์‹ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ž๋ฐ”์—์„œ๋Š” ๋ณต์‚ฌ ๋ฐฉ์‹(by clone)๊ณผ ์ฐธ์กฐ ๋ฐฉ์‹(by reference) ์ค‘

- 45 -


์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋ณต์‚ฌ ๋ฐฉ์‹์€ ์ฃผ์–ด์ง„ ์š”์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๋ณต์ œ๋œ ์š”์†Œ ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ตฌ์กฐ์— ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , ์ฐธ์กฐ ๋ฐฉ์‹์€ ์ฃผ์–ด์ง„ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ตฌ์กฐ์— ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ž๋ฐ”์—์„œ ๊ฐ์ฒด์˜ ๋ณต์ œ๋Š” ๋ณดํ†ต clone ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

๋ณต์‚ฌ๋ฐฉ์‹ vs. ์ฐธ์กฐ๋ฐฉ์‹ ๋ณต์‚ฌ๋ฐฉ์‹(by clone)

์ฐธ์กฐ๋ฐฉ์‹(by reference)

public void insert(Listable item){ public void insert(Object item){ list[size] = (Listable)item.clone(); list[size] = item; ๊ตฌํ˜„ ์˜ˆ size++; size++; } } ์œ„ํ—˜์„ฑ

์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†๋„

๊ฐ์ฒด๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ• ์ˆ˜๋ก ๋Š๋ฆฌ๋‹ค.

์ผ์ •ํ•˜๋ฉฐ, ๋น ๋ฅด๋‹ค.

๊ณต๊ฐ„

๋‘ ๋ฐฐ๋กœ ์†Œ์š”๋œ๋‹ค.

๊ณต๊ฐ„์ด ์ถ”๊ฐ€๋กœ ํ•„์š” ์—†๋‹ค.

์—ฌ๊ธฐ์„œ Listable์€ clone ๋ฉ”์†Œ๋“œ๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ด๋‹ค.

์ฐธ์กฐ ๋ฐฉ์‹์€ ์†๋„ ์ธก๋ฉด์ด๋‚˜ ๊ณต๊ฐ„ ์ธก๋ฉด์—์„œ ๋ณต์‚ฌ ๋ฐฉ์‹์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์™ธ๋ถ€ ์—์„œ ๊ธฐ์กด ์ฐธ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์กฐ ๋‚ด์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ฐธ์กฐ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์  class MyClass{ int value; Myclass(int n){ value=n; } public void set(int n){ value=n; } public int get(){ return value; } โ€ฆ }

list

UnsortedList list = new UnsortedList(5); MyClass a1 = new MyClass(10); MyClass a2 = new MyClass(20); list.insert(a1); list.insert(a2); a1.set(5);

10 5

a1

20

a2

์ด ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ 10๊ณผ 20์ธ ๊ฐ์ฒด๋ฅผ list์—์„œ ์‚ฝ์ž…ํ•˜ ์˜€์ง€๋งŒ ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฌ์šฉ๋œ a1๋ฅผ ์ด์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ a1์˜ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๋ฉด list์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’๋„ ๋ณ€๊ฒฝ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฐ ์œ„ํ—˜์€ ์—†๋‹ค.

- 46 -


clone clone์€ compareTo์™€ ๋‹ฌ๋ฆฌ Object ํด๋ž˜์Šค์— ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” protected ๋ฉค๋ฒ„์ด๋ฏ€๋กœ ์™ธ๋ถ€์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. Object์˜ clone์€ shallow copy(cf. deep copy)๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ์ค‘ ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— Object์˜ clone ๋ฉ”์†Œ๋“œ๋Š” protected ๋ฉค๋ฒ„๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ compareTo ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค. Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด์šฉ์ด ๋น„์–ด์žˆ๋Š” marker interface์ด๋‹ค. ์ฐธ๊ณ . ์ฐธ๊ณ . marker interface๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ3.8) Serializable: ๊ฐ์ฒด๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

clone์˜ ๋ฌธ์ œ์  ์˜ˆ3.9)

Cloneable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ clone ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์žˆ์œผ๋ฉด ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ public class SortedList{ public ๋ฉ”์†Œ๋“œ๊ฐ€ ๋˜์–ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Object[] list; marker interface์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค. int size = 0; public SortedList(int capacity){ list = new Object[capacity]; } public Object get(int index) { // return list[index].clone(); Cloneable x = (Cloneable)list[index]; return x.clone(); // error; } โ€ฆ }

ํ•ด๊ฒฐ์ฑ…. ํ•ด๊ฒฐ์ฑ…. ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. interface Copyable{ Object clone(); }

public void get(int index) { Copyable x = (Copyable)list[index]; return x.clone(); // ok; }

๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” Object ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

Object ํด๋ž˜์Šค๋Š” clone ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, equals ๋ฉ”์†Œ๋“œ์˜ ์˜ˆ์ฒ˜๋Ÿผ Object ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด

clone ๋ฉ”์†Œ๋“œ๋Š” protected ๋ฉค๋ฒ„์ด๋ฏ€๋กœ Object์— ๋Œ€ํ•œ ํ•ธ๋“ค์„ ์ด์šฉํ•˜์—ฌ clone ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฉด compareTo ๋ฉ”์†Œ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉ ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค. ๊ทธ ์ด์œ ๋Š” Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ถˆํ–‰ํžˆ๋„

marker ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค ํŠน์ • ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ marker ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด์šฉ์ด ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ ๊ทธ๊ฒƒ์„ ๊ตฌ ํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๊ณ , ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‹ค์ œ clone ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋“ค๋งŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

- 47 -


clone๊ณผ compareTo ๋™์‹œ ์ œ๊ณต ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ํŠน์ • ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜? ์˜ˆ3.10) ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค. ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ฐฉ๋ฒ•. ๋ฐฉ๋ฒ•. Comparable, Cloneable์„ ๊ตฌํ˜„ํ•œ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ฐธ๊ณ . ์ฐธ๊ณ . ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค. interface Listable extends Comparable, Cloneable{ // int compareTo(Object target); Object clone(); }

๋ณต์‚ฌ๋ฐฉ์‹์œผ๋กœ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ƒˆ ์ธํ„ฐํŽ˜์ด ์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ํŠน์ • ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ์ด ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ3.10์ฒ˜๋Ÿผ ๋ณต์‚ฌ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์œผ๋ฉด Listable์ด๋ผ๋Š” ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” Comparable๊ณผ Cloneable์„ ์ƒ์†๋ฐ›๋„๋ก ํ•œ๋‹ค. Comparable์„ ์ƒ์† ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— Listable์— compareTo ๋ฉ”์†Œ๋“œ๋Š” ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ Cloneable์€ marker ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ clone ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ Listable ์ธํ„ฐ ํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„์˜ ์˜ˆ์ด๋‹ค.

clone๊ณผ compareTo ๋™์‹œ ์ œ๊ณต ์˜ˆ3.11) Listable์˜ ์‚ฌ์šฉ ์˜ˆ class SortedList{ Listable[] list; int size = 0; public SortedList(int capacity){ list = new Listable[capacity]; } public Object get(int index) { return list[index].clone(); } โ€ฆ }

class SortedList{ Object[] list; int size = 0; public SortedList(int capacity){ list = new Object[capacity]; } public Object get(int index) { Listable x = (Listable)list[index]; return x.clone(); } โ€ฆ }

- 48 -


Listable ์ธํ„ฐํŽ˜์ด์Šค Listable ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฌธ์ œ์  ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” Integer์™€ ๊ฐ™์€ ๊ธฐ์กด ๊ฐ์ฒด๋Š” ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ Listable ์ œ๊ณตํ•˜๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜๋„ ์—†๋‹ค. class myInteger extends Integer implements Listable{ public myInteger(int val){ super(val); The type myInteger cannot subclass } the final class integer. }

์œ„ ๋ฌธ์ œ์ ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์—†์Œ. ๋ณต์‚ฌ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์„ ํฌ๊ธฐํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ์ €์žฅํ•  ๊ฐ์ฒด๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ Listable์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•จ.

Listable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋“ค์ด Listable์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด Listable์„ ๊ตฌํ˜„ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ๊ธฐ์กด ๊ฐ์ฒด๋“ค์ด

Listable์„ ๊ตฌํ˜„ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š๋‹ค. ํŠนํžˆ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณต๋˜๋Š” ํด๋ž˜์Šค ๋“ค์€ ๋ณดํ†ต ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋Š” final ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์ด๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ๋ณดํ†ต์€ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•œ๋‹ค.

Object ํƒ€์ž…์„ ์ด์šฉํ•œ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ํƒ€์ž…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ค. ์ž๋ฐ”์—์„œ๋Š” Object ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์žฅ ๋‹ค์–‘ํ•œ ํƒ€์ž…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณดํ†ต ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์šฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค ๊ทธ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ์š”์†Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ Object ํƒ€์ž…์„ ์ด์šฉํ•  ๋•Œ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฒซ์งธ, ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋‘˜์งธ, ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ Object ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ equals์ฒ˜๋Ÿผ Object์— ์ •์˜๋˜์–ด ์žˆ๊ณ , public ๋ฉ”์†Œ๋“œ์ด๋ฉด ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๋ฃŒ๊ตฌ์กฐ ์ž์ฒด๋ณด๋‹ค๋Š” ์ž ๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ์š”์†Œ๋“ค์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ equals๋ฅผ overrideํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ clone์ฒ˜ ๋Ÿผ ์ •์˜๋˜์–ด ์žˆ์–ด๋„ protected ๋ฉ”์†Œ๋“œ์ด๋ฉด ์ด๊ฒƒ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ์„ ์ด ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด์šฉ ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- 49 -


์ œ5์žฅ ๋ฆฌ์ŠคํŠธ ์ด ์žฅ์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค.

5.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ๋ฆฌ์ŠคํŠธ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต Big-O ํ‘œ๊ธฐ๋ฒ•

5.2. ๋ฆฌ์ŠคํŠธ

๋ฆฌ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์„ฑ ๋™์งˆ ๊ตฌ์กฐ: ๊ตฌ์กฐ ๊ตฌ์กฐ์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋Š” ๊ฐ™์€ ํƒ€์ž…์ด๋‹ค. ์š”์†Œ๋“ค๊ฐ„์— ์„ ํ˜• ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์กด์žฌ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์š”์†Œ๋Š” ์„ ํ–‰ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์š”์†Œ๋Š” ํ›„์† ์š”์†Œ๊ฐ€ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์ •๋ ฌ๋˜์–ด ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋น„์ •๋ ฌ(unsorted) ๋ฆฌ์ŠคํŠธ, ์ •๋ ฌ(sorted) ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๊ฐ€ ๋ณตํ•ฉ ํƒ€์ž…์ผ ๊ฒฝ์šฐ์—๋Š” ์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์˜ˆ4.1) ํ•™์ƒ ๊ธฐ๋ก๋ถ€: ํ•™๋ฒˆ, ํ•™์ƒ ์ด๋ฆ„, ๋‚˜์ด, ... ร† ํ‚ค๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ–๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ฒซ์งธ, ๋™์งˆ ๊ตฌ์กฐ์ด๋‹ค. ๋‘˜์งธ, ์š”์†Œ๋“ค ๊ฐ„์— ์„ ํ˜• ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์„ ํ˜• ๊ด€๊ณ„๋ž€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์„ ํ–‰ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ํ›„์† ์š”์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์š”์†Œ๋ฅผ ์–ด ๋–ค ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜์—ฌ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์— ์ €

- 51 -


์žฅํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ณตํ•ฉ ํƒ€์ž…์ด๋ฉด ์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ํ‚ค๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์ŠคํŠธ ADT ๊ตฌํ˜„์‹œ ๊ณ ๋ ค์‚ฌํ•ญ ์ค‘๋ณต ํ—ˆ์šฉ ์—ฌ๋ถ€ ๋™์ผํ•œ ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€: ์‘์šฉ์— ์˜ํ•ด ๊ฒฐ์ • ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์˜ ํ˜•ํƒœ ๋ณดํ†ต ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰, ์ถ”์ถœ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ ์—ฐ์‚ฐ์˜ ํ˜•ํƒœ๋Š” ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ์‘์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ4.2) ์‚ญ์ œ ์ฃผ์–ด์ง„ ํ‚ค ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์‚ญ์ œ ์ž๋ฃŒ๊ตฌ์กฐ ๋‚ด์— ํŠน์ • ์œ„์น˜์— ์ €์žฅ๋œ ์š”์†Œ๋ฅผ ์‚ญ์ œ

๋ฆฌ์ŠคํŠธ ADT๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ์ด ์žˆ๋‹ค. ์ฒซ์งธ, ์ค‘๋ณต ์š”์†Œ๋ฅผ ํ—ˆ ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋™์ผํ•œ ํ‚ค ๊ฐ’์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์ž ๋ฃŒ๊ตฌ์กฐ์— ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๊ฒƒ์€ ์‘์šฉ์— ๋”ฐ๋ผ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‘˜์งธ, ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์˜ ํ˜•ํƒœ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์€ ์ •ํ•ด์ ธ ์žˆ๋‹ค. ๋ณดํ†ต ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰, ์ถ”์ถœ ์—ฐ์‚ฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜ ๋ฉฐ, ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ๋„ ์ด๋“ค ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค ๊ฐ ์—ฐ์‚ฐ์˜ ํ˜•ํƒœ๋Š” ๋ณดํ†ต ์ • ํ•ด์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ์‘์šฉ์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ญ์ œ ์—ฐ์‚ฐ ์˜ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค ํ‚ค ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์ฐพ์•„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ , ์ž๋ฃŒ๊ตฌ์กฐ ๋‚ด ์— ํŠน์ • ์œ„์น˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฌผ๋ก  ํ•œ ๊ฐ€์ง€ ํ˜• ํƒœ์˜ ์‚ญ์ œ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ์‚ญ์ œ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

5.3. UnsortedList ์ด ์žฅ์—์„œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค. ๋ฐฐ์—ด์€ ๊ทธ ์šฉ๋Ÿ‰์ด ์ƒ์„ฑ๋  ๋•Œ ๊ณ ์ •๋˜๋ฏ€๋กœ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋‹ค ๋ณด๋ฉด ๋” ์ด์ƒ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์€ ์ƒ‰์ธ์— ์˜ํ•œ ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๊ฐ ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

- 52 -


UnsortedList ADT ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„ int size; capacity? int cursor; Object[] elements; ์ƒ์„ฑ์ž UnsortedList() UnsortedList(int capacity); ์ƒํƒœ boolean isFull(); boolean isEmpty(); int size(); ๊ฒ€์ƒ‰ boolean search(Object item); Object retrieve(Object item);

์กฐ์ž‘ boolean insert(Object item); boolean delete(Object item); ์ปค์„œ ์กฐ์ž‘ void reset(); iterator ์ปค์„œ๋ฅผ ์ฒ˜์Œ์œผ๋กœ boolean hasNext(); ํ›„์† ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Object next(); ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ปค์„œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์ด๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” size์™€ ์š”์†Œ๋“ค์ด ์ €์žฅ๋  ๋ฐฐ์—ด elements๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค. ๋ฐฐ์—ด์˜ ์šฉ ๋Ÿ‰ ์ •๋ณด๋„ ํ•„์š”ํ•˜์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š” length๋ผ๋Š” ๋ฐฐ์—ด์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ํ•ญ ์ƒ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฐ˜๋ณต์ž๋Š” ์ด ์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์ž์ฒด์— cursor ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , reset, hasNext, next ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ , ์ž๋ฐ”์˜ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ๋ณ„๋„์˜ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์žฅ์—์„œ๋Š” ์šฐ์„  ํด๋ž˜์Šค ์ž์ฒด์— ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ฐ˜๋ณต์ž๋ฅผ ์ œ๊ณต ํ•œ๋‹ค. ์ฐธ๊ณ ์ ์œผ๋กœ ์ด ์žฅ์—์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” Object ๋ฐฐ์—ด์„ ์ด์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต์‚ฌ ๋ฐฉ์‹์ด ์•„๋‹Œ ์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ๋˜ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

boolean search(Object item) ์‚ฌ์ „์กฐ๊ฑด: item!=null ์‚ฌํ›„์กฐ๊ฑด: item์ด ๋ฆฌ์ŠคํŠธ์— ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ๋ฆฌ์ŠคํŠธ ์ด๋ฏ€๋กœ ์„ ํ˜•๊ฒ€์ƒ‰๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ข…๋ฃŒ์กฐ๊ฑด 1. ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•จ 2. ๋ชจ๋“  ์š”์†Œ์™€ ๋น„๊ตํ•˜์˜€์ง€๋งŒ ์ฐพ์ง€ ๋ชปํ•จ

boolean search(Object item){ int loc = 0; boolean moreToSearch = (item!=null)&&(loc<size); boolean found = false; while(moreToSearch && !found){ if(item.equals(elements[loc])){ found = true; } else{ loc++; moreToSearch = (loc < size); } } return found; } boolean search(Object item){ if(item==null) return false; for(int loc = 0; loc<size; loc++){ if(item.equals(elements[loc])) return true; return false; }

search ์—ฐ์‚ฐ์€ ๋ฆฌ์ŠคํŠธ์— ์ฃผ์–ด์ง„ ํ‚ค ๊ฐ’๊ณผ ๊ฐ™์€ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ์„œ, Object ํด๋ž˜์Šค์˜ equals ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š” ์ง€ ๋‹จ์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์„ ํ˜•๊ฒ€์ƒ‰๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ ํ˜•๊ฒ€์ƒ‰์ด๋ž€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๋ ์š” ์†Œ๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ์„ ํ˜• ๊ฒ€์ƒ‰์€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ์™€ ๋ชจ๋“ 

- 53 -


์š”์†Œ์™€ ๋น„๊ตํ•˜์˜€์ง€๋งŒ ๊ฐ™์€ ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ์™„๋ฃŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ search ์—ฐ์‚ฐ์€ ์ด ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๊ฐ๊ฐ ๋‚˜ํƒ€๋‚ด๋Š” found์™€ moreToSearch ์ง€์—ญ๋ณ€์ˆ˜์™€ while ๋ฃจํ”„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ• ์™ธ์— ์šฐ๋ฆฌ๋Š” ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ size๋ผ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ์œ ์ง€ ํ•˜๋ฏ€๋กœ size์™€ for ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ search ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. retrieve ์—ฐ์‚ฐ์€ search ์—ฐ์‚ฐ๊ณผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋™์ผํ•œ ์—ฐ์‚ฐ์ด๋‹ค. retrieve์€ ์ฃผ์–ด์ง„ ํ‚ค ๊ฐ’๊ณผ ๊ฐ™์€ ์š”์†Œ๋ฅผ ์ฐพ์•„ ๊ทธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ฃผ๋ฉฐ, ์ถ”์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” null ๊ฐ’ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

boolean insert(Object item) ์‚ฌ์ „์กฐ๊ฑด: item!=null, ๋ฆฌ์ŠคํŠธ๊ฐ€ full์ด ์•„๋‹˜ ์‚ฌํ›„์กฐ๊ฑด: ์ฃผ์–ด์ง„ item์„ ๋ฆฌ์ŠคํŠธ์— ๋์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ถ”๊ฐ€์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ, ๋ชปํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

boolean insert(Object item){ if(item==null || isFull()) return false; elements[size] = item; // Listable x = (Listable)item; // elements[size] = x.clone(); size++; return true; } item elements elements

item

๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ์š”์†Œ๋ฅผ ํŠน์ • ์œ„์น˜์— ์‚ฝ์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ArrayList์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ์ €๋ ดํ•˜๋‹ค. ๋ฆฌ์ŠคํŠธ ๋งจ ๋ ์ƒ‰์ธ์€ ํ˜„์žฌ ๋ฆฌ ์ŠคํŠธ์˜ ํฌ๊ธฐ ์ •๋ณด๋กœ๋ถ€ํ„ฐ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์—์„œ๋Š” ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฝ‰ ์ฐจ์žˆ์œผ๋ฉด ๋” ์ด์ƒ ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด ์žฅ์—์„œ๋Š” ๋˜ํ•œ ์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์–ด์ง„ ์ƒˆ ์š”์†Œ๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ ๋‹ค. ๋งŒ์•ฝ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ์ด ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋ฉด ์ฃผ์„์ฒ˜๋ฆฌ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฃผ์–ด์ง„ ์ธ์ž๋ฅผ

Listable ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณต์ œํ•œ ๊ฒƒ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

- 54 -


boolean delete(Object item) ์‚ฌ์ „์กฐ๊ฑด: ์‚ฌ์ „์กฐ๊ฑด item!=null ์‚ฌํ›„์กฐ๊ฑด: ์‚ฌํ›„์กฐ๊ฑด item์ด ๋ฆฌ์ŠคํŠธ์— ์žˆ์œผ๋ฉด ๊ทธ item์„ ์‚ญ์ œํ•œ๋‹ค. ์‚ญ์ œ์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ๋ชปํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ข…๋ฃŒ์กฐ๊ฑด์€ search ์—ฐ์‚ฐ๊ณผ ๊ฐ™์Œ. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ๋‘ ๊ฐœ์˜ boolean ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ.

์‚ญ์ œํ•  ๊ฒƒ A

D

C

F

A

D

E

F

E

boolean delete(Object item){ int loc = 0; boolean moreToSearch = (item!=null)&&(loc<size); while(moreToSearch){ if(item.equals(element[loc])){ if(loc!=size-1) elements[loc] = elements[size-1]; size--; ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” return true; ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ ๊ฐ€๋Šฅ } else{ loc++; moreToSearch = (loc<size); } } // while return false; } // delete

์‚ญ์ œ ์—ฐ์‚ฐ์€ ์‚ฝ์ž… ์—ฐ์‚ฐ๊ณผ ๋‹ฌ๋ฆฌ ๋จผ์ € ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ ๋‹ค. ๋งŒ์•ฝ ๋ฆฌ์ŠคํŠธ์— ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ทธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ๋‹จ ์ˆœํ•˜๊ฒŒ ๊ทธ ํ•ญ์— null ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค๊ณ  ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์— ์„œ๋Š” ์ค‘๊ฐ„์— ๋นˆํ•ญ์ด ์—†์–ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฝ์ž…, ๊ฒ€์ƒ‰ ๋“ฑ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์— ๋‚˜์œ ์˜ ํ–ฅ์„ ์ค€๋‹ค. ์ค‘๊ฐ„์— ๋นˆํ•ญ์ด ์—†๋„๋ก ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์˜ ๋ชจ๋“  ํ›„์† ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์œ ์ง€๋˜๋Š” ๊ฒƒ ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋งจ ๋ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์š”์†Œ์™€ ๋Œ€์ฒดํ•จ์œผ๋กœ ์ €๋ ดํ•˜๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ข…๋ฃŒํ•˜๋Š” ์กฐ๊ฑด์€ ์•ž์„œ ์‚ดํŽด๋ณธ insert์™€ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•˜๋‚˜ ์˜ ๋ณ€์ˆ˜๋งŒ์„ ์ด์šฉํ•˜์—ฌ delete๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

boolean delete(Object item) โ€“ ๊ณ„์† boolean delete(Object item){ if(item==null) return false; for(int loc = 0; loc<size; loc++) if(item.equals(element[loc])){ if(loc!=size-1) elements[loc] = elements[size-1]; size--; return true; } return false; }

์ด ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” boolean ๋ณ€์ˆ˜๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌ ํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

- 55 -


Object next(), boolean hasNext() ์‚ฌ์ „์กฐ๊ฑด: ์—†์Œ ์‚ฌํ›„์กฐ๊ฑด: ์ปค์„œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์ฒ˜์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.

์‚ฌ์ „์กฐ๊ฑด: ์—†์Œ ์‚ฌํ›„์กฐ๊ฑด: ํ˜„์žฌ ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ปค์„œ๋ฅผ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™ํ•œ๋‹ค.

void reset(){ cursor=0; }

Object next(){ int loc = cursor; cursor++; return elements[loc]; // Listable x = // (Listable)elements[loc]; // return x.clone(); }

์‚ฌ์ „์กฐ๊ฑด: ์—†์Œ ์‚ฌํ›„์กฐ๊ฑด: ์ปค์„œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ๋์„ ๊ฐ€๋ฆฌ ํ‚ค๊ณ  ์žˆ์œผ๋ฉด false ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. boolean hasNext(){ return (cursor<size);

์‚ฌ์šฉ๋ฒ•

}

reset(); while(hasNext()){ next() }

reset(); for(int i=0; i<size(); i++){ next() }

์ด ADT์—์„œ ๋ฐ˜๋ณต์ž๋Š” ADT์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์ด ๋•Œ cursor๋ผ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์— ์ ‘๊ทผํ•  ์š”์†Œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์—๋Š” next ๋ฉ”์†Œ๋“œ๋Š” ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , ์š”์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

5.4. SortedList

SortedList ADT UnsortedList์™€ ์ œ๊ณตํ•ด์•ผ ๋˜๋Š” ์—ฐ์‚ฐ์ด ์œ ์‚ฌํ•˜๋‹ค. ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์œ ์ง€๋˜๋‚˜ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋‚˜ ์™ธ๋ถ€์—์„œ ๋ณด๋Š” ๊ด€์ ์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ์žฌ์‚ฌ์šฉ์„ ๊ณ ๋ ค ๋ฐฉ๋ฒ•1. ๋ฐฉ๋ฒ•1. ์ง์ ‘ ์ƒ์† ร† ๋…ผ๋ฆฌ์ ์œผ๋กœ SortedList๊ฐ€ UnsortedList์˜ ์ž์‹ ํด๋ž˜์Šค๋Š” ์•„๋‹ˆ๋‹ค. SortedList is a UnsortedList (?) ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ์†์ด ์ ํ•ฉํ•˜์ง€ ์•Š์•„๋„ ์ƒ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ4.3) UnsortedList unsorted; SortedList sorted = new SortedList(10); unsorted = sorted; // ???

SortedList๋Š” ์•ž์„œ ๊ตฌํ˜„ํ•œ UnsortedList์™€ ์ œ๊ณตํ•ด์•ผ ๋˜๋Š” ์—ฐ์‚ฐ์ด ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค. ์‹ค์ œ ๋‚ด๋ถ€์  ์œผ๋กœ๋Š” SortedList๋Š” ์š”์†Œ๋“ค์„ ์–ด๋–ค ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜์—ฌ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ ๋Š” UnsortedList์™€ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ์œ ์‚ฌํ•œ ์—ฐ์‚ฐ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ADT๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์žฌ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ์งธ, UnsortedList๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ์ƒ์†๋ฐ›์•„ SortedList๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ƒ ์†์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๋ชฉ์  ์œผ๋กœ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

- 56 -


SortedList ADT โ€“ ๊ณ„์† ๋ฐฉ๋ฒ•2. ๋ฐฉ๋ฒ•2. abstract ํด๋ž˜์Šค ์‚ฌ์šฉ List๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , UnsortedList์™€ SortedList ๋ชจ๋‘ List์˜ ์ž์‹ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†ต๋œ ์ฝ”๋“œ๋Š” List์— ํ•œ๋ฒˆ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ search, insert, delete ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๋‹ฌ๋ผ์•ผ ํ•˜๋ฏ€๋กœ List์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋‹ค. ร† ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐฉ๋ฒ•3. ๋ฐฉ๋ฒ•3. ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์€ ์•„๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ณตํ†ต๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ๋ฐ–์— ์—†์Œ UnsortedList์™€ SortedList๊ฐ€ List ํด๋ž˜์Šค ์™ธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์•ผ ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ์ผํ•œ ๋Œ€์•ˆ

๋‘˜์งธ, ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, List๋ผ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , UnsortedList์™€

SortedList๊ฐ€ ๋ชจ๋‘ List์˜ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†ต๋œ ์ฝ”๋“œ๋Š” List ํด๋ž˜์Šค์— ํ•œ๋ฒˆ๋งŒ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด isFull, isEmpty, size ๋ฉ”์†Œ๋“œ ๋“ฑ์€ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋‚˜ ๊ฐ™์œผ๋ฏ€๋กœ ์ด๋“ค์€ List ํด๋ž˜์Šค์— ์ •์˜ํ•œ๋‹ค. ์…‹์งธ, ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•˜๋‹ค. public abstract class List{ public final int DEF_CAPACITY=50; protected Object[] elements; protected int size = 0; protected int cursor = -1; public List(){ โ€ฆ } public List(int capacity){ โ€ฆ } private void setup(int capacity){ โ€ฆ } public boolean isFull(){ return (size >= element.length); } public int size(){ return size; } public boolean isEmpty(){ return (size == 0); } public abstract boolean search(Object item); public abstract boolean insert(Object item); public abstract boolean delete(Object item); public abstract Object retrieve(Object item); public void reset(){ cursor = 0; } public List(){ public boolean hasNext(){ setup(DEF_CAPACITY); return cursor<size; } } public List(int capacity){ public Object next(){ if(capacity>0) setup(capacity); int loc = cursor; else setup(DEF_CAPACITY); cursor++; } return element[loc]; private void setup(int capacity){ } elements = new Object[capacity]; } // List }

List ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 57 -


SortedList ADT public class SortedList extends List{ public SortedList(){ super(); } public SortedList(int capacity){ super(capacity); } public boolean search(Object item){ โ€ฆ } public boolean insert(Object item){ โ€ฆ } public boolean delete(Object item){ โ€ฆ } public Object retrieve(Object item){ โ€ฆ } } // SortedList

List ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ SortedList ํด๋ž˜์Šค๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค.

boolean insert(Object item) ์‚ฌ์ „์กฐ๊ฑด: item!=null, ๋ฆฌ์ŠคํŠธ๊ฐ€ full์ด ์•„๋‹˜ ์‚ฌํ›„์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ณ„์† ์ •๋ ฌ๋˜์–ด ์žˆ๋„๋ก ์ฃผ์–ด์ง„ item์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ถ”๊ฐ€์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ, ๋ชปํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐฉ๋ฒ• 1. ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค. 2. ์‚ฝ์ž…ํ•  ๊ณต๊ฐ„์„ ๋งŒ๋“ ๋‹ค. 3. ์ƒˆ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…ํ•œ๋‹ค. ์ด ๋•Œ ๋งจ ์•ž์—, ์ค‘๊ฐ„์—, ๋์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋งจ ์•ž์ด๋‚˜ ์ค‘๊ฐ„์ด๋‚˜ ์ ˆ์ฐจ๋Š” ๊ฐ™๋‹ค.

public boolean insert(Object item){ int loc = 0; boolean moreToSearch = (loc<size); if(item!=null || isFull()) return false; Comparable x = (Comparable)item; while(moreToSearch){ if(x.compareTo(elements[loc])<0) moreToSearch = false; else{ loc++; moreToSearch = (loc < size); } } // while for(int i=size; i>loc; i--) elements[i] = elements[i-1]; elements[loc] = item; size++; return true; }

์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž…์€ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๋ณต์žกํ•˜๋‹ค. ์ด๊ฒƒ์€ ์ฃผ์–ด์ง„ ์š”์†Œ๋ฅผ ์•„๋ฌด ์œ„์น˜ ์— ์ €์žฅํ•  ์ˆ˜ ์—†๊ณ  ๊ธฐ์กด ์š”์†Œ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ์š”์†Œ ๋“ค ์‚ฌ์ด์— ์ €์žฅํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ผ๋ถ€ ์š”์†Œ๋“ค์„ ์ด๋™ํ•˜์—ฌ ์ƒˆ ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋  ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ์กด ์š”์†Œ๋“ค๊ณผ์˜ ๋น„๊ต๋Š” compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜ ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋Š” ๋ฌผ๋ก  ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์€ Comparable ์ธํ„ฐํŽ˜์ด ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด์–ด์•ผ ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ ๋งจ ๋ ์— ์‚ฝ์ž…ํ•  ๊ฒฝ์šฐ์—๋Š” loc์˜ ๊ฐ’ ๋•Œ๋ฌธ์— for ๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

- 58 -


boolean insert(Object item) A

B

A

B

A

B

D

C

E D

E

D

E public boolean insert(Object item){ int loc; if(item!=null || isFull()) return false; Comparable x = (Comparable)item; for(loc=0; loc<size; loc++){ if(item.compareTo(elements[loc])<0) break; for(int i=size; i>loc; i--) elements[i] = elements[i-1]; elements[loc] = item; size++; return true; }

boolean delete(Object item) ์‚ฌ์ „์กฐ๊ฑด: item!=null, ์‚ฌํ›„์กฐ๊ฑด: item์ด ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜๋ฉด ์‚ญ์ œํ•œ๋‹ค. ์‚ญ์ œ์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ, ๋ชปํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

A

B

C

D

A

B

D

E

E

public boolean delete(Object item){ int loc = 0, comp = 0; boolean moreToSearch = (item!=null)&&(loc<size); boolean found = false; Comparable x = (Comparable)item; while(moreToSearch && !found){ comp = x.compareTo(elements[loc]); if(comp==0) found = true; else if(comp<0) moreToSearch = false; else{ loc++; moreToSearch = (loc < size); } } // while if(found){ for(int i=loc; i<size-1; i++) elements[i] = elements[i+1]; size--; return true; } else return false; }

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

- 59 -


public boolean delete(Object item){ if(item==null) return false; int loc = 0, comp = 0; boolean found = false; Comparable x = (Comparable)item; for(loc=0; loc<size; loc++){ comp = item.compareTo(elements[loc]); if(comp==0){ found = true; break; } else if(comp<0){ found = false; break; } } // for if(found){ for(int i=loc; i<size-1; i++) elements[i] = elements[i+1]; size--; return true; } else return false; }

public boolean search(Object item){ int first = 0, mid = 0, last = size-1, comp = 0; boolean moreToSearch = true; boolean found = false; if(item!=null || isEmpty()) return false; Comparable x = (Comparable)item; while(moreToSearch && !found){ mid = (first + last) / 2; comp = x.compareTo(elements[mid]); if(comp==0) found = true; else if(comp<0){ last = mid - 1; moreToSearch = (first <= last); } else{ first = mid + 1; moreToSearch = (first <= last); } ์‚ฌ์ „์กฐ๊ฑด: item!=null, } // while return found; ์‚ฌํ›„์กฐ๊ฑด: item์ด ๋ฆฌ์ŠคํŠธ์— ์žˆ์œผ๋ฉด true๋ฅผ, } ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

A

B

C

D

E

F

G

H

D

E

F

G

H

D

E

F

G H

first=0 last=7 mid=3 A

B

C

first=0 last=2 mid=1 A

B

C

first=2 last=2 mid=2

์š”์†Œ๋“ค์ด ์ •๋ ฌ๋˜์–ด ์œ ์ง€๋˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ ํ˜• ๊ฒ€์ƒ‰์„ ํ•˜์ง€ ์•Š๊ณ  ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ ๋‹ค. ๋˜ํ•œ ์„ ํ˜• ๊ฒ€์ƒ‰์„ ํ•˜๋”๋ผ๋„ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ์ค‘๊ฐ„์— ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰์€ ํ•œ๋ฒˆ ๋น„๊ตํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ์— ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜์”ฉ ์ค„์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰, ์ฒ˜์Œ ์— 10๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ์„ ๋•Œ ํ•œ๋ฒˆ ๋น„๊ตํ•œ ํ›„์—๋Š” ์ด ์ค‘์— 5๊ฐœ๋Š” ํ›„๋ณด์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์˜ˆ์ œ๋Š” C๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ์ด๊ณ , ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์˜ˆ์ œ๋Š” F๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ ์ด๋‹ค.

- 60 -


A

B

C

D

E

G

H

A

B

C

D

E

G

H

A

B

C

D

E

G

H

A

B

C

D

E

G

H

first=0 last=6 mid=3 first=4 last=6 mid=5 first=4 last=4 mid=4

first=5 last=4 mid=?

5.5. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์„ ํ˜• ๊ฒ€์ƒ‰์„ ํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์˜ค์ง ํ•˜๋‚˜ ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•ด๊ฒฐ์ฑ…์ด ์กด์žฌํ•  ๋•Œ ์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„๊ต๋Š” ๋ณดํ†ต ์„ฑ๋Šฅ์˜ ๋น„๊ต Which one is faster(efficient)? ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„๊ต ๊ธฐ์ค€์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•: ์‹คํ–‰ ์‹œ๊ฐ„ ๋น„๊ต ์ฃผ์–ด์ง„ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ์ปดํ“จํ„ฐ์—์„œ๋Š” A ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด B ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค๋Š” ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒƒ ๋ฐ–์—๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค. ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ฌธ์žฅ ์ˆ˜๋ฅผ ๋น„๊ต ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์— ์˜์กดํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ์—ฐ์‚ฐ์˜ ์ˆ˜ํ–‰ ํšŸ์ˆ˜ ๋น„๊ต ๊ฒ€์ƒ‰: ๋น„๊ต ์—ฐ์‚ฐ ์ฃผ์–ด์ง„ ์ž…๋ ฅ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋กœ ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ„

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋น„๊ตํ•  ๋•Œ์—๋Š” ๋ณดํ†ต ์„ฑ๋Šฅ์„ ๋น„๊ตํ•œ๋‹ค. ์„ฑ๋Šฅ ์™ธ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋“ฑ ๋‹ค๋ฅธ ๊ธฐ์ค€์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์šฐ์ˆ˜์„ฑ์„ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„ ๊ต ๊ธฐ์ค€์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹คํ–‰ ์‹œ ๊ฐ„์€ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€์ ์ธ ๋น„๊ต ๊ธฐ์ค€์ด ๋˜๊ธฐ ์–ด๋ ต๋‹ค. ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ ๊ทธ๋žจ์˜ ๋ฌธ์žฅ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋„ ์—ญ์‹œ ๊ณตํ‰ํ•œ ๋น„๊ต๊ฐ€ ๋˜๊ธฐ ์–ด๋ ต๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌธ์žฅ ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์— ๋งŽ์ด ์˜์กดํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•Œ๊ณ  ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•  ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ค€์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ์—ฐ์‚ฐ์˜ ์ˆ˜ํ–‰

- 61 -


ํšŒ์ˆ˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋น„๊ต ์—ฐ์‚ฐ์ด ํ•ต์‹ฌ ์—ฐ์‚ฐ์ด ๋˜๋ฉฐ, ๋น„๊ต ์—ฐ์‚ฐ์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๊ฒฐ์ •๋œ๋‹ค.

Big-O ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ = ํ•ต์‹ฌ ์—ฐ์‚ฐ์˜ ์ˆ˜ํ–‰ ํšŒ์ˆ˜ = f(์ž…๋ ฅ์˜ ํฌ๊ธฐ) Big-O ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์š”์•ฝํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ4.4) f(N)=N4+100N2+10N+50 ร† O(N4) N์ด ๋งค์šฐ ํฌ๋ฉด N4๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์••๋„ํ•˜๊ฒŒ ๋œ๋‹ค. ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ž€? ๊ณ ๋ ค๋˜๋Š” ๋ฌธ์ œ์˜ ํฌ๊ธฐ ร† ์˜ˆ4.5) ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์›์†Œ์˜ ๊ฐœ์ˆ˜ ์˜ˆ4.6) ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๊ธฐ open file while(more elements in list) write the next element close file (Nยฑํ•œ ์š”์†Œ๋ฅผ ๊ธฐ๋กํ•˜๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„) + (ํŒŒ์ผ ์—ด๊ณ  ๋‹ซ๋Š” ์‹œ๊ฐ„) O(N)

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ‘œ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” Big-O ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค. ์ด ํ‘œ๊ธฐ๋ฒ•์€ ํ•ต์‹ฌ ์—ฐ์‚ฐ์˜ ์ˆ˜ํ–‰ ํšŒ์ˆ˜๋ฅผ ์ž…๋ ฅ ํฌ๊ธฐ์— ๊ด€ํ•œ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž…๋ ฅ ํฌ๊ธฐ๋ž€ ๊ณ ๋ ค๋˜๋Š” ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋กœ์„œ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ ํฌ๊ธฐ๋กœ ์‚ฌ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Big-O ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ผ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ์••๋„ํ•˜๋Š” ์š”์†Œ๋งŒ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณดํ†ต ์ถ•์•ฝํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Common Order of Magnitude O(1): ์ž…๋ ฅ ํฌ๊ธฐ์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ4.7) ๋ฐฐ์—ด์— ํ•œ ์š”์†Œ ์ €์žฅํ•˜๊ธฐ O(logN): ๋กœ๊ทธ ์‹œ๊ฐ„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์–‘์ด ๋ฐ˜์”ฉ ์ค„์–ด๋“œ๋Š” ๊ฒฝ์šฐ ์˜ˆ4.8) ์ด์ง„ ๊ฒ€์ƒ‰ N logN NlogN O(N): ์„ ํ˜• ์‹œ๊ฐ„ 1 0 1 ์˜ˆ4.9) ์„ ํ˜• ๊ฒ€์ƒ‰ 4 2 8 O(NlogN) O(N2) 8 3 24 O(2N): ์ง€์ˆ˜ ์‹œ๊ฐ„ 32 5 160 O(N!): ๊ณ„์Šน ์‹œ๊ฐ„ 256

8

2048

N2

2N

1

2

16

16

256

65536

32768

5๋…„

16777216

donโ€™t ask

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ Big-O ํ‘œ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ ๋ช‡ ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. O(1)์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•˜๋ฉฐ, ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž…๋ ฅ ํฌ๊ธฐ์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ํ•ญ์ƒ ์ผ์ •ํ•œ ์‹œ๊ฐ„ ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. O(logN)์€ ๋กœ๊ทธ ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•˜๋ฉฐ, ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ง„ ๊ฒ€์ƒ‰ ์ฒ˜๋Ÿผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์–‘์ด ๋ฐ˜์”ฉ ์ค„์–ด๋“ ๋‹ค. O(N)์€ ์„ ํ˜• ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•˜๋ฉฐ, ์•Œ ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ์ด ์ž…๋ ฅ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•œ๋‹ค. ํ‘œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด O(NlogN)๊นŒ์ง€๋งŒ ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ด์ƒ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- 62 -


์€ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์กฐ๊ธˆ๋งŒ ์ปค์ ธ๋„ ํ˜„์‹ค์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

1๋ถ€ํ„ฐ N๊นŒ์ง€ ํ•ฉ์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1. sum = 0; for(int i=1; i<=n; i++) sum = sum + count; ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2. sum = ((n+1) * n)/2; ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1์€ O(N)์ด์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๋Š” O(1)์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์ค€์ด ๋˜๋Š” ์—ฐ์‚ฐ์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ญ์ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1๋ณด๋‹ค ์ข‹์€๊ฐ€? N์ด ๋งค์šฐ ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1์€ ๋ง์…ˆ ์—ฐ์‚ฐ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ด๋„ ์ธก๋ฉด์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. Big-O๋Š” N์ด ๋งค์šฐ ํด ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋น„๊ต ์ฒ™๋„์ด๋‹ค.

1๋ถ€ํ„ฐ N๊นŒ์ง€ ํ•ฉ์‚ฐํ•˜๋Š” ๋‘ ์ข…๋ฅ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Big-O ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๋ณด์ž. ์šฐ์„  ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1์€ N๋ฒˆ์˜ ๋ง์…ˆ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ O(N)์ด๋ฉฐ, ์•Œ ๊ณ ๋ฆฌ์ฆ˜ 2๋Š” ์ž…๋ ฅ์˜ ํฌ๊ธฐ์™€ ์ƒ๊ด€์—†์ด ๋ง์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ์ด ๊ฐ๊ฐ ํ•œ๋ฒˆ์”ฉ ํ•„์š”ํ•˜๋ฏ€๋กœ O(1)์ด ๋‹ค. ์ด ๊ฒฝ์šฐ N์ด ์ปค์ง€๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๊ฐ€ ํ›จ์”ฌ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ N์ด ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ์•Œ๊ณ  ๋ฆฌ์ฆ˜ 1์ด ์˜คํžˆ๋ ค ๋” ์ข‹๋‹ค. ๊ทธ๊ฒƒ์€ ๋ง์…ˆ์ด ๊ณฑ์…ˆ ๋˜๋Š” ๋‚˜๋ˆ—์…ˆ์— ๋น„ํ•ด ๋งค์šฐ ์ €๋ ดํ•œ ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, Big-O๋Š” ์š”์•ฝํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ N์ด ๋งค์šฐ ํด ๊ฒฝ์šฐ์—๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

UnsortedList์™€ SortedList์˜ ๋น„๊ต ์—ฐ์‚ฐ

UnsortedList

SortedList

size, isFull, isEmpty, reset, next

O(1)

O(1)

search

O(N)

O(N) O(logN) ์ด์ง„๊ฒ€์ƒ‰

insert ์ฐพ๊ธฐ ์‚ฝ์ž… ์ „์ฒด

O(1) O(1) O(1)

O(N) O(N) O(N)

delete ์ฐพ๊ธฐ ์‚ญ์ œ ์ „์ฒด

O(N) O(1) O(N)

O(N) O(N) O(N)

์ด ์žฅ์—์„œ ์‚ดํŽด๋ณธ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ Big-O ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋น„๊ตํ•˜์—ฌ ๋ณด์ž. ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋” ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ์‚ฝ์ž…์€ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋Š” ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋ฏ€๋กœ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์ข‹๋‹ค.

์‚ญ์ œ๋Š” ๋‘˜

๋‹ค ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋น„์šฉ์ด ์†Œ์š”๋˜์ง€๋งŒ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ญ์ œ ์ž์ฒด๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 63 -


์ œ6์žฅ ์Šคํƒ, ํ ์ด ์žฅ์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ(stack)๊ณผ ํ(queue) ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค.

6.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์Šคํƒ๊ณผ ํ์˜ ํŠน์„ฑ์„ ์‚ดํŽด๋ณด๊ณ , ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ๊ณผ ํ์˜ ๊ตฌํ˜„๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•œ๋‹ค.

6.2. ์Šคํƒ

์Šคํƒ โ€“ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„ ์Šคํƒ์˜ ํŠน์„ฑ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋™์งˆ ๊ตฌ์กฐ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๋งจ ์œ„(top)์— ์žˆ๊ณ , ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๋งจ ๋ฐ‘(bottom)์— ์žˆ๋‹ค. LIFO(LastLIFO(Last-InIn-FirstFirst-Out) ๊ตฌ์กฐ: ๊ตฌ์กฐ ์š”์†Œ์˜ ์ œ๊ฑฐ ๋˜๋Š” ์ถ”๊ฐ€๋Š” ์Šคํƒ์˜ top์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง„๋‹ค. ์—ฐ์‚ฐ push: ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ pop: ์š”์†Œ๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ๋งจ ์œ„ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ top: ์Šคํƒ์˜ ๋ณ€ํ™” ์—†์ด ๋งจ ์œ„ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ

์Šคํƒ์€ ๋ฆฌ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์งˆ ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์€ ์œ„์น˜์—์„œ ์ด ๋ฃจ์–ด์ง€๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๋™์ „์„ ์Œ“๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋™์ „์˜ ์ถ”๊ฐ€๋Š” ํ•ญ์ƒ ๋งจ ์œ„์— ์˜ฌ๋ ค๋†“์„ ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๋˜ํ•œ ๋™์ „์˜ ์ œ๊ฑฐ๋„ ๋งจ ์œ„์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ํ˜•ํƒœ๋ฅผ ์Šคํƒ์ด๋ผ ํ•œ๋‹ค. ์ด ๋•Œ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œ๋˜๋Š” ์œ„์น˜๋ฅผ ์Šคํƒ์˜ ํ†ฑ(top)์ด๋ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ถ”

- 65 -


๊ฐ€์™€ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์„ LIFO(Last-In-First-Out) ๊ตฌ์กฐ๋ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ€์žฅ ๋‚˜์ค‘ ์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ถ”์ถœ๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์Šคํƒ์€ ๋ณดํ†ต ํฌ๊ฒŒ push, pop, top ์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค. push๋Š” ์š”์†Œ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ด๊ณ , pop์€ ์Šคํƒ ํ†ฑ์— ์žˆ ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ด๋ฉฐ, top์€ ์Šคํƒ ํ†ฑ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์—ด๋žŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. push์™€ pop์€ ์Šคํƒ์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค์ง€๋งŒ top์€ ์Šคํƒ์˜ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ๋‹ค.

์Šคํƒ โ€“ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„ stack = new Stack()

stack.push(2)

stack.push(3)

3 2

stack.top()

stack.pop()

3

2

2

์˜ˆ์™ธ ์ƒํ™ฉ push: ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์—๋Š” ๋” ์ด์ƒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. pop, top: ์Šคํƒ์— ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์Šคํƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ์งธ, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ญ์— ์š”์†Œ๊ฐ€ ์žˆ์–ด ๋” ์ด์ƒ ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— push ์—ฐ์‚ฐ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ, pop, top ์—ฐ์‚ฐ์€ ์Šคํƒ์— ์•„๋ฌด๋Ÿฐ ์š”์†Œ๋„ ์—†์„ ๋•Œ pop ๋˜๋Š” top ์—ฐ์‚ฐ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ โ€“ ์˜ˆ์™ธ StackOverflowException: ์Šคํƒ์ด ๊ฝ‰ ์ฐจ์žˆ์„ ๋•Œ push๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋ฐœ์ƒ public class StackOverflowException extends RuntimeException{ public StackOverflowException(){ super(โ€œ์Šคํƒ์ด ๊ฝˆ ์ฐจ ์žˆ๋Š” ์ƒํƒœ์—์„œ push๋ฅผ ์‹œ๋„ํ•˜์˜€์Œ.โ€); } public StackOverflowException(String msg){ super(msg); } }

StackUnderflowException: ์Šคํƒ์ด ๋น„์–ด ์žˆ์„ ๋•Œ pop ๋˜๋Š” top์„ ์‹œ๋„ํ•˜๋ฉด ๋ฐœ์ƒ public class StackUnderflowException extends RuntimeException{ public StackUnderflowException(){ super(โ€œ์Šคํƒ์ด ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ pop/top์„ ์‹œ๋„ํ•˜์˜€์Œ.โ€); } public StackUnderflowException(String msg){ super(msg); } }

์ด ์žฅ๋ถ€ํ„ฐ๋Š” ADT๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒˆ๋กœ์šด ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. ์Šคํƒ์˜ ๊ฒฝ์šฐ์—๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด StackOverflowException๊ณผ StackUnderflowException์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ฐธ๊ณ ์ 

- 66 -


์œผ๋กœ ์ƒˆ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์ด ์˜ˆ์™ธ๋ฅผ checked ๋˜๋Š” unchecked๋กœ ํ•  ๊ฒƒ์ธ์ง€์— ๋”ฐ๋ผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅด๋‹ค. checked ์˜ˆ์™ธ์ด๋ฉด Exception ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ , unchecked ์˜ˆ ์™ธ์ด๋ฉด RuntimeException ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์ƒˆ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ์—๋Š” ๋ณดํ†ต ๋‘ ๊ฐœ์˜ ์ƒ์„ฑ์ž๋งŒ์„ ์ •์˜ํ•œ๋‹ค. ์ด๋“ค ์ƒ์„ฑ์ž๋Š” getMessage ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์Šคํƒ โ€“ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„ ๋ฒ”์šฉ ์Šคํƒ์˜ ๊ตฌ์„ฑ SortedList์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ์ง€๋งŒ ์Šคํƒ์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์Šคํƒ์—์„œ๋Š” search์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ด ํ•„์š” ์—†๋‹ค. Object ํด๋ž˜์Šค๋งŒ ํ™œ์šฉํ•˜์—ฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. Object ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์—๋Š” ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์œผ๋ฉด Listable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํƒ์€ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์—ฐ์‚ฐ์ด ์–ด๋–ค ๋น„๊ต ์—†์ด ์œ„์น˜์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ equals, compareTo์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ด ํ•„์š” ์—†๋‹ค. ๋”ฐ๋ผ์„œ Object ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์—๋Š” 4์žฅ์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด Listable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ์•ผ ํ•œ๋‹ค. ์ด ์žฅ์—์„œ๋Š” Listable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค.

ArrayStack ADT ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„ ์กฐ์ž‘ int topindex=-1; void push(Object item); isFull()์ด ์ฐธ์ด๋ฉด Object[] elements; StackOverflowException ์ฐธ๊ณ . ์ฐธ๊ณ . size๊ฐ€ ํ•„์š” ์—†์Œ ๋ฐœ์ƒ ์ƒ์„ฑ์ž void pop(); ArrayStack() isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด ArrayStack(int capacity); StackUnderflowException ๋ฐœ์ƒ ์ƒํƒœ Object top(); boolean isFull(); isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด ์กฐ๊ฑด: topindex==elements.length-1 StackUnderflowException boolean isEmpty(); ๋ฐœ์ƒ ์กฐ๊ฑด: topindex==-1

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ ADT๋Š” ์Šคํƒ์˜ ํ†ฑ์„ ๋‚˜ํƒ€๋‚ผ topindex์™€ ์ถ”๊ฐ€๋œ ์š”์†Œ๋“ค์„ ์ €์žฅํ•  Object ๋ฐฐ์—ด elements๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์Šคํƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋Š” topindex๋กœ๋ถ€ํ„ฐ ์–ป ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. isFull๊ณผ isEmpty ๋ฉ”์†Œ

- 67 -


๋“œ๋Š” ์—ญ์‹œ topindex ์ •๋ณด๋ฅผ ํ†ตํ•ด ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. Listable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์‚ฌ ๋ฐฉ์‹ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋”๋ผ๋„ ์ด ์Šฌ๋ผ์ด๋“œ์ฒ˜๋Ÿผ ์ž…๋ ฅ ํƒ€์ž…, ์ถœ๋ ฅ ํƒ€์ž…, ๋‚ด๋ถ€ ๋ฐฐ์—ด ํƒ€์ž…์€ ๊ณ„์† Object๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. push ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž ํƒ€์ž…์„ Listable๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ Object๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Listable ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ๋Š” ์ด ์‚ฌ์‹ค์„ ์•Œ๊ณ  ๋ณดํ†ต Listable ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ Object ํƒ€์ž…์œผ๋กœ ๋˜์–ด ์žˆ ์œผ๋ฉด Listable ํƒ€์ž…์ด ์š”๊ตฌ๋˜๋Š”์ง€ ๋ชฐ๋ผ Listable ํƒ€์ž…์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ์ด ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์ธ์ž ํƒ€์ž…์„ Listable๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด์ง€ ๋งŒ ์ด๋ฒˆ ์žฅ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ž ํƒ€์ž…์ด๋‚˜ ์ถœ๋ ฅ ํƒ€์ž…์œผ ๋กœ Object ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.

push public void push(Object item) throws StackOverflowException{ if(isFull()) throw new StackOverflowException(โ€œPush attempted on a full stack.โ€); Listable x = (Listable)item; topindex++; elements[topindex] = x.clone(); } topindex = -1

topindex = 0

topindex = 1

topindex = 2

2

2

2

push(2)

push(3)

3

push(5)

3 2

2

3

5

5

3 2

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ 0๋ฒˆ์งธ ์ƒ‰์ธ์„ ์Šคํƒ์˜ ํ†ฑ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด topindex ์ •๋ณด ์ž์ฒด ๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ด๋™ํ•ด ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์ด๋™ ์—†์ด ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ถ” ๊ฐ€ํ•˜๋“ฏ์ด ๋งจ ๋์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค topindex ์ •๋ณด๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œ ํ‚จ ํ›„์— ๊ทธ ์œ„์น˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.

- 68 -


push โ€“ ๊ณ„์† topindex = 3

2 push(1)

3 5 1

topindex = 4

2

1 5 3 2

push(7)

3 5 1

topindex = 3

7

2

1 5 3 2

push(8)

pop()

์‹คํŒจ

3 5 1

1 5 3 2

7

pop, top public void pop() throws StackUnderflowException{ if(isEmpty()) throw new StackUnderflowException(โ€œPop attempted on an empty stackโ€); elements[topindex] = null; // ๋ถˆํ•„์š” topindex--; } public Object top() throws StackUnderflowException{ if(isEmpty()) throw new StackUnderflowException(โ€œTop attempted on an empty stackโ€); Listable x = (Listable)elements[topindex]; return x.clone(); }

pop ์—ฐ์‚ฐ์€ topindex๋ฅผ ํ•˜๋‚˜ ๊ฐ์†Œ๋งŒ ์‹œํ‚ค๋ฉด ๋œ๋‹ค. ์ด ๋•Œ elements[topindex] = null ๋ฌธ์žฅ์€ ๋ฐ˜๋“œ์‹œ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ž๋ฐ”์˜ garbage collection์„ ์ด‰์ง„์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ ์— ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์— ๋”ฐ๋ผ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

- 69 -


ArrayList๋ฅผ ์ด์šฉํ•œ Stack์˜ ๊ตฌํ˜„ ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ public class ArrayListStack{ ์šฉ๋Ÿ‰์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ private ArrayList stack; ์•Š๋‹ค. ๋”ฐ๋ผ์„œ push๋Š” public ArrayListStack(){ stack = new ArrayList(); } ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋ฉฐ, public void push(Object item){ stack.add(item); } isFull์ด ์ฐธ์ด ๋˜๋Š” public void pop() throws StackUnderflowException{ ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค. if(isEmpty()) add๋Š” ํ•ญ์ƒ ๋ฆฌ์ŠคํŠธ throw new StackUnderflowException(โ€œโ€ฆโ€); ๋์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ stack.remove(stack.size()-1); ์Šคํƒ์„ ArrayList๋กœ } ๊ตฌํ˜„ํ•˜์—ฌ๋„ ๋น„์šฉ ์ธก๋ฉด public Object top() throws StackUnderflowException{ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. if(isEmpty()) throw new StackUnderflowException(โ€œโ€ฆโ€); by clone ๋ฐฉ์‹์œผ๋กœ return stack.get(stack.size()-1); ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ์—๋Š” } ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค. public boolean isEmpty() { return (stack.size() == 0); } public void push(Object item){ public boolean isFull() { return false; } Listable x = (Listable)item; } stack.add(x.clone()); }

์Šคํƒ์˜ push, pop, top ์—ฐ์‚ฐ์€ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋ ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น๋˜๋ฏ€๋กœ ๋‹จ์ˆœ ๋ฐฐ์—ด ๋Œ€์‹ ์— ์ด๋ฏธ ๊ฐœ๋ฐœํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋‚˜ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ArrayList๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

- 70 -


6.3. ํ

ํ โ€“ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„ ํ(queue)์˜ ํŠน์„ฑ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋™์งˆ ๊ตฌ์กฐ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค(rear)์— ์žˆ๊ณ , ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๋งจ ์•ž(front)์— ์žˆ๋‹ค. FIFO(FirstFIFO(First-InIn-FirstFirst-Out) ๊ตฌ์กฐ: ๊ตฌ์กฐ ์š”์†Œ์˜ ์ถ”๊ฐ€๋Š” ํ์˜ ๋์— ์ด๋ฃจ์–ด์ง€๊ณ , ์š”์†Œ์˜ ์ œ๊ฑฐ๋Š” ์•ž์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์—ฐ์‚ฐ enqueue: ์š”์†Œ๋ฅผ ํ์˜ ๋์— ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ dequeue: ํ์˜ ๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ

ํ๋Š” ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์œ„์น˜์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํƒ๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ™์€ ์œ„ ์น˜์—์„œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋ชจ๋‘ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ์ผ์–ด ๋‚œ๋‹ค. ๋ฒ„์Šค์— ์Šน์ฐจํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ ฌ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ฐ”๋กœ ์ „ํ˜•์ ์ธ ํ์˜ ๋ชจ์Šต์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋จผ์ € ์Šน์ฐจํ•˜๋Š” ์‚ฌ๋žŒ์€ ์ค„ ๋งจ ์•ž์— ์žˆ๋Š” ์‚ฌ๋žŒ์ด๊ณ , ๋‚˜์ค‘์— ์˜จ ์‚ฌ๋žŒ์ผ์ˆ˜๋ก ์ค„ ๋์— ์žˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ์—์„œ ์‚ฝ์ž…์€ ํ์˜ ๋งจ ๋’ค์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ , ์‚ญ์ œ๋Š” ๋งจ ์•ž์—์„œ ์ด๋ฃจ์–ด์ง„ ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์‚ญ์ œ๋˜๋ฏ€๋กœ ํ๋ฅผ FIFO(First-In-First-Out) ๊ตฌ์กฐ๋ผ ํ•œ๋‹ค. ํ๋Š” ํฌ๊ฒŒ enqueue, dequeue ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค. enqueue๋Š” ํ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ด๊ณ , dequeue๋Š” ํ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ์Šคํƒ๊ณผ ๋‹ฌ๋ฆฌ ํ๋Š” pop๊ณผ top ์—ฐ์‚ฐ์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ dequeue์—์„œ ๋ชจ๋‘ ์ œ๊ณตํ•œ๋‹ค.

ํ โ€“ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„ queue = new Queue()

queue.enq(2)

2

queue.enq(3)

3

queue.enq(1)

2

1

3

queue.deq()

2

1

3

์˜ˆ์™ธ ์ƒํ™ฉ enqueue: ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์—๋Š” ๋” ์ด์ƒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. dequeue: ํ์— ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„๋„ ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ญ์— ์š”์†Œ๊ฐ€ ๋“ค์–ด์žˆ์„ ๋•Œ

enqueue๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. ํ์— ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์— dequeue๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค

- 71 -


QueueOverflowException๊ณผ QueueUnderflowException๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์Šคํƒ์— ์„œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

๊ณ ์ •๋œ Front ์„ค๊ณ„ ๋ฐฉ๋ฒ• front=0, rear=-1 front=0, rear=0

enq(10);

10

enq(20);

10

20

enq(30);

10

20

30

20

30

deq(); 20

front=0, rear=1 front=0, rear=2

front=0, rear=1

30

๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์Šฌ๋กฏ์„ ํ•ญ์ƒ front๋กœ ๊ณ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹ค์ œ front ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š” ์—†์Œ enq๋Š” ํ•ญ์ƒ size-1 ์Šฌ๋กฏ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. rear ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋„ ํ•„์š” ์—†์Œ front, rear, size ์ค‘ size ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ deq์˜ ๊ฒฝ์šฐ์—๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ n-1๊ฐœ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„์—์„œ ํ์˜ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ณ ์ •๋œ front ์„ค๊ณ„ ๋ฐฉ๋ฒ•, ์œ ๋™ front ์„ค๊ณ„ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค. ๊ณ ์ •๋œ front ์„ค๊ณ„ ๋ฐฉ๋ฒ•์—์„œ ๋Š” ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ํ•ญ์ด ํ•ญ์ƒ ํ์˜ ๋งจ ์•ž์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ์—์„œ ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ๋ชจ๋“  ์š”์†Œ ๋ฅผ ํ•˜๋‚˜์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ ๋งจ ์•ž์˜ ์œ„์น˜๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋งจ ์•ž ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ํ์˜ ๋งจ ๋’ค ์ •๋ณด๋„ ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณ„๋„๋กœ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ด์šฉ ํ•˜์—ฌ ํ์˜ ๋งจ ์•ž, ํ์˜ ๋งจ ๋’ค, ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์œ ๋™ Front ์„ค๊ณ„ ๋ฐฉ๋ฒ• enq(10);

10

deq(); enq(20);

20

enq(30);

20

30

enq(40);

20

30

40

enq(50);

20

30

40

20

30

40

enq(60);

60

front=0, rear=-1 front=0, rear=0 front=1, rear=0 front=1, rear=1 front=1, rear=2 front=1, rear=3 50 front=1, rear=4 50 front=1, rear=0

front๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. enq, deq ๋ชจ๋‘ O(1)์ด๋‹ค. enq: rear ์ฆ๊ฐ€ deq: front ์ฆ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ front, rear ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, front์™€ rear ๊ฐ’์„ ํ†ตํ•ด ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ size ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์˜ˆ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด full ์ƒํƒœ์™€ empty ์ƒํƒœ์—์„œ front์™€ rear ๊ฐ’์˜ ์ฐจ์ด๊ฐ€ ๋™์ผํ•จ

์œ ๋™ front ์„ค๊ณ„ ๋ฐฉ๋ฒ•์—์„œ๋Š” ํ์˜ ๋งจ ์•ž ์œ„์น˜๊ฐ€ ๊ณ„์† ๋ฐ”๋€๋‹ค. ๋”ฐ๋ผ์„œ ๋งจ ์•ž ์œ„์น˜์™€ ๋งจ ๋’ค ์œ„ ์น˜๊ฐ€ ๋ชจ๋‘ ๋ณ€ํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. enqueue๋ฅผ ํ•  ๊ฒฝ์šฐ์—๋Š” ํ ๋’ค์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋งจ ๋’ค ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”

rear ๊ฐ’์„ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•˜์ง€๋งŒ ๋งจ ์•ž ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” front ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋Œ€

- 72 -


๋กœ dequeue๋ฅผ ํ•  ๊ฒฝ์šฐ์—๋Š” ํ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์ด๋ฏ€๋กœ front ๊ฐ’์ด ํ•˜๋‚˜ ์ฆ๊ฐ€ ํ•˜์ง€๋งŒ rear ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์Šฌ๋ผ์ด๋“œ์ฒ˜๋Ÿผ front์™€ rear ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฉด ์ด ๋‘ ์ •๋ณด๋ฅผ ํ†ตํ•ด ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์€ ํ๊ฐ€ ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์™€ ํ๊ฐ€ ๊ฝ‰ ์ฐฌ ์ƒํƒœ๊ฐ€ ์ด ๋‘ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์œ ๋™ front ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ํ์˜ ๋งจ ์•ž, ํ์˜ ๋งจ ๋’ค, ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐ€์ง€ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ๊ฐ๊ฐ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๊ณ ์ • front ์„ค๊ณ„ ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋˜์ง€๋งŒ dequeue ์—ฐ ์‚ฐ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ๋น„์šฉ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋Œ€๋กœ ์œ ๋™ front ์„ค๊ณ„ ๋ฐฉ์‹์€ ๋ณดํ†ต 3๊ฐœ์˜ ๋ฉค๋ฒ„๋ณ€ ์ˆ˜๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ enqueue์™€ dequeue๋ฅผ ๋ชจ๋‘ O(1)์˜ ๋น„์šฉ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ArrayQueue ADT ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์œ ๋™ front ๋ฐฉ์‹์˜ ํ ๊ตฌํ˜„ int front=0; int rear=-1; int size=0; Object[] elements; ์ƒ์„ฑ์ž ArrayQueue() ArrayQueue(int capacity);

์ƒํƒœ boolean isFull(); ์กฐ๊ฑด: size==elements.length boolean isEmpty(); ์กฐ๊ฑด: size==0 ์กฐ์ž‘ void enq(Object item); isFull()์ด ์ฐธ์ด๋ฉด QueueOverflowException ๋ฐœ์ƒ

Object deq(); isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด QueueUnderflowException ๋ฐœ์ƒ

์ด ์ ˆ์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ํ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณธ๋‹ค. ์ด ๋•Œ ์œ ๋™ front ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, Object ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์ง€๋งŒ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ์œ ๋™

front์˜ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ์˜ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ isFull๊ณผ isEmpty ๋ฉ”์†Œ๋“œ๋Š” size ๋ฉค๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

Enqueue public void enq(Listable item) throws QueueOverflowException{ if(isFull()) throw new QueueOverflowException(โ€œEnqueue attempted on a full queue.โ€); rear = (rear + 1) % elements.length; elements[rear] = item.clone(); size++; } 10 deq();

20

30

40

50

20

30

40

50

deq(); enq(55);

55

enq(70);

55

70

30

40

30

40

30

40

front=0, rear=4 front=1, rear=4

front=2, 50 rear=4 front=2, 50 rear=0 50

front=2, rear=1

30 deq();

40

front=2, rear=3 front=3, rear=3 front=4, rear=3 front=4, 55 rear=4

deq(); enq(55); enq(70);

40

65

55 front=4, rear=0

enqueue ์—ฐ์‚ฐ์€ ์ƒˆ ์š”์†Œ๋ฅผ ํ ๋์— ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ์ด ์—ฐ์‚ฐ์ด ์„ฑ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„ 

- 73 -


ํ๊ฐ€ ๊ฝ‰ ์ฐฌ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค. ํ๊ฐ€ ๊ฝ‰ ์ฐฌ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ ๋ ์ •๋ณด๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚จ ํ›„์— ๊ทธ ์œ„์น˜์— ์ƒˆ ์š”์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ๋‹ค. enqueue ์—ฐ์‚ฐ์€ ํ ์•ž ์ •๋ณด์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

Dequeue public Object deq() throws QueueUnderflowException{ if(isEmpty()) throw new QueueUnderflowException(โ€œDequeue attempted on an empty queueโ€); Object tmp = element[front]; elements[front] = null; // ๋ถˆํ•„์š” front = (front + 1) % elements.length; size--; return tmp; // tmp.clone() ๋ถˆํ•„์š” } int loc = front; front = (front + 1) % elements.length; size--; return elements[loc];

dequeue ์—ฐ์‚ฐ์€ ํ ๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ํ ์•ž ์ •๋ณด์— ์žˆ ๋Š” ์š”์†Œ๋ฅผ ์ž„์‹œ ๋ณด๊ด€ํ•œ ํ›„์— ํ front ์ •๋ณด๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ์ž„์‹œ ๋ณด๊ด€ํ•˜์˜€๋˜ ์š”์†Œ๋ฅผ ๋ฐ˜ ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์š”์†Œ ์ž์ฒด๋ฅผ ์ž„์‹œ ๋ณด๊ด€ํ•˜๋Š” ๋Œ€์‹ ์— ๊ทธ ์œ„์น˜๋ฅผ ๋ณด๊ด€ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ฑ ๋Šฅ์ด๋‚˜ ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ ๋‘ ๋ฐฉ๋ฒ•์€ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

ํšจ์œจ์ ์ธ ์œ ๋™ front ๊ตฌํ˜„ front์™€ rear ์ •๋ณด๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ํ์˜ ์ƒํƒœ(full ๋˜๋Š” empty)๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ํ˜„์žฌ ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ์—๋Š” ๋‘ ์กฐ๊ฑด์ด ๊ฐ™๋‹ค. ๋‘ ์กฐ๊ฑด์ด ๊ฐ™์œผ๋ฏ€๋กœ ์ด ์กฐ๊ฑด์„ ๊ตฌ๋ถ„ํ•˜๋Š” boolean flag์„ ์‚ฌ์šฉํ•œ๋‹ค. size๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ์—†์Œ public void enq(Object item) throws QueueOverflowException{ if(isFull()) throw new QueueOverflowException(โ€œโ€ฆโ€); Listable x = (Listable)item; rear = (rear + 1) % elements.length; elements[rear] = x.clone(); isFull = ((rear + 1) % elements.length)==front)? true : false; }

๋ฐฐ์—ด์˜ ํ•œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. (How?)

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์œ ๋™ front ์„ค๊ณ„ ๋ฐฉ์‹์—์„œ๋Š” ํ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด๋งŒ์„ ์ด์šฉํ•˜ ์—ฌ ํ์˜ ์ƒํƒœ๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ์ด๊ฒƒ์€ ํ๊ฐ€ ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์™€ ํ๊ฐ€ ๊ฝ‰ ์ฐฌ ์ƒํƒœ์—์„œ ํ ์˜ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด์˜ ์ƒํƒœ๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒƒ์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ flag์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๊ณต๊ฐ„์  ์ธ ์ด์ ์ด ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฐฐ์—ด์˜ ํ•œ ๊ณต๊ฐ„์„ ๋Š˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณ„๋„์˜ flag์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‘ ์ƒํƒœ๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 74 -


ํšจ์œจ์ ์ธ ์œ ๋™ front ๊ตฌํ˜„ โ€“ ๊ณ„์† ์ด ๋ฐฉ๋ฒ•์€ size ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋ฐฐ์—ด ํ•œ ์Šฌ๋กฏ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ณต๊ฐ„ ์ธก๋ฉด์—์„œ๋Š” ๊ธฐ์กด size๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๋Š” ์—†๋‹ค. ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ๋Š” size๋ฅผ deq(); ์œ ์ง€ํ•˜๋Š” ๋น„์šฉ์ด ์—†์œผ๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค.

front=5, rear=5 front=5, rear=0

10 20

30

40

50

front=5, rear=4

20

30

40

50

front=0, rear=4

deq();

30

40

50

front=1, rear=4

enq(60);

30

40

50

10

60

front=1, rear=5

๋ฐฐ์—ด์˜ ํ•œ ํ•ญ์„ ๋Š˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ์˜ ๋งจ ์•ž ์ •๋ณด๊ฐ€ ํ์˜ ๋งจ ์•ž์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์‹ ์— ๋ฐ”๋กœ ์ „ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๋ฉด ๋ณ„๋„์˜ flag์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ์˜ ๋งจ ์•ž ์ •๋ณด์™€ ๋งจ ๋’ค ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ์˜ ์ƒํƒœ๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋„ ๋Š˜ ํ•œ ๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ธฐ์กด์˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด ๋ณ„๋กœ ํ–ฅ์ƒ๋œ ์ ์ด ์—†๋‹ค.

- 75 -


์ œ7์žฅ ์—ฐ๊ฒฐ๊ตฌ์กฐ ์ด ์žฅ์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๊ฐ ์ข… ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

7.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์ˆœํ™˜ ํ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„

7.2. ์—ฐ๊ฒฐ๊ตฌ์กฐ

์—ฐ๊ฒฐ๊ตฌ์กฐ๋ž€ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ž€ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๊ณ ์ •๋œ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ํ™•๋ณดํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ตฌ์กฐ ๋งํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์—์„œ๋Š” ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•˜๋ฉฐ, ์ด ๊ณต๊ฐ„์ด ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋˜๊ฑฐ๋‚˜ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค. ArrayList์ฒ˜๋Ÿผ ๋ถ€์กฑํ•˜๋ฉด ๋ณด๋‹ค ํฐ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์—ฌ ์ƒˆ ๊ณต๊ฐ„์— ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๋•Œ ๋งŽ์€ ๋น„์šฉ์ด ์†Œ์š”๋œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ™•๋ณดํ•œ ๊ณต๊ฐ„์„ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด ์ €์žฅํ•œ ์š”์†Œ๋“ค์„ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ์ด๊ฒƒ์ด ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์ด๋‹ค. ํ•„์š” info

info

info

info

info

info

๋ฐฐ์—ด๋ฐฉ์‹

info

info

์—ฐ๊ฒฐ ๊ตฌ์กฐ ๋ฐฉ์‹

์—ฐ๊ฒฐ๊ตฌ์กฐ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ๊ณ ์ •๋œ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•˜์—ฌ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ํ™•๋ณดํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„ ๋‚ญ๋น„ ๋˜๋Š” ๋ถ€์กฑ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฌผ๋ก  ๋ฐฐ์—ด ๋„ ๊ณต๊ฐ„ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ArrayList์ฒ˜๋Ÿผ ๋ถ€์กฑํ•  ๋•Œ๋งˆ๋‹ค ๋ณด๋‹ค ํฐ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์—ฌ

- 77 -


ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํฐ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์—ฌ ๊ธฐ์กด ์ •๋ณด๋ฅผ ์ด๋™ํ•˜๋Š” ๋น„์šฉ์ด ๋งค์šฐ ํฌ๋ฉฐ, ๊ณต๊ฐ„ ๋‚ญ๋น„ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•œ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค์„ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๋ฐฐ์—ด๋ณด๋‹ค ๋‘ ๋ฐฐ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

์—ฐ๊ฒฐ๊ตฌ์กฐ vs. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹

๊ณต๊ฐ„๋ถ€์กฑ/๋‚ญ๋น„ ๋ฌธ์ œ ํ•œ ์š”์†Œ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„ ๊ณต๊ฐ„ ํ™•๋ณด ๋น„์šฉ

๊ฐ ์š”์†Œ ์ ‘๊ทผ ๋ฐฉ์‹

์ค‘๊ฐ„์— ์š”์†Œ ์‚ฝ์ž…

์—ฐ๊ฒฐ๊ตฌ์กฐ

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹

์—†์Œ

์žˆ์Œ

์š”์†Œ+์—ฐ๊ฒฐ ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ํ™•๋ณดํ•ด์•ผ ํ•จ ์ˆœ์ฐจ ์ •๋ ฌ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ์—๋„ ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์—†์Œ ์—ฐ๊ฒฐ๋งŒ ๋ณ€๊ฒฝ (์ƒ์ˆ˜ ์‹œ๊ฐ„)

์š”์†Œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•  ๋•Œ ํ•œ๋ฒˆ ํ™•๋ณด ์ž„์˜ ์ •๋ ฌ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ ์ •๋ ฌ ๊ตฌ์กฐ์ผ ๊ฒฝ์šฐ์—๋Š” ํ›„์† ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ์ด๋™ํ•ด์•ผ ํ•จ.

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

- 78 -


7.3. ์Šคํƒ

Stack๊ณผ Queue์˜ Class Hierarchy Stack

ArrayStack

LinkedStack

use inner class

StackNode

LinkedQueue

use inner class

QueueNode

Queue

ArrayQueue

6์žฅ์—์„œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ๊ณผ ํ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด ์ ˆ์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ ๊ณผ ํ์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉฐ, ์ด๋“ค ํด๋ž˜์Šค ๊ฐ„์— ๊ด€๊ณ„๋Š” ์ด ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์„œ Stack๊ณผ

Queue๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„์€ ๋‘˜ ๋‹ค ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์ „ํ˜€ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์žฌ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹ ์— ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๋ฐฐ์—ด๋กœ ์Šคํƒ์˜ ๊ตฌํ˜„ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ์˜ ๋ฌธ์ œ์  ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ƒ์„ฑํ•  ๋•Œ ๊ณ ์ •๋จ ร† ๊ณต๊ฐ„์˜ ๋‚ญ๋น„, ๊ณต๊ฐ„์˜ ๋ถ€์กฑ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ์˜ ๋ฌผ๋ฆฌ์  ๋ทฐ vs. ๋…ผ๋ฆฌ์  ๋ทฐ ArrayStack stack = new ArrayStack(4); stack

topIndex element

-1 null

null

null

null

null

null

null

stack.push(new Integer(10)) stack

topIndex

0

element

10

- 79 -

10


์—ฐ๊ฒฐ๊ตฌ์กฐ๋กœ ์Šคํƒ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ info

link

info

A

link

info

B

null

private class StackNode{ public Object info; public StackNode link; }

C

์—ฐ๊ฒฐ๊ตฌ์กฐ๋กœ ์Šคํƒ์˜ ๊ตฌํ˜„ stack.push(new Integer(20));

LinkedStack stack = new LinkedStack(); stack

top

null

stack

top

stack.push(new Integer(10)); stack

top

info

null

10

info

info

20

10

null

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์—์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„๊ณผ ๋‹ค๋ฅธ ์š”์†Œ๋“ค ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋‘ ๊ณต๊ฐ„์„ ํ•ฉ์ณ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ ๋ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด ๊ธฐ ์œ„ํ•œ ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ๋ณดํ†ต ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋…ธ๋“œ ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค. ์ด ํƒ€์ž…์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜๋‚˜๋Š” ์‹ค์ œ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์ด๊ณ , ๋‹ค๋ฅธ ํ•˜ ๋‚˜๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์ด๋‹ค.

LinkedStack ADT ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„ StackNode top = null;

์กฐ์ž‘ void push(Object item);

์—ฐ๊ฒฐ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์ƒ‰์ธ์ด ์•„๋‹Œ ์ฐธ์กฐ ํƒ€์ž…์œผ๋กœ ์Šคํƒ top์„ ์œ ์ง€ํ•จ

StackOverflowException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

void pop();

์ƒ์„ฑ์ž LinkedStack() ์ƒํƒœ boolean isFull(); ์กฐ๊ฑด: ํ•ญ์ƒ ๊ฑฐ์ง“ boolean isEmpty(); ์กฐ๊ฑด: top==null

isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด StackUnderflowException ๋ฐœ์ƒ

Object top(); isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด StackUnderflowException ๋ฐœ์ƒ stack

top

null

์Šคํƒ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ์Šคํƒ ํ†ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด์ด๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ๋Š” ๋ฐฐ ์—ด์˜ ํŠน์ • ์ƒ‰์ธ์ด ์Šคํƒ ํ†ฑ ์—ญํ• ์„ ํ•˜์˜€์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ๊ฐ’์ด ์ด ์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ๋Š” ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ์— ์š” ์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด ๋” ์ด์ƒ ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ์—์„œ๋Š” ์‹œ์Šคํ…œ ์—์„œ ๋” ์ด์ƒ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ƒˆ ์š”์†Œ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์—์„œ isFull ๋ฉ”์†Œ๋“œ๋Š” ๋ณดํ†ต ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ •์˜ํ•˜๋ฉฐ, ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ ์ž…ํ•˜๋Š” ์—ฐ์‚ฐ์€ OverflowException์˜ ๋ฐœ์ƒ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.

- 80 -


Inner Class public class LinkedStack implements Stack{ private class StackNode{ public Object item; public StackNode link; } private StackNode top = null; public StackNode() {} โ€ฆ }

ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜ํ•œ ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค(inner class)๋ผ ํ•œ๋‹ค.

class public class private class

private ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๊ทธ๊ฒƒ์˜ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ public์œผ๋กœ ์„ ์–ธํ•˜์—ฌ๋„ ์•ˆ์ „ํ•˜๋‹ค.

public class

ํŒจํ‚ค์ง€

์ž๋ฐ”์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋ฅผ ๋ณดํ†ต ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋Š” ํ•ด ๋‹น ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ํ•„์š”ํ•œ ์ •๋ณด์ด๋ฉฐ ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ •๋ณด๋“ค์€ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ž ๋ฐ”์—์„œ private ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋ฌผ๋ก  ๊ฐ™์€ ํŒจ๊ธฐ์ง€ ๋‚ด์— ์žˆ๋Š” ๋‹ค ๋ฅธ ํด๋ž˜์Šค๋“ค๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ํด๋ž˜ ์Šค๋กœ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ๊ฐ™์€ ์ด์œ ์—์„œ private ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค์€

public์œผ๋กœ ์ง€์ •ํ•˜์—ฌ๋„ ์•ˆ์ „ํ•˜๋‹ค.

Inner Class ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•œ ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ๊ตฌํ˜„ (๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ)์„ ์ ‘๊ทผ ๊ถŒํ•œ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ชจ๋‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค. (name control ์ธก๋ฉด) ์—ฐ๊ฒฐ ๊ตฌ์กฐ์—์„œ๋Š” ์ด ์ธก๋ฉด ๋•Œ๋ฌธ์— ์‚ฌ์šฉ private ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๊ฑด ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. top level class

๋‹น์—ฐํ•œ ํŠน์„ฑ inner class

์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ๊ตฌํ˜„์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. static inner class์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.

์ฐธ๊ณ ์ ์œผ๋กœ ์ž๋ฐ”์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด๋Š” ๊ทธ๊ฒƒ์˜ ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ ‘๊ทผ ๊ถŒํ•œ๊ณผ ์ƒ๊ด€์—†์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๋ฉค๋ฒ„์ธ ๋‚ด๋ถ€ ํด๋ž˜ ์Šค ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

- 81 -


public class Test{ public static void main(String[] args){ public class Outer{ Outer obj = new Outer(2, 3); private int oVal; obj.g(3); private Inner X; obj.print(); private class Inner{ } private int iVal; } public Inner(int n){ ๊ฒฐ๊ณผ: oVal = 6, iVal = 9 iVal = n; } obj public void f(int n){ iVal = oVal + n; // Outer.this.oVal+n oVal X } 2 ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ } // class Inner private ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. public Outer(int n1, int n2){ oVal = n1; X = new Inner(n2); } ์™ธ๋ถ€ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ public void g(int n){ private ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 3 oVal = X.iVal + n; X.f(n); iVal Outer } public void print(){ System.out.println("oVal = "+oVal+", " ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ +"iVal = "+X.iVal); ์ด ๊ฐ์ฒด์˜ ์™ธ๋ถ€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” } ํ˜„์žฌ ๊ฐ์ฒด์˜ this๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค. } // class Outer

Outer ํด๋ž˜์Šค์˜ ๊ฐ์ฒด obj๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด obj๋Š” ๋ฉค๋ฒ„๋กœ ๋‚ด๋ถ€ ํด๋ž˜์Šค ํƒ€์ž…์ธ X๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ด obj๋Š” private์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  X์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ธ iVal์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ X ํ•ธ๋“ค์„ ์ด์šฉํ•˜์—ฌ iVal์„ ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ obj์˜ ๋ฉค๋ฒ„์ธ X๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ๋ฉ” ์†Œ๋“œ์—์„œ ์ž์‹ ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ ๊ฐ์ฒด obj์˜ private ๋ฉค๋ฒ„์ธ oVal์„ ๋‹จ์ˆœ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ํฌํ•จํ•˜๋Š” ์™ธ๋ถ€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ ๋ฉฐ, ์ž์‹ ์„ ํฌํ•จํ•˜๋Š” ์™ธ๋ถ€ ๊ฐ์ฒด๋Š” ์˜ค์ง ํ•˜๋‚˜์ด๋ฏ€๋กœ ๋‹จ์ˆœ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋”๋‹ค๋กœ ๋ชจํ˜ธํ•˜์ง€ ์•Š ๋‹ค.

push push ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„ 1. ์ƒˆ ์š”์†Œ๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ ์ƒ์„ฑ ๋‹จ๊ณ„ 2. ์ด ์š”์†Œ์˜ info ๊ฐ’์— item ํ• ๋‹น ๋‹จ๊ณ„ 3. ์ด ์š”์†Œ์˜ link๊ฐ€ ๊ธฐ์กด top์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ ๋‹จ๊ณ„ 4. top์ด ์ด ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ stack

public void push(Object item){ StackNode newNode = new StackNode(); newNode.info = item; newNode.link = top; top = newNode; }

top

4 1. ์ƒ์„ฑ info

info

null

3 2

10

20

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ ๊ตฌํ˜„์—์„œ๋Š” ์ƒˆ ์š”์†Œ๋ฅผ ํ•ญ์ƒ ๋งจ ๋์— ์‚ฝ์ž…ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹ ์—์„œ๋Š” ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋Š” ์ฒซ ์š”์†Œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์„ ์ด์šฉํ•œ ์Šคํƒ ๊ตฌํ˜„์—์„œ๋Š” ์ƒˆ ์š”์†Œ๋ฅผ ์ฒซ ์š”์†Œ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์—์„œ ์ฒซ ์š”์†Œ๊ฐ€ ์Šค ํƒ์˜ ํ†ฑ์ด ๋œ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„์—์„œ ์š”์†Œ ์‚ฝ์ž…๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ์—์„œ ์ผ๋ฐ˜ ์ ์œผ๋กœ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ผ์€ ์ƒˆ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์ด๋‹ค. ๋˜ํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์—ฐ๊ฒฐ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ˆœ์„œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ์˜ˆ์—

- 82 -


์„œ newNode.link = top ๋ฌธ์žฅ๊ณผ top = newNode ๋ฌธ์žฅ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ธฐ์กด ์š”์†Œ๋“ค๊ณผ์˜ ์—ฐ ๊ฒฐ์ด ๋Š์–ด์ง€๊ฒŒ ๋œ๋‹ค.

pop pop ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„ 1. ์Šคํƒ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•จ ๋‹จ๊ณ„ 2. top์ด top.link์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ

stack

top

public void pop() throws StackUnderflowException{ if(isEmpty()) throw new StackUnderflowException(โ€œโ€ฆโ€); top = top.link; }

1 info

info

20

10

null

garbage

์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ์ฒซ ์š”์†Œ๊ฐ€ ์Šคํƒ์˜ ํ†ฑ์ด ๋˜๋ฏ€๋กœ pop ์—ฐ์‚ฐ์€ ์ฒซ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰, ์ฒซ ์š” ์†Œ๋ฅผ ์Šคํƒ ํ†ฑ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ push์™€ pop ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

top public Object top() throws StackUnderflowException{ if(isEmpty()) throw new StackUnderflowException(โ€œโ€ฆโ€); return top.info; }

stack

top

info

info

null

10 20

top ์—ฐ์‚ฐ์€ ์Šคํƒ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์Šคํƒ์˜ ํ†ฑ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

- 83 -


ArrayStack VS. LinkedStack ArrayStack

LinkedStack

push

O(1)

O(1)

pop

O(1)

O(1)

constructor space

O(N)

O(1)

N+1 ์ฐธ์กฐ, 1 ์ƒ‰์ธ

2N+1 ์ฐธ์กฐ (no waste)

Which one is better? ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ LinkedStack์ด ์šฐ์ˆ˜ ์Šคํƒ์˜ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ๊ฐ€๋ณ€์ ์ธ ๊ฒฝ์šฐ LinkedStack์ด ์šฐ์ˆ˜ ArrayStack์€ ๊ณต๊ฐ„ ๋‚ญ๋น„ ๊ฐ€๋Šฅ push๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ: ArrayStack ์šฐ์ˆ˜ LinkedStack์€ ๋งค๋ฒˆ ์ƒˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผํ•จ

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์Šคํƒ ๊ตฌํ˜„์„ ๋น„๊ตํ•˜์—ฌ ๋ณด์ž. ์œ„ ํ‘œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‘ ๊ตฌํ˜„ ๋ชจ๋‘ push์™€ pop์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์€ ๊ณต๊ฐ„์„ ์ดˆ ๊ธฐ์— ๋ชจ๋‘ ํ™•๋ณดํ•˜๋Š” ๋ฐ˜๋ฉด ์Šคํƒ์€ ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ™•๋ณดํ•œ๋‹ค. ๊ณต๊ฐ„์ ์ธ ์ธก๋ฉด์—์„œ๋Š” ๋ฐฐ์—ด์— N๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด N+1 ์ฐธ์กฐ์™€ ์Šคํƒ์˜ ํ†ฑ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ‰์ธ ์ •๋ณด ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์€ ์ดˆ๊ธฐ์— ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ , ์ด ๊ณต๊ฐ„์ด ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‚ญ๋น„๊ฐ€ ๋˜๋Š” ๊ณต๊ฐ„์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ N๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ ๋‹ค๋ฉด 2N๊ฐœ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋ฉฐ, ์Šคํƒ์˜ ํ†ฑ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„ ์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ณต๊ฐ„๋“ค ์ค‘์— ๋‚ญ๋น„๊ฐ€ ๋˜๋Š” ๊ณต๊ฐ„์€ ์—†๋‹ค. ์ด๋Ÿฐ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์–ด๋Š ๊ตฌํ˜„ ๋ฐฉ์‹์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์šฐ์ˆ˜ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌํ˜„๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

- 84 -


7.4. ํ

๋ฐฐ์—ด๋กœ ํ์˜ ๊ตฌํ˜„ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ํ์˜ ๋ฌผ๋ฆฌ์  ๋ทฐ vs. ๋…ผ๋ฆฌ์  ๋ทฐ

ArrayQueue queue = new ArrayQueue(4); queue

0

front

rear null

element

-1

null

0

size null

null

queue.enq(new Character(โ€˜Aโ€™)) queue

0

front

0

rear

null

element

front

rear 1

size null

A

null

A

queue.enq(new Character(โ€˜Bโ€™)) queue

0

front

1

rear

A

2

size null

element

front

rear

B

null

A

B

์—ฐ๊ฒฐ๊ตฌ์กฐ๋กœ ํ์˜ ๊ตฌํ˜„ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋กœ ํ์˜ ๊ตฌํ˜„ LinkedQueue queue = new LinkedQueue(); queue

front

null

rear null

size

0

size

1

private class QueueNode{ public Object info; public QueueNode link; }

queue.enq(new Character(โ€˜Aโ€™)); queue

front

info A

rear

null

queue.enq(new Character(โ€˜Bโ€™)); queue

front

size

rear

info

info

A

B

2

null

์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„๋„ ์Šคํƒ์˜ ๊ตฌํ˜„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ ํ•œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค ์—ญ์‹œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•œ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ์˜ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ํ๋Š” ๋‘ ๊ฐ€์ง€ ์œ„์น˜์—์„œ ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ํ์˜ ๋งจ ์ฒ˜์Œ(์ฒซ ๋…ธ๋“œ)๊ณผ ๋งจ ๋(๋งˆ์ง€๋ง‰ ๋…ธ๋“œ)์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ ํ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ฐœ์ˆ˜๋ฅผ ์•Œ์•„ ๋‚ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ ์ธก๋ฉด์—์„œ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํšจ๊ณผ์ ์ด๋‹ค.

- 85 -


LinkedQueue ADT ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„ QueueNode front = null; QueueNode rear = null; int size = 0; ์ƒ์„ฑ์ž LinkedQueue() ์ƒํƒœ boolean isFull(); ์กฐ๊ฑด: ํ•ญ์ƒ ๊ฑฐ์ง“ boolean isEmpty(); ์กฐ๊ฑด: front==null

์กฐ์ž‘ void enq(Object item); QueueOverflowExceptio์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

Object deq(); isEmpty()๊ฐ€ ์ฐธ์ด๋ฉด QueueUnderflowException ๋ฐœ์ƒ

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์ด๋ฏ€๋กœ ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ธฐ์ง€๋กœ isFull ๋ฉ”์†Œ๋“œ๋Š” ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ ํ˜„ํ•œ๋‹ค. isEmpty๋Š” ํ์— ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” front์„ ์ด์šฉํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , front์„ ์ด ์šฉํ•˜์ง€ ์•Š๊ณ , size๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

enqueue enqueue ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„ 1. ์ƒˆ ์š”์†Œ๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ ์ƒ์„ฑ ๋‹จ๊ณ„ 2. ์ด ์š”์†Œ์˜ info ๊ฐ’์— item ํ• ๋‹น ๋‹จ๊ณ„ 3. ์ด ์š”์†Œ๋ฅผ rear์— ์ถ”๊ฐ€ ๋‹จ๊ณ„ 4. rear๊ฐ€ ์ด ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•จ public void enq(Object item) { QueueNode newNode = new QueueNode(); newNode.info = item; newNode.link = null; // ํ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ if(rear == null) front = newNode; // ํ์— ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ else rear.link = newNode; rear = newNode; size++; }

queue

front

size

rear

3 info 10

2

info

2 1. ์ƒ์„ฑ null

20

enqueue๋Š” ํ์˜ ๋งจ ๋์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ณดํ†ต ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋งจ ๋ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” rear ์ •๋ณด๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ํ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋งจ ์•ž ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” front ์ •๋ณด๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด rear๋ฅผ ์ด์šฉํ•˜์—ฌ ํ๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ size๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , isEmpty ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ ์ถœํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ๋ณด๋‹ค๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

- 86 -


dequeue dequeue ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„ 1. queue๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ๊ฒ€ํ†  ๋‹จ๊ณ„ 2. front.item์„ ์ž„์‹œ ๋ณด๊ด€ ๋‹จ๊ณ„ 3. front๊ฐ€ front.link๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•จ ๋‹จ๊ณ„ 4. ํ์— ๋” ์ด์ƒ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด rear๋ฅผ null๋กœ ์„ค์ •ํ•จ ๋‹จ๊ณ„ 5. ์ž„์‹œ ๋ณด๊ด€ํ•œ item์„ ๋ฐ˜ํ™˜ queue

front

rear

size

1

info

info

null

10

20

2

tmp

1

public Object deq() throws QueueUnderflowException{ if(isEmpty()) throw new QueueUnderflowException(โ€œโ€ฆโ€); Object tmp = front.info; front = front.link; size--; if(isEmpty()) rear = null; return tmp; }

dequeue๋Š” enqueue์™€ ๋ฐ˜๋Œ€๋กœ ๋ณดํ†ต ํ์˜ ๋งจ ์•ž ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” front ์ •๋ณด๋งŒ ๋ณ€๊ฒฝํ•˜ ๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ dequeue ๊ฒฐ๊ณผ ํ๊ฐ€ ๋นˆ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋งจ ๋ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” rear ์ •๋ณด ๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ๋จผ์ € ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด ๊ณ , ๊ฐ ๊ฒฝ์šฐ๊ฐ€ ๋™์ผํ•œ ํ–‰๋™์„ ํ†ตํ•ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค.

Circular Linked Queue queue

rear

info

info

info

10

20

30

์ˆœํ™˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ฐธ์กฐ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. front๋งŒ ์œ ์ง€ํ•˜๋ฉด dequeue๋Š” O(1)์ด์ง€๋งŒ enqueue๋Š” O(n)์ด ๋œ๋‹ค. rear๋งŒ ์œ ์ง€ํ•˜๋ฉด ํ ๋งจ ๋’ค๋Š” rear๋กœ ํ ๋งจ ์•ž์€ rear.link๋กœ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ๋Š” ๋ณดํ†ต ๋‘ ๊ฐ€์ง€ ์œ„์น˜์—์„œ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ฐ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์œ ์ง€ํ•œ ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์—์„œ๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋งŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์ด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ฒซ ๋…ธ๋“œ๋งŒ์„ ์œ ์ง€ํ•˜๋Š” ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ฅผ ์œ ์ง€ํ•  ๊ฒฝ์šฐ์—๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๋ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํšจ๊ณผ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์˜ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ๋ฅผ ์ˆœํ™˜ ํ๋ผ ํ•œ๋‹ค.

- 87 -


Circular Linked Queue: enq public void enq(Object item) { QueueNode newNode = new QueueNode(); newNode.info = item; newNode.link = null; if(rear == null){ // list๊ฐ€ empty์ธ ๊ฒฝ์šฐ rear = newNode; rear.link = newNode; } else{ newNode.link = rear.link; rear.link = newNode; rear = newNode; } size++; }

queue

3

rear

info

info

10

20

2

info 30

1

ArrayQueue VS. LinkedQueue ArrayQueue

LinkedQueue

O(1)

O(1)

dequeue

O(1)

O(1)

constructor

O(N)

O(1)

N+1 ์ฐธ์กฐ, 3 ์ƒ‰์ธ

2N+2 ์ฐธ์กฐ(no waste)

enqueue

space

Which one is better? ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ LinkedStack์ด ์šฐ์ˆ˜: ํ์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด ์šฉ๋Ÿ‰์˜ ๋ฐ˜ ์ดํ•˜์ผ ๊ฒฝ์šฐ

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ์˜ ๊ตฌํ˜„์˜ ๋น„๊ต๋Š” ์Šคํƒ์˜ ๋น„๊ต์™€ ์œ ์‚ฌํ•˜ ๋‹ค. ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ตฌํ˜„ ๋ฐฉ์‹์— ์˜ํ•œ enqueue์™€ dequeue๋Š” ๋ชจ๋‘ ์ƒ์ˆ˜์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ ์ฆ˜์ด๋‹ค. ์ฆ‰, ๋‘ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ๋งŒ ๋‹ค๋ฅด๋‹ค.

- 88 -


7.5. ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„ ์ด ์ ˆ์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณธ๋‹ค. ๋˜ํ•œ ๋ฐ˜ ๋ณต์ž ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณธ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ฐ˜๋ณต์ž๋Š” ADT๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค ๋‚ด์— ํ•„์š” ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ์ œ๊ณตํ•˜์˜€์ง€๋งŒ ์ด ์ ˆ๋ถ€ํ„ฐ๋Š” ๋ณ„๋„์˜ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต์ž๋ฅผ ์ œ๊ณต ํ•œ๋‹ค.

List Class Hierarchy List

ArrayList

UnsortedArrayList

import java.util.Iterator; public interface List extends Iterable{ boolean isEmpty(); boolean isFull(); void clear(); int size(); boolean search(Object item); void insert(Object item); boolean delete(Object item); Object retrieve(Object item); Iterator iterator(); } // List

LinkedList

SortedArrayList

use inner class

UnsortedLinkedList

ListNode

SortedLinkedList

๋ฆฌ์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ „์ฒด ํด๋ž˜์Šค์˜ ๊ณ„์ธต๊ตฌ์กฐ๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์„œ List๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋กœ์„œ ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ๋“ค์„ ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค. java,lang ํŒจํ‚ค์ง€์—๋Š” Iterable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š”

Iterator iterator(); ํ˜•ํƒœ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. Iterator๋Š” java.util ํŒจํ‚ค์ง€์— ์ •์˜๋˜์–ด ์žˆ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ, ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ๋“ค์„ ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค.

ArrayList์™€ LinkedList๋Š” ๊ฐ๊ฐ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„, ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„์„ ์œ„ํ•œ ์ถ”์ƒ ํด ๋ž˜์Šค์ด๋‹ค.

Import java.util.Iterator; public abstract class LinkedList implements List{ protected class ListNode{ public Object info; public ListNode next; } // ListNode protected class ListIterator implements Iterator{ โ€ฆ ListNode์™€ ListIterator ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ } // ListIterator protected์ธ ์ด์œ ๋Š” ์ž์‹ ํด๋ž˜์Šค์ธ protected ListNode list = null; UnsortedLinkedList์™€ protected int size = 0; SortedLinkedList์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. public LinkedList(){} public boolean isFull(){ return false; } public boolean isEmpty(){ return (list == null); } void clear(){ โ€ฆ } public int size(){ return size; } public Iterator iterator() { return new ListIterator(list); } public abstract boolean search(Object item); public abstract void insert(Object item); public abstract boolean delete(Object item); public abstract Object retrieve(Object item); } // LinkedList

- 89 -


๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๋Š” LinkedList์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜์˜€๋‹ค. ์ด๊ฒƒ์€ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ด ํด๋ž˜์Šค๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ๋ชฉ์ ๋ณด๋‹ค๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์†ํ•œ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์ด์™€ ๊ฐ™์ด ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค ๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค ListIterator์™€ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”

ListNode ํด๋ž˜์Šค๋ฅผ protected๋กœ ์„ ์–ธํ•œ ์ด์œ ๋Š” ์ž์‹ ํด๋ž˜์Šค๋“ค์ธ UnsortedLinkedList์™€ SortedLinkedList์—์„œ ์ด๋“ค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๋ฐ˜๋ณต์ž ํด๋ž˜์Šค protected class ListIterator implements Iterator{ public ListNode cursor; public int traverseCount = 0; public ListIterator(ListNode node){ cursor = node; } public Object next(){ ๋ฐ˜๋“œ์‹œ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ Object tmp = cursor.info; ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†๋‹ค. cursor = cursor.next; traverseCount++; return tmp; } traverseCount ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  public boolean hasNext(){ cursor๋งŒ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. return (traverseCount<size); ํ•˜์ง€๋งŒ CircularLinkedList๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ // return (cursor!=null) traverseCount ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค. } public void remove(){ throw new UnsupportedOperationException(); } } // ListIterator

java.util ํŒจํ‚ค์ง€์— ์ •์˜๋˜์–ด ์žˆ๋Š” Iterator ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” next, hasNext, remove ์„ธ ๊ฐ€์ง€ ๋ฉ” ์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ์ด ์ค‘ remove๋Š” ํ˜„์žฌ ๋ฐฉ๋ฌธ ์ค‘์ธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ด๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” UnsupportedOperationException ์˜ˆ์™ธ๋ฅผ ๋ฐœ ์ƒํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. LinkedList์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๋Š” traverseCount๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  hasNext() ๋ฉ”์†Œ๋“œ์—์„œ cursor!=null ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ traverseCount๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ ์žฅ์—์„œ ์‚ดํŽด๋ณผ ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ๋„ ๊ฐ™์€ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ƒ์„ฑ์ž์—์„œ

cursor๋ฅผ list๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  node๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ cursor๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ด์œ ๋„ ๊ฐ™ ์€ ์ด์œ ์ด๋‹ค.

- 90 -


UnsortedLinkedList, SortedLinkedList public class UnsortedLinkedList extends LinkedList{ public UnsortedLinkedList() { super(); } public boolean search(Object item) throws ListUnderflowException{ โ€ฆ } public void insert(Object item){ โ€ฆ } public boolean delete(Object item) throws ListUnderflowException{ โ€ฆ } public Object retrieve(Object item) throws ListUnderflowException{ โ€ฆ} } // UnsortedLinkedList public class SortedLinkedList extends LinkedList{ public SortedLinkedList() { super(); } public boolean search(Object item) throws ListUnderflowException{ โ€ฆ } public void insert(Object item){ โ€ฆ } public boolean delete(Object item) throws ListUnderflowException{ โ€ฆ } public Object retrieve(Object item) throws ListUnderflowException{ โ€ฆ} } // UnsortedLinkedList

์ด์ง„๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์—†๋‹ค. ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ๊ฒ€์ƒ‰์„ ์ค‘๊ฐ„์— ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉ ํ•œ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋Š” ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด์ง„ ๊ฒ€์ƒ‰ ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

UnsortedLinkedList: search public boolean search(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); // if(item==null) return false; ListNode loc = list; boolean moreToSearch = true; do{ if(item.equals(loc.info)) return true; else{ loc = loc.next; moreToSearch = (loc != null); } }while(moreToSearch); return false; } // UnsortedList: search loc info

info

info

info

10

50

30

20

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์ด์–ด๋„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค. item์ด null์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ nullPointerException์„ ์ง์ ‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์ฃผ์„๊ณผ ๊ฐ™์ด false ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ์ „์ž๋Š” ๋ฌธ์ œ์˜ ์›์ธ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ธก๋ฉด์—์„œ ์ด์ ์ด ์žˆ๊ณ , ํ›„์ž๋Š” ์˜ˆ์™ธ ๋ฐœ ์ƒ์—†์ด ํ”„๋กœ๊ทธ๋žจ์ด ๊ณ„์† ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ์ด์ ์ด ์žˆ๋‹ค. ๊ฒ€์ƒ‰์—์„œ ๋น„๊ต๋Š” ๋ณดํ†ต equals ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. ์ข…๋ฃŒ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๋Š” moreToSearch๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ ๊ณ , ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์ฒ˜๋Ÿผ size ์ •๋ณด๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

- 91 -


UnsortedLinkedList: search

public boolean search(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); ListNode loc = list; for(int i=0; i<size; i++){ if(item.equals(loc.info)) return true; else loc = loc.next; } // for return false; } // UnsortedList: search

SortedLinkedList: search public boolean search(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode loc = list; boolean moreToSearch = true; do{ int compResult = x.compareTo(loc.info); if(compResult==0) return true; else if(compResult<0) return false; else{ loc = loc.next; moreToSearch = (loc != null); } }while(moreToSearch); return false; } // SortedLinkedList: search (์ค‘๊ฐ„์— ์ค‘๋‹จ ๊ฐ€๋Šฅ) list info

info

info

info

10

20

30

50

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์—์„œ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ์‹œ๊ฐ„์— ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์ž„์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ •๋ ฌ ๋ฆฌ ์ŠคํŠธ์—์„œ๋„ ์„ ํ˜• ๊ฒ€์ƒ‰๋ฐ–์—๋Š” ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์ƒ‰์„ ์ค‘๊ฐ„์—์„œ ์ค‘๋‹จํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ค‘๊ฐ„์— ์ค‘๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” equals ๋ฉ”์†Œ๋“œ ๋Œ€์‹ ์—

compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์ด๋ฅผ ์œ„ํ•ด ์ธ์ž๋กœ ๋ฐ›์€ item์„ Comparable ํƒ€์ž… ์œผ๋กœ ํƒ€์ž…๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

- 92 -


SortedLinkedList: search public boolean search(Object item) throws ListUnderflowException{ if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode loc = list; for(int i=0; i<size; i++){ int compResult = x.compareTo(loc.info); if(compResult==0) return true; else if(compResult<0) return false; else loc = loc.next; } // for return false; } // SortedLinkedList: search (์ค‘๊ฐ„์— ์ค‘๋‹จ ๊ฐ€๋Šฅ)

public boolean delete(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); ListNode loc = list; ListNode prevLoc = null; for(int i=0; i<size; i++){ if(x.equals(loc.info)){ // ์‚ญ์ œํ•  ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ if(prevLoc==null) list = list.next; // ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ else prevLoc.next = loc.next; size--; return true; } else{ // ๊ฒ€์ƒ‰์„ ๊ณ„์†ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ prevLoc = loc; loc = loc.next; } } // for return false; } // UnsortedLinkedList: delete list

prevLoc

loc

info

info

info

info

10

50

30

10

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ค‘๊ฐ„ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ๋…ธ๋“œ์˜ ์„ ํ–‰ ๋…ธ๋“œ์™€ ํ›„์† ๋…ธ๋“œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ทธ ๋…ธ๋“œ์˜ ์„ ํ–‰ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋…ธ๋“œ์˜ ํ›„์† ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์„ ๋•Œ ํ˜„์žฌ ๋…ธ๋“œ ์ •๋ณด(loc) ์™€ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์„ ํ–‰ ๋…ธ๋“œ ์ •๋ณด(prevLoc)๋ฅผ ํ•จ๊ป˜ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ ๋ฆฌ์ŠคํŠธ์„ ์กฐ์ž‘ํ•  ๋•Œ์—๋Š” ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ์งธ, ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‘˜์งธ, ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ์…‹์งธ, ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์ค‘๊ฐ„์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ๋„ท์งธ, ๋ฆฌ์ŠคํŠธ ๋งจ ๋์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/๋งจ ๋์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ListUnderflowException์„ ๋ฐœ์ƒํ•œ๋‹ค. ๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” list ์ •๋ณด๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ์ค‘ ๊ฐ„ ๋˜๋Š” ๋์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ชจ๋‘ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์„ ํ–‰ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์„ ํ˜„์žฌ ๋…ธ ๋“œ์˜ ํ›„์† ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ฆ‰, ์ค‘๊ฐ„ ๋˜๋Š” ๋์— ์žˆ๋Š” ์š”์†Œ์˜ ์‚ญ์ œ๋Š” ๋™

- 93 -


์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

SortedLinkedList: delete public boolean delete(Object item) throws ListUnderflowException{ if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode loc = list; ListNode prevLoc = null; for(int i=0; i<size; i++){ int compResult = x.compareTo(loc.info); if(compResult==0){ // ์‚ญ์ œํ•  ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ if(prevLoc==null) list = list.next; // ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ else prevLoc.next = loc.next; size--; return true; } // ์‚ญ์ œํ•  ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ else if(compResult<0) return false; else{ // ๊ฒ€์ƒ‰์„ ๊ณ„์†ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ prevLoc = loc; loc = loc.next; } } // for return false; } // SortedLinkedList: delete

์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ๋Š” ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์„ ๋•Œ ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์—์„œ ๊ฒ€์ƒ‰์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™๋‹ค.

UnsortedLinkedList: insert ๋ฐฐ์—ด ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ์—๋Š” ๋งจ ๋์— ์—ฐ๊ฒฐ ๊ตฌ์กฐ ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ์—๋Š” ๋งจ ์ฒ˜์Œ์—

2

public void insert(Object item){ ListNode newNode = new ListNode(); newNode.info = item; newNode.next = list; list = newNode; size++; } // UnsortedLinkedList: insert

list

info 25

1 info

info

info

info

10

50

30

10

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์—์„œ ์‚ฝ์ž…์€ ํ•ญ์ƒ ๋ฆฌ์ŠคํŠธ์˜ ๋์— ์ด๋ฃจ์–ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์—์„œ๋Š” ์‚ฝ์ž…์€ ํ•ญ์ƒ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€ ์žฅ ํšจ์œจ์ ์ด๋‹ค.

- 94 -


public void insert(Object item){ if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode newNode = new ListNode(); newNode.info = item; ListNode loc = list; ListNode prevLoc = null; for(int i=0; i<size; i++){ // ์‚ฝ์ž…ํ•  ์œ„์น˜ ๊ฒฐ์ • if(x.compareTo(loc.info)<0) break; else{ prevLoc = loc; loc = loc.next; } } // for if(prevLoc==null){ // ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์ฒ˜์Œ newNode.next = list; list = newNode; 2 } else{ // ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„ ๋˜๋Š” ๋ newNode.next = loc; info prevLoc.next = newNode; } 20 size++; } // SortedLinkedList: insert

list

1 info 10

info 25

1 info 30

์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋ฉฐ, ์‚ญ์ œ ์—ฐ์‚ฐ์„ ์„ค๋ช…ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ฆฌ์ŠคํŠธ ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ณต์ž์˜ ์‚ฌ์šฉ void print(SortedLinkedList l){ Iterator i = l.iterator(); while(i.hasNext()){ System.out.print(i.next()+โ€,โ€); } System.out.println(); }

๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋œ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ์ฆ‰, iterator ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜๋ณต์ž๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— hasNext์™€ next ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์กฐ์— ์ € ์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.

- 95 -


List์˜ ๋น„๊ต Unsorted, Array

Unsorted, Linked

Sorted, Array

Sorted, Linked

search

O(N)

O(N)

O(logN)

O(N)

retrieve

O(N)

O(N)

O(logN)

O(N) O(N), O(1) ์ „์ฒด: O(N)

insert

O(1)

O(1)

O(logN), O(N) ์ „์ฒด: O(N)

delete

O(N), O(1) ์ „์ฒด: O(N)

O(N), O(1) ์ „์ฒด: O(N)

O(logN), O(N) ์ „์ฒด: O(N)

O(N), O(1) ์ „์ฒด: O(N)

space

N+1 ์ฐธ์กฐ, 2 ์ •์ˆ˜

2N+2 ์ฐธ์กฐ, 1 ์ •์ˆ˜

N+1 ์ฐธ์กฐ, 2 ์ •์ˆ˜

2N+2 ์ฐธ์กฐ, 1 ์ •์ˆ˜

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

- 96 -


์ œ8์žฅ ์—ฐ๊ฒฐ๊ตฌ์กฐ ํ™•์žฅ ์ด ์žฅ์—์„œ๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ™•์žฅ์„ ์‚ดํŽด๋ณธ๋‹ค.

8.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„

8.2. ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋งํฌ๋ฅผ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€ํ˜•ํ•œ ๋ฆฌ์ŠคํŠธ list

info

info

info

10

20

30

์žฅ์ . ์žฅ์ . ์–ด๋–ค ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•ด๋„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด ์—ฐ์‚ฐ๋“ค์€ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์ •์‹œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์  ์ฒซ ๋…ธ๋“œ์˜ ์‚ญ์ œ ๋˜๋Š” ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋…ธ๋“œ์˜ ์‚ฝ์ž…: ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” 7์žฅ์—์„œ ์‚ดํŽด๋ณธ ์ˆœํ™˜ ์—ฐ๊ฒฐ ํ์™€ ์œ ์‚ฌํ•˜๋‹ค. ๋ณดํ†ต ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋ฆฌ์Šค ํŠธ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด๋งŒ ์œ ์ง€ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋Š” null ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์„ ๋ณ€ํ˜•ํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๋ฉด ์–ด๋–ค ๋…ธ๋“œ์—์„œ ์ถœ ๋ฐœํ•˜์—ฌ๋„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „์ฒ˜๋Ÿผ ์ฒซ ๋ฒˆ์งธ ๋…ธ

- 97 -


๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด๋งŒ ์œ ์ง€ํ•  ๊ฒฝ์šฐ์—๋Š” ์ฒซ ๋…ธ๋“œ๋กœ ์ƒˆ ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ด ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค.

์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ โ€“ ๊ณ„์† ํ•ด๊ฒฐ์ฑ…: ํ•ด๊ฒฐ์ฑ… ์ฒซ ๋…ธ๋“œ ๋Œ€์‹ ์— ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ์œ ์ง€ info

info

info

10

20

30

list

์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ๋ชจ๋‘ ์šฉ์ดํ•จ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋‚ด์šฉ: list.info ์ฒซ ๋…ธ๋“œ์˜ ๋‚ด์šฉ: list.next.info info

list

30

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜์—ฌ ์œ„ํ•ด ์ฒซ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์œ  ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋ชจ๋‘ ์šฉ์ดํ•ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ฒซ ๋…ธ๋“œ๋กœ ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋น„์šฉ์ด๋‚˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋น„์šฉ์ด ๋ชจ๋‘ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ€์žฅ ํฐ ๊ฐ’๊ณผ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ƒ ์ˆ˜ ์‹œ๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ ์ข… ์—ฐ์‚ฐ๋“ค์„ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

List Class Hierarchy List

ArrayList

UnsortedArrayList

LinkedList

SortedArrayList

UnsortedLinkedList

SortedLinkedList

CircularSortedLinkedList

์ด ์ ˆ์—์„œ๋Š” ์ˆœํ™˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค. ์ˆœํ™˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ ๊ด€๋ จ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ์–ด๋””์— ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„์น˜ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋„ ๊ธฐ์กด ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋ฆฌ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€ ๋กœ ListNode๋ผ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, isFull, isEmpty, size์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋“ค์€

LinkedList ์ถ”์ƒ ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฝ์ž…, ์‚ญ์ œ,

- 98 -


๊ฒ€์ƒ‰ ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ์กด ์ผ๋ฐ˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—† ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ์กด ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” list๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ ๋ฐ˜๋ฉด ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฐฉ์‹์—์„œ๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœํ™˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š”

SortedLinkedList๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” LinkedList๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๋‹ค.

CircularSortedLinkedList public class CircularSortedLinkedList extends LinkedList{ public CircularSortedLinkedList() { super(); } public boolean search(Object item) throws ListUnderflowException{ โ€ฆ } public void insert(Object item){ โ€ฆ } public boolean delete(Object item) throws ListUnderflowException{ โ€ฆ } public Object retrieve(Object item) throws ListUnderflowException{ โ€ฆ } public Iterator iterator() { return (list==null) ? new ListIterator(null) : new ListIterator(list.next); } }

CircularSortedLinkedList์˜ search public boolean search(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode loc = list.next; for(int i=0; i<size; i++){ int compResult = x.compareTo(loc.info); if(compResult==0) return true; else if(compResult<0) return false; else loc = loc.next; } return false; } // CircularSortedList::search loc

list

info

info

info

info

10

20

30

40

์ˆœํ™˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰์€ ๊ธฐ์กด ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰๊ณผ loc์˜ ์ดˆ๊ธฐํ™”๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ฐ™๋‹ค. ์‚ญ์ œ์™€ ์‚ฝ์ž… ์—ฐ์‚ฐ์€ loc์˜ ์ดˆ๊ธฐํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์กฐ์ž‘๋˜๋ฉด ์ˆœํ™˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

- 99 -


CircularSortedLinkedList์˜ delete prevLoc

loc

list

info

info

info

info

10

20

30

40

prevLoc

loc

list

info

info

info

info

10

20

30

40

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ prevLoc.next = loc.next;

์ฒซ ๋…ธ๋“œ list.next = list.next.next; ๋˜๋Š” list.next = loc.next;

CircularSortedLinkedList์˜ delete loc prevLoc

list

info

info

info

info

10

20

30

40 ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ prevLoc.next = loc.next; list = prevLoc;

loc prevLoc

list

info

์œ ์ผ ๋…ธ๋“œ list = null;

10

ํ•ญ์ƒ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์—์„œ๋Š” ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ ๋…ธ๋“œ์˜ ์‚ญ์ œ, ์ฒซ ๋…ธ๋“œ์˜ ์‚ญ์ œ์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋…ธ๋“œ์— ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ, ์ค‘๊ฐ„ ๋…ธ๋“œ์˜ ์‚ญ์ œ, ๋งˆ ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ค‘๊ฐ„ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋Š” ๊ธฐ์กด ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•˜์ง€ ๋งŒ ์ฒซ ๋…ธ๋“œ์˜ ์‚ญ์ œ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์‚ญ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ˆœํ™˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

- 100 -


public boolean delete(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; ListNode loc = list.next; ListNode prevLoc = null; for(int i=0;i<size;i++){ int compResult = x.compareTo(loc.info); if(compResult==0){ // ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ if(prevLoc==null){ // ์ฒซ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ if(loc == loc.next) list = null; // ์ฒซ ๋…ธ๋“œ๊ฐ€ ์œ ์ผ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ else list.next = loc.next; if(loc == loc.next) ๋Œ€์‹ ์— } if(size==1)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ else{ prevLoc.next = loc.next; if(loc==list) list = prevLoc; // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ } size--; return true; } else if(compResult<0) return false; else{ prevLoc = loc; loc = loc.next; } } // for return false; } // CircularSortedList::delete

์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค๋Š” ์ˆœํ™˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ delete ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ ์ฒซ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์™€ ์ฒซ ๋…ธ๋“œ์™€ ํฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‚ญ์ œํ•  ๋…ธ ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š” ๊ณผ์ •์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค๋Š” ์ˆœํ™˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•œ delete ๋ฉ”์†Œ๋“œ

public boolean delete(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; if(x.compareTo(list.next.info)<0||x.compareTo(list.info)>0){ return false; } // ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋™์ผ } // CircularSortedList::delete

- 101 -


CircularSortedLinkedList์˜ insert loc prevLoc

list

info

info

info

10

20

40

๋นˆ ๋ฆฌ์ŠคํŠธ list = newNode; list.next = newNode; loc prevLoc

list

info ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ newNode.next = loc; prevLoc.next = newNode;

info

30

10

CircularSortedLinkedList์˜ insert prevLoc

loc

list

info

info

info

info

10

20

30

40

์ฒซ ๋…ธ๋“œ newNode.next = loc; list.next = newNode;

prevLoc loc

list

info

info

info

info

10

20

30

40

๋งˆ์ง€๋ง‰ ๋…ธ๋“œ newNode.next = loc; prevLoc.next = newNode; list = newNode;

์‚ฝ์ž…๋„ ์‚ญ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ, ๋งจ ์•ž์— ์ถ”๊ฐ€์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌ์Šค ํŠธ ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ ๊ฒฝ์šฐ์— ์œ ์‚ฌ์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋ฅผ ํ™œ์šฉ ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ newNode,next = loc; prevLoc.next = newNode;๋Š” ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

- 102 -


public void insert(Object item){ Comparable x = (Comparable)item; ListNode newNode = new ListNode(); newNode.info = item; newNode.next = null; ListNode loc = (list==null)? null: list.next; ListNode prevLoc = null; for(int i=0;i<size;i++){ // ์‚ฝ์ž…ํ•  ์œ„์น˜ ์ฐพ๊ธฐ if(x.compareTo(loc.info)<0) break; else{ prevLoc = loc; loc = loc.next; } } // for if(prevLoc==null){ // ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ // ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ if(list==null){ list = newNode; newNode.next = newNode; } else{ newNode.next = loc; list.next = newNode; } } else{ newNode.next = loc; prevLoc.next = newNode; // ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ if(prevLoc == list) list = newNode; } size++; } // CircularSortedList::insert

์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ๊ธฐ์กด ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋จผ์ € ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ์€ ๋‹ค์Œ, ์‚ฝ์ž…ํ•  ์œ„์น˜์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ฐ ์ข… ์—ฐ๊ฒฐ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค. ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ทธ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ์š”์†Œ์™€ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ์ฒซ ์š”์†Œ๋ณด๋‹ค ์ž‘๊ฑฐ ๋‚˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ณด๋‹ค ํด ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜์—ฌ ์ค€๋‹ค. ๋‘ ๊ฒฝ์šฐ๋Š” ์ •๋ ฌ๋œ ์ˆœํ™˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์˜ ํŠน์„ฑ ์ƒ ๊ฐ™์€ ์œ„์น˜์— ์‚ฝ์ž…๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค. ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ public void insert(Object item){ ๋ชจ๋‘ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค๋Š” Comparable x = (Comparable)item; ์ˆœํ™˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ListNode newNode = new ListNode(); ์ด์šฉํ•œ insert ๋ฉ”์†Œ๋“œ newNode.info = item; newNode.next = null; size++; if(list==null){ list = newNode; newNode.next = newNode; return; } // ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ if(x.compareTo(list.next.info)<0||x.compareTo(list.info)>0){ newNode.next = list.next; list.next = newNode; if(x.compareTo(list.info)>0) list = newNode; // ๋งจ ๋์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ return; } // ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ // ์ฒซ ๋…ธ๋“œ์™€ ๋น„๊ตํ•  ํ•„์š” ์—†์Œ ListNode loc = list.next.next; ListNode prevLoc = list.next; for(int i=0;i<size;i++){ if(x.compareTo(loc.info)<0){ newNode.next = loc; prevLoc.next = newNode; return; } else{ prevLoc = loc; loc = loc.next; } } // for } // CircularSortedList::insert

- 103 -


CircularSortedLinkedList์˜ ์žฅ๋‹จ์  ์—ฐ์‚ฐ ์ธก๋ฉด์—์„œ๋Š” SortedLinkedList์— ๋น„ํ•ด ํ–ฅ์ƒ๋œ ๊ฒƒ์ด ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CircularSortedLinkedList๋Š” ์ผ๋ฐ˜ ์ •๋ ฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์šฉ์ดํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์ผ๋ฐ˜ ์ •๋ ฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ์šฐ์ˆ˜ํ•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ถ”์ถœ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๊ฐ’๋“ค ์‚ฌ์ด์— ์žˆ๋Š” ๊ฐ’์ธ์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†ํ•ด์„œ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์ •๋ ฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋” ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€? good alternative

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

- 104 -


8.3. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(doubly linked list)๋ž€ ์ฒซ ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ํ›„์† ์š”์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ํ–‰ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ list

info

info

info

10

20

30

์–ด๋–ค ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•ด๋„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ญ์ˆœ์œผ๋กœ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค. ์žˆ๋‹ค. ๋…ธ๋“œ์˜ ๊ตฌ์„ฑ: back, info, next protected class DLListNode{ public Object info; 3N+1 public DLListNode back; public DLListNode next; }

์ด์ „๊นŒ์ง€์˜ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐ ๋…ธ๋“œ๋Š” ํ•œ ์ชฝ ๋ฐฉํ–ฅ์˜ ์—ฐ๊ฒฐ๋งŒ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์—ˆ ๋‹ค. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ด์™€ ๋‹ฌ๋ฆฌ ์–‘์ชฝ ๋ฐฉํ–ฅ์˜ ์—ฐ๊ฒฐ์„ ํ•œ ๋…ธ๋“œ์— ๋ชจ๋‘ ์œ ์ง€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๋…ธ๋“œ์— 3๊ฐœ์˜ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ๋‹น ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์ด ๋งŽ๋‹ค. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋Š” ํ˜„์žฌ ์œ„์น˜ํ•œ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ด์ „ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ฒ˜๋Ÿผ ํ›„์† ์š”์†Œ๋“ค์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ํ–‰ ์š”์†Œ๋“ค๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ž ๋ฃŒ๊ตฌ์กฐ์™€ ๋‹ฌ๋ฆฌ ์—ญ์ˆœ์œผ๋กœ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

List Class Hierarchy List

ArrayList

UnsortedArrayList

LinkedList

SortedArrayList

UnsortedLinkedList

SortedLinkedList

DoubleLinkedList

UnsortedDoubleLinkedList

SortedDoubleLinkedList

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ ์ž์ฒด๊ฐ€ ์ผ๋ฐ˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ค๋ฅด๋ฏ€๋กœ LinkedList ํด๋ž˜์Šค์™€ ์ƒ์† ๊ด€ ๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ DoubleLinkedList๋ผ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ณ , ์ด์ค‘ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ์ด์ค‘ ๋น„์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” DoubleLinkedList๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.

- 105 -


public abstract class DoubleLinkedList implements List{ protected class ListNode{ public Object info; public ListNode back; public ListNode next; } protected class ListIterator{ โ€ฆ } protected ListNode list = null; protected int size = 0; public DoubleLinkedList() {} public abstract boolean search(Object item) throws ListUnderflowException; public abstract void insert(Object item); public abstract boolean delete(Object item) throws ListUnderflowException; public abstract Object retrieve(Object item) throws ListUnderflowException; public boolean isFull(){ return false; } public boolean isEmpty(){ return (list == null); } public void clear{ list = null; } public int size(){ return size; } public Iterator iterator() { return new ListIterator(list); } } // DoubleLinkedList class

DoubleLinkedList์—์„œ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ ListNode์ด๊ณ , ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค์˜ ์ด ๋ฆ„์€ ListIterator์ด๋‹ค. ์ฆ‰, LinkedList๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ๋ถ€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. protected class ListIterator{ public ListNode cursor; public int traverseCount = 0; public ListIterator(ListNode node){ cursor = node; } // ListIterator(ListNode) public boolean hasBack(){ return (traverseCount>0); } public boolean hasNext(){ return (traverseCount<size); } public Object back(){ Object tmp = cursor.info; cursor = cursor.back; traverseCount--; return tmp; } // back public Object next(){ Object tmp = cursor.info; cursor = cursor.next; traverseCount++; return tmp; } // next public void remove(){ throw new UnsupportedOperationException(); } // remove }

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค์—๋Š” ๊ธฐ์กด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ์—†๋Š” back๊ณผ hasBack ๋ฉ”์†Œ ๋“œ๊ฐ€ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ทธ๊ฒƒ์˜ ์„ ํ–‰ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

- 106 -


SortedDoubleLinkedList์˜ Insert prevLoc

list

2

3

1

loc

prevLoc

loc

info

info

info

10

20

3

4

30

1

1 2

2

info

info

info

5

25

50

newNode.next = loc; loc.back = newNode; list = newNode;

newNode.back = prevLoc; newNode.next = loc; prevLoc.next = newNode; loc.back = newNode;

newNode.back = prevLoc; prevLoc.next = newNode;

์ด์ค‘ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ์ผ๋ฐ˜ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์‚ฝ์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ ์ด ์ค‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋นˆ ๊ฒฝ์šฐ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. public void insert(Object item){ Comparable x = (Comparable)item; ListNode newNode = new ListNode(); newNode.info = item; newNode.back = null; newNode.next = null; ListNode loc = list; ListNode prevLoc = null; for(int i=0;i<size;i++){ // ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค. if(x.compareTo(loc.info)<0) break; else{ prevLoc = loc; loc = loc.next; } } // for if(prevLoc==null){ // ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ list = newNode; newNode.next = loc; if(list!=null) loc.back = newNode; // ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ } else{ newNode.back = prevLoc; newNode.next = loc; prevLoc.next = newNode; if(loc!=null) loc.back = newNode; // ๋งจ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด } size++; } // SortedDoubleLinkedList::insert

if(prevLoc==null)์ด ์ฐธ์ด๋ฉด ์ƒˆ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๋‹ค ์‹œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋นˆ ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค. ๋ฐ˜๋Œ€๋กœ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด๋ฉด ์ƒˆ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„ ๋˜๋Š” ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ ์š”์†Œ๊ฐ€ ์„  ํ–‰ ๋ฐ ํ›„์† ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ฒŒ ๋˜์ง€๋งŒ ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ ํ–‰์š”์†Œ๋งŒ ๊ฐ€ ์ง€๊ฒŒ ๋œ๋‹ค.

- 107 -


SortedDoubleLinkedList์˜ delete prevLoc

loc

1 info

list

info

info

2 10

prevLoc

20

30

info

info

info

10

20

30

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ prevLoc.next = loc.next; loc.next.back = prevLoc;

loc

1 list

๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ loc.next.back = null; list = loc.next;

SortedDoubleLinkedList์˜ delete

list

prevLoc

list

prevLoc

loc

info

info

info

10

20

30

๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ prevLoc.next = null;

loc

info

๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์œ ์ผ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ list = null;

10

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ๋„ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜๋Š” ์œ ์ผ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ™์ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ํ•˜๋‚˜๋Š” list๊ฐ€ ์ฒซ ์š”์†Œ์˜ ํ›„์† ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค ๋ฅธ ํ•˜๋‚˜๋Š” list ๊ฐ’์ด null์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ฆฌ์Šค ํŠธ ๋์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ™์ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋ฆฌ ์Šค ๋์— ์žˆ๋Š” ์š”์†Œ๋Š” ํ›„์† ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ทธ๊ฒƒ์˜ ์„ ํ–‰ ๋…ธ๋“œ ์ •๋ณด๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

- 108 -


public boolean delete(Object item) throws ListUnderflowException{ if(isEmpty()) throw new ListUnderflowException("โ€ฆ"); Comparable x = (Comparable)item; ListNode loc = list; List prevLoc = null; for(int i=0;i<size;i++){ int compResult = x.compareTo(loc.info); if(compResult==0){ // ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ if(prevLoc==null){ // ์ฒซ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ if(loc.next==null) list = null; // ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์œ ์ผ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ else{ loc.next.back = null; list = loc.next; } } else{ prevLoc.next = loc.next; if(loc.next != null) loc.next.back = prevLoc; // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ } return true; } else if(compResult<0) return false; else{ prevLoc = loc; loc = loc.next; } } // for return false; }

8.4. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๊ตฌํ˜„

list

์ƒ‰์ธ

info

next

0

David

2

1

null

5

2

John

4

3

Peter

6

4

Mary

3

5

null

END

6

Robert

END

0

free

1

class ArrayLinkedList{ public static final int DEF_MAX_CAPACITY = 50; public static final int END = -1; private class ListNode{ public Object info; public int next; } private int list = END; private ListNode[] nodes; private int size = 0; private int free = 0; โ€ฆ }

size

5

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์—์„œ ์—ฐ๊ฒฐ์€ ๋ฐฐ์—ด์˜ ์ƒ‰์ธ์ •๋ณด๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ null ๋Œ€์‹ ์— -1์„ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์˜ ๋์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ณด์—ฌ ์ฃผ๊ณ  ์žˆ๋“ฏ์ด ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ผ๋ฐ˜ ์ ์œผ๋กœ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์—์„œ๋Š” ์ƒˆ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๋ฏธ๋ฆฌ ํ•„์š”ํ•œ ๋งŒํผ์˜ ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ ๋‹ค์Œ์— ์ด ๊ณต๊ฐ„์„ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์„ ๋Œ€์‹ ํ•˜์—ฌ ์ง์ ‘ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—์„œ ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ์€ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ์ฒซ ์งธ, ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ํ•ญ์ด ์—†์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋‘˜์งธ, ๊ฐ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋Š” ๊ธฐ์กด๊ณผ ๋‹ฌ๋ฆฌ ์ฃผ์†Œ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด์˜ ์ƒ‰์ธ ์ •๋ณด๊ฐ€ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด ์—ญ์‹œ ๋ฐฐ์—ด์˜ ์ƒ‰์ธ ์ •๋ณด๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ์—ฐ๊ฒฐ๊ตฌ์กฐ์—์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ทธ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ๊ฐ’์„ null ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌํ˜„์—์„œ๋Š” null ๊ฐ’ ๋Œ€์‹ ์— -1์ด๋ผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ -1์€ ์œ ํšจํ•œ ์ƒ‰์ธ ์ •๋ณด๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

- 109 -


๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ โ€“ ๊ณ„์† info

info

info

info

info

David

John

Mary

Peter

Robert

free

null

null

list

info

info

info

info

David

John

Peter

Robert

null

null

null

list

free

Mary์˜ ์‚ญ์ œ

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๊ตฌํ˜„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์Šค์Šค๋กœ ๋นˆ ๊ณต๊ฐ„์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

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

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ์˜ ๊ตฌํ˜„ โ€“ ๊ณ„์† ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๊ตฌํ˜„์˜ ์žฅ์  ๋งค๋ฒˆ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ๊ณต๊ฐ„ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค. ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์ด ์œ ์ผํ•œ ๋Œ€์•ˆ์ด๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๊ตฌํ˜„์˜ ๋‹จ์  ์ผ๋ฐ˜์ ์ธ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ์‚ฝ์ž… ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. 0 2

David

1

2

5

4

John

3

4 6

Peter

5 3

Mary

6 -1

-1

Robert

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ผ๋ฐ˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ๋งค๋ฒˆ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ๊ณต๊ฐ„ ํ• ๋‹น์ด ์ด ๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ์žฅ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ๋ณธ์งˆ์ ์ธ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์‚ฝ์ž… ์—ฐ์‚ฐ์— ์„œ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

- 110 -


ArrayLinkedList์˜ ์ƒ์„ฑ์ž public ArrayLinkedList(int capacity){ if(capacity<0) setup(DEF_LIST_CAPACITY); else setup(capacity); } // ArrayLinkedList(int) public void setup(int capacity){ nodes = new ListNode[capacity]; // ๋นˆ ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ for(int i=0;i<capacity;i++){ nodes[i] = new ListNode(); nodes[i].info = null; ๋ฏธ๋ฆฌ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค. nodes[i].next = i+1; } // for ์ƒˆ๋กœ์šด item์„ ์‚ฝ์ž…ํ•  ๋•Œ์—๋Š” nodes[capacity-1].next = END; ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์— } // ArrayLinkedList::setup(int) ๋งŒ๋“ค์–ด ๋†“์€ ๋…ธ๋“œ์— item์„ ์‚ฝ์ž…ํ•œ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ ๋‹ค. ๋˜ํ•œ ์•ž ์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฒ˜์Œ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ญ๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋นˆ ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

SortedArrayLinkedList์˜ insert ์ƒ‰์ธ

info

next

์ƒ‰์ธ

info

next

0

null

1

0

john

END

1

null

2

1

null

2

2

null

3

2

null

3

3

null

4

3

null

4

4

null

5

4

null

5

5

null

6

5

null

6

6

null

END

6

null

END

list

-1

์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋นˆ ๊ฒฝ์šฐ list == END

int tmp = nodes[free].next; nodes[free].info = item; nodes[free].next = END; list = free; free = tmp;

insert(john);

free

0

size

0

list

0

free

1

size

1

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž…์€ ๊ธฐ์กด ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ์ œ ์™ธํ•˜๊ณ ๋Š” ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ์ฒซ์งธ, ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด new๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š ๊ณ , ๋นˆ ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋‘˜์งธ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ ๊ธฐ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. ๊ธฐ์กด์—๋Š” loc.info = item๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์˜€์ง€๋งŒ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ๋Š” nodes[loc].info = item์™€ ๊ฐ™์ด ๋ฐฐ์—ด ์„ ํƒ์‹์ด ํฌํ•จ๋œ ํ˜•ํƒœ์˜ ํ‘œํ˜„์‹์„ ์‚ฌ ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

- 111 -


SortedArrayLinkedList์˜ insert ์ƒ‰์ธ

info

next

์ƒ‰์ธ

0

john

END

0

john

1

1

null

2

1

Robert

END

2

null

3

2

null

3

info

์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ ๋งจ ๋์— ์‚ฝ์ž… loc == END

next

int tmp = nodes[free].next; nodes[free].info = item; nodes[free].next = END; nodes[prevLoc].next = free; free = tmp;

insert(Robert); 3

null

4

3

null

4

4

null

5

4

null

5

5

null

6

5

null

6

6

null

END

6

null

END

list

0

free

1

size

1

list

0

free

2

size

2

์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž…์€ ์šฐ์„  ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์œ„์น˜๋ฅผ ์ฐพ์œผ๋ฉด ๋นˆ ๋ฆฌ์ŠคํŠธ์— ์„œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ ์ด ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •๋œ ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค.

SortedArrayLinkedList์˜ insert ์ƒ‰์ธ

info

next

์ƒ‰์ธ

info

next

0

john

1

0

john

2

1

Robert

END

1

Robert

END

2

null

3

2

mary

1

3

null

4

3

null

4

4

null

5

4

null

5

5

null

6

5

null

6

6

null

END

6

null

END

์กฐ๊ฑด: ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ

int tmp = nodes[free].next; nodes[free].info = item; nodes[free].next = loc; nodes[prevLoc].next = free; free = tmp;

insert(mary);

list

0

free

2

size

2

list

0

- 112 -

free

3

size

3


SortedArrayLinkedList์˜ insert ์ƒ‰์ธ

info

next

์ƒ‰์ธ

info

์กฐ๊ฑด: ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž… prevLoc == END

next

0

john

2

0

john

2

1

Robert

END

1

Robert

END

2

mary

1

2

mary

1

int tmp = nodes[free].next; nodes[free].info = item; nodes[free].next; = loc; list = free; free = tmp;

insert(Bob); 3

null

4

3

Bob

0

4

null

5

4

null

5

5

null

6

5

null

6

6

null

END

6

null

END

list

0

free

3

size

3

list

3

free

4

size

4

SortedArrayLinkedList์˜ delete ์ƒ‰์ธ

info

next

์ƒ‰์ธ

info

next

0

John

2

0

John

1

1

Robert

END

1

Robert

END

2

Mary

1

2

null

4

3

Bob

0

3

Bob

0

4

null

5

4

null

5

5

null

6

5

null

6

6

null

END

6

null

END

์กฐ๊ฑด: ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ

nodes[prevLoc].next = nodes[loc].next; nodes[loc].info = null; nodes[loc].next; = free; free = loc;

delete(Mary);

list

3

free

4

size

4

list

3

free

2

size

3

๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ์žˆ๋Š” Mary๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ์ด ๋…ธ๋“œ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ฒจ์ ธ์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ํŠน์„ฑ ์ƒ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ๋งจ ์•ž์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋ฏ€๋กœ ์‚ญ์ œ๋˜๋Š” ๋…ธ ๋“œ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

- 113 -


์ œ9์žฅ ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด ์žฅ์—์„œ๋Š” ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

9.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋•Œ ์ž‘์€ ๋ฌธ์ œ๋Š” ์› ๋ฌธ์ œ์™€ ๋™์ผํ•œ ์ข…๋ฅ˜์ด๋‹ค. ๋ฐ˜๋ณต(iteration) ๋Œ€์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• factorial, ์กฐํ•ฉ, ํ•˜๋…ธ์ด ํƒ€์›Œ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„๋œ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ด์ง„ ๊ฒ€์ƒ‰ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์—ญ์ˆœ ์ถœ๋ ฅ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž…

9.2. ์žฌ๊ท€ ๊ธฐ์ดˆ

์žฌ๊ท€(recursion) ์žฌ๊ท€ ํ˜ธ์ถœ: ํ˜ธ์ถœ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ์™€ ํ˜ธ์ถœ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ง์ ‘ ์žฌ๊ท€(direct recursion): ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์žฌ๊ท€ ๊ฐ„์ ‘ ์žฌ๊ท€(indirect recursion): ๋‘˜ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ์ตœ์ดˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ์œผ๋กœ ๋˜๋Œ์•„ ์˜ค๋Š” ๊ฒฝ์šฐ ์žฌ๊ท€์˜ ์˜ˆ: factorial if n = 0 โŽง1, n! = โŽจ โŽฉ n ร— ( n โˆ’ 1) ร— " ร— 1 if n > 0

์˜ˆ8.1) 4!=4ยฑ3ยฑ2ยฑ1=24 ์œ„ factorial์˜ ์ •์˜๋ฅผ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜๋ฉด if n = 0 โŽง1, n! = โŽจ โŽฉ n ร— ( n โˆ’ 1)! if n > 0

base case: ์žฌ๊ท€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ general case

์ด์™€ ๊ฐ™์ด ์ž์‹ ์˜ ์ž‘์€ ๋ฒ„์ „์œผ๋กœ ์ž์‹ ์„ ์ •์˜ํ•˜๋Š” ์ •์˜๋ฅผ ์žฌ๊ท€ ์ •์˜(recursive definition)๋ผ ํ•œ๋‹ค. ์ •์˜

์žฌ๊ท€ ํ˜ธ์ถœ(recursive call)์ด๋ž€ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ์™€ ํ˜ธ์ถœ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ๋งํ•œ๋‹ค. ์žฌ๊ท€ ํ˜ธ์ถœ์€ ํฌ๊ฒŒ ์ง์ ‘ ์žฌ๊ท€์™€ ๊ฐ„์ ‘ ์žฌ๊ท€๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค. ์ง์ ‘ ์žฌ๊ท€๋Š” ์ž๊ธฐ ์ž์‹  ์„ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•˜๋ฉฐ, ๊ฐ„์ ‘ ์žฌ๊ท€๋Š” ๋‘˜ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ์ตœ์ดˆ์˜ ํ˜ธ์ถœ ๋ฉ” ์†Œ๋“œ๋กœ ๋˜๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์„ค๋ช…ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ

- 115 -


๋Š” ๊ณ„์Šน์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ ๋ฅผ ์žฌ๊ท€ ์ •์˜๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์žฌ๊ท€ ์ •์˜๋ž€ ์ž์‹ ์˜ ์ž‘์€ ๋ฒ„์ „(์› ๋ฌธ์ œ์™€ ํ˜•ํƒœ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•จ)์œผ๋กœ ์ž์‹ ์„ ์ •์˜ํ•˜๋Š” ์ •์˜๋ฅผ ๋งํ•œ๋‹ค. ์ด ๋•Œ ์ž์‹ ์˜ ์ž‘์€ ๋ฒ„์ „์œผ๋กœ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ทธ ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด ์ง„๋‹ค. ์ „์ž๋ฅผ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ผ ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๊ธฐ์ € ๊ฒฝ์šฐ๋ผ ํ•œ๋‹ค. ์žฌ๊ท€ ์ •์˜์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ธฐ์ € ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ฐ˜ ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์  ์šฉํ•˜๋ฉด ๊ฒฐ๊ตญ ๊ธฐ์ € ๊ฒฝ์šฐ์— ๋„๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

factorial(4)

public static int factorial(int n){ if(n==0) return 1; else return (n * factorial(n-1)); }

4

recursive ๋ฐฉ๋ฒ• ๋ณดํ†ต ์„ ํƒ๋ฌธ(if, switch)์œผ๋กœ ๊ตฌํ˜„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

3 n=4

24

2 n=3

6

public static int factorial(int n){ int val = 1; for(int i=2; i<=n; i++) val = val * i; return val; }

1 n=2

2

0 n=1

1

n=0 1

non-recursive ๋ฐฉ๋ฒ• ๋ณดํ†ต ๋ฐ˜๋ณต๋ฌธ(for, while)์œผ๋กœ ๊ตฌํ˜„

์–ด๋–ค ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณดํ†ต ๋ฌธ์ œ๋ฅผ ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํ•ด ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•์„ ๋ถ„ํ• ์ •๋ณต๋ฒ•(divide-and-conquer)์ด๋ผ ํ•œ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜์˜€์„ ๋•Œ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์› ๋ฌธ์ œ์™€ ๋™์ผํ•œ ํ˜•ํƒœ์ด๋ฉด ์žฌ๊ท€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณดํ†ต ์„ ํƒ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋ฉฐ, ์กฐ๊ฑด์— ๋”ฐ๋ผ ์žฌ๊ท€ ํ˜ธ์ถœ ์„ ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์ € ๊ฒฝ์šฐ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ณดํ†ต ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณต ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ•˜์˜€์„ ๋•Œ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ๋Š” ๋ณดํ†ต ์šฐ์ˆ˜ํ•˜๋‹ค. ์ด๊ฒƒ์€ ์žฌ๊ท€ ๋ฐฉ์‹์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋ฐ˜๋ณธ์ ์œผ๋กœ ๋งŽ์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ณดํ†ต ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ธฐ์ € ๊ฒฝ์šฐ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ ์ผ์–ด๋‚˜๋ฉฐ, ๊ธฐ์ € ๊ฒฝ์šฐ์—์„œ ์ตœ์ดˆ ํ˜ธ์ถœ๊นŒ์ง€ ๋˜๋Œ์•„์˜ค๋Š” ๊ณผ์ •์—์„œ ์‹ค์ œ ํ•„์š”ํ•œ ๊ณ„์‚ฐ์ด ์ˆ˜ํ–‰๋œ๋‹ค.

- 116 -


๋ฌธ์ œ์— ๋Œ€ํ•œ ์žฌ๊ท€์  ํ•ด๊ฒฐ์ฑ… ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ์‚ฌํ•ญ ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ์žฌ๊ท€ ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๊ฐ ์žฌ๊ท€ํ˜ธ์ถœ ๋•Œ ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์ด๋Š”๊ฐ€? base case ์—ญํ• ์„ ํ•˜๋Š” ๋ฌธ์ œ์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? ๊ฐ ์žฌ๊ท€ํ˜ธ์ถœ์ด ๊ฒฐ๊ตญ์—๋Š” base case์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•  ๋•Œ์—๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์šฐ์„  ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ์งธ, ์žฌ๊ท€์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ์žฌ๊ท€ ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋‘˜์งธ, ๊ฐ ์žฌ๊ท€ ํ˜ธ์ถœํ•  ๋•Œ ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ถ•์†Œ๋˜๋Š”์ง€ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค. ์…‹์งธ, ๊ธฐ์ € ๊ฒฝ์šฐ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ์ € ๊ฒฝ์šฐ๋Š” ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋ชจ๋‘ ๊ธฐ์ € ์—ญํ• ์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋„ท์งธ, ๊ฐ ์žฌ๊ท€ํ˜ธ์ถœ ์ด ๊ฒฐ๊ตญ์—๋Š” ๊ธฐ์ € ๊ฒฝ์šฐ์— ๋„๋‹ฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์•„์•ผ ํ•œ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ๊ฒ€ ์ฆ๊ณผ๋„ ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ค.

์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒ€์ฆ ์„ธ ๊ฐ€์ง€ ์งˆ๋ฌธ basebase-case question: question ๋ฉ”์†Œ๋“œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์žฌ๊ท€์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜? base-case๊ฐ€ ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‚˜? n=0์ผ ๋•Œ๊ฐ€ base-case์ด๋ฉฐ, ์ด ๋•Œ 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. smallersmaller-case question: question ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์› ๋ฌธ์ œ์˜ ์ž‘์€ ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ๊ฒฐ๊ตญ์—๋Š” base-case๊นŒ์ง€ ๋„๋‹ฌํ•˜๋‚˜? ร† ์•„๋‹ˆ๋ฉด ๋ฌดํ•œ ์žฌ๊ท€ ์žฌ๊ท€ํ˜ธ์ถœ์—์„œ ์ธ์ž๋Š” n-1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ผ๋ จ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์€ ์ธ์ž์˜ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ฐ์†Œํ•˜๋ฏ€๋กœ ๊ฒฐ๊ตญ์—๋Š” n์ด 0์ด๋œ๋‹ค. generalgeneral-case question: question ์ „์ฒด์ ์œผ๋กœ ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‚˜? factorial(n-1)์ด (n-1)!์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ์ „์ฒด์ ์œผ๋กœ n!์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์žฌ๊ท€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ ์ œ๋Œ€๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€ ์ง€ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ์งธ, ๊ธฐ์ € ๊ฒฝ์šฐ๋ฅผ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ์ € ๊ฒฝ์šฐ๊ฐ€ ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ฐ˜๋ชฉ๋ฌธ์ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฌดํ•œ์ ์œผ๋กœ ์žฌ ๊ท€ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ, ๊ฐ ์žฌ๊ท€ํ˜ธ์ถœ์ด ์› ๋ฌธ์ œ์˜ ์ž‘์€ ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ตญ์—๋Š” ๊ธฐ์ € ๊ฒฝ์šฐ์— ๋„๋‹ฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์…‹์งธ, ์ „์ฒด์ ์œผ ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.

- 117 -


9.3. ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์˜ˆ

search์˜ ์žฌ๊ท€ ๋ฒ„์ „ UnsortedList์˜ search base case (1) element[startPosition]์— ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (2) startPosition==size-1์ด๊ณ  element[startPosition]์— ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. general case: ๋‚จ์€ ๋ถ€๋ถ„(startPosition์—์„œ ๋๊นŒ์ง€)์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค. โ€ฆ

โ€ฆ

โ€ฆ

๊ฒ€์ƒ‰ํ•ด์•ผ ํ•  ๋ถ€๋ถ„

์ด๋ฏธ ๊ฒ€์ƒ‰ํ•œ ๋ถ€๋ถ„

startPosition

search์˜ ์žฌ๊ท€ ๋ฒ„์ „ โ€“ ๊ณ„์† public boolean search(Object item) throws ListUnderflowException { if(isEmpty()) return new ListUnderflowException(โ€œโ€ฆโ€); return search(item, 0); } private boolean search(Object item, int startPosition){ if(item.equals(element[startPosition])) return true; else if(startPosition==(size-1)) return false; ์‚ฌ์šฉ์ž๋Š” ๊ธฐ์กด์ฒ˜๋Ÿผ search(Object item) else return search(item, startPosition+1); ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. } public boolean search(Object item) throws ListUnderflowException { if(isEmpty()) return new ListUnderflowException(โ€œโ€ฆโ€); for(int i=0; i<size; i++) if(item.equals(element[i])) return true; return false; } โ€ฆ

โ€ฆ

โ€ฆ

1 2 3

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์—์„œ ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ๋Š” ๊ฐ ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์ถ•์†Œ๋˜๋ฏ€๋กœ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด ๋ฐฐ์—ด์— ์—†์œผ ๋ฉด ์ด n๋ฒˆ ์žฌ๊ท€ํ˜ธ์ถœ์ด ์ผ์–ด๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์˜ˆ๋Š” ์žฌ๊ท€๋ณด๋‹ค๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํšจ๊ณผ์ ์ด๋‹ค.

- 118 -


์กฐํ•ฉ(Combination) ์ˆœ์—ด(permutation): n๊ฐœ ์ค‘ r๊ฐœ๋ฅผ ๋น„๋ณต์›์ถ”์ถœํ•˜์—ฌ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ˆœ์—ด ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ n

Pr = n ร— ( n โˆ’ 1) ร— " ร— ( n โˆ’ r + 1)

์กฐํ•ฉ(combination): ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด n๊ฐœ์˜ ์š”์†Œ์—์„œ r๊ฐœ๋ฅผ ๋น„๋ณต์›์ถ” ์กฐํ•ฉ n! ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ n Pr n

์กฐํ•ฉ์˜ ์žฌ๊ท€์  ์ •์˜

n

Cr =

r!

=

r !( n โˆ’ r ) !

โŽงn โŽช n C r = โŽจ1 โŽช C + C โŽฉ n โˆ’1 r โˆ’1 n โˆ’1 r

if r = 1 if n = r if n > r > 1

( n โˆ’ 1)! ( n โˆ’ 1)! + ( r โˆ’ 1)!( n โˆ’ r ) ! r ! ( n โˆ’ r โˆ’ 1) ! โŽ› ( n โˆ’ 1)! 1 โŽž ( n โˆ’ 1)! n โŽž n! โŽ›1 = + = = ( r โˆ’ 1)!( n โˆ’ r โˆ’ 1) ! โŽœโŽ r n โˆ’ r โŽŸโŽ  ( r โˆ’ 1)!( n โˆ’ r โˆ’ 1) ! โŽœโŽ r ( n โˆ’ r ) โŽŸโŽ  r ! ( n โˆ’ r ) !

Cr =

n โˆ’1

C r โˆ’ 1 + n โˆ’1 C r =

์กฐํ•ฉ โ€“ ๊ณ„์† public static int combination(int n, int r){ if(r==1) return n; else if(n==r) return 1; else return (combination(n-1,r-1)+combination(n-1,r)); }

C(2,1) 2

combination(4,3)

C(3,2) C(2,2) 3

1

C(3,3) 1

ํ™•๋ฅ ๊ณผ ํ†ต๊ณ„์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ˆœ์—ด๊ณผ ์กฐํ•ฉ์˜ ๊ณ„์‚ฐ๋„ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ๋Š” ๋’ค์— ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ๊ฐ™์€ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€์  ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์กฐํ•ฉ์€ ์ด์ „์— ์‚ดํŽด๋ณธ ๊ณ„์Šน๊ณผ ๋‹ฌ๋ฆฌ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ € ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜๋Š” ์žฌ๊ท€์™€ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์˜ ์žฌ๊ท€ ๋ฒ„์ „์ฒ˜๋Ÿผ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋ฐ˜๋ณตํ•˜๋Š” ํšŸ์ˆ˜๋งŒํผ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์žฌ๊ท€ ๋ฒ„ ์ „์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

- 119 -


ํ•˜๋…ธ์ด ํƒ€์›Œ

begin peg

aux peg

end peg

peg 1

peg 2

peg 3

์ œ์•ฝ (1) ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ง๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค. (2) ์ž‘์€ ๋ง ์œ„์— ํฐ ๋ง์„ ์˜ฌ๋ ค ๋†“์„ ์ˆ˜ ์—†๋‹ค. ํžŒํŠธ

ํ•˜๋…ธ์ด ํƒ€์›Œ๋Š” ์žฌ๊ท€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์„ค๋ช…ํ•  ๋•Œ ๋งŽ์ด ์†Œ๊ฐœ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ํ•˜๋…ธ์ด ํƒ€์›Œ๋Š” ์„ธ ๊ฐœ ์˜ ๋ง‰๋Œ€๊ธฐ์™€ n๊ฐœ์˜ ๋ง์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ํฐ ์ˆœ์„œ๋ถ€ํ„ฐ ์Œ“์—ฌ ์žˆ๋Š” ๋ง๋“ค์„ ๋ณด์กฐ ๋ง‰๋Œ€ ๊ธฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋‘ ๋ชฉํ‘œ ๋ง‰๋Œ€๊ธฐ๋กœ ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด ๋•Œ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ง๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ๋ง ์œ„์— ํฐ ๋ง์„ ์˜ฌ๋ ค๋†“์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค.

ํ•˜๋…ธ์ด ํƒ€์›Œ โ€“ ๊ณ„์† aux peg

begin peg

end peg

begin peg

aux peg

end peg

ํ•˜๋…ธ์ด ํƒ€์›Œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ์งธ, n-1๊ฐœ์˜ ๋ง์„ ๋ชฉํ‘œ ๋ง‰๋Œ€๊ธฐ๋ฅผ ๋ณด์กฐ ๋ง‰๋Œ€๊ธฐ๋กœ ํ™œ์šฉํ•˜์—ฌ ๋ณด์กฐ ๋ง‰๋Œ€๊ธฐ๋กœ ์ด๋™ํ•œ๋‹ค. ๋‘˜์งธ, ๊ฐ€์žฅ ํฐ ๋ง์„ ๋ชฉํ‘œ ๋ง‰๋Œ€๊ธฐ๋กœ ์˜ฎ๊ธด๋‹ค. ์…‹ ์งธ, ๋ณด์กฐ๋ง‰๋Œ€๊ธฐ์— ์žˆ๋Š” n-1๊ฐœ์˜ ๋ง์„ ์‹œ์ž‘ ๋ง‰๋Œ€๊ธฐ๋ฅผ ๋ณด์กฐ ๋ง‰๋Œ€๊ธฐ๋กœ ์ด์šฉํ•˜์—ฌ ๋ชฉํ‘œ ๋ง‰๋Œ€๊ธฐ๋กœ ์˜ฎ๊ธด๋‹ค.

- 120 -


ํ•˜๋…ธ์ด ํƒ€์›Œ โ€“ ๊ณ„์† ํ•˜๋…ธ์ด ํƒ€์›Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„ 1. n-1๊ฐœ์˜ ๋ง์„ peg 1(์‹œ์ž‘ peg)์—์„œ peg 2(๋ณด์กฐ peg)๋กœ ์˜ฎ๊ฒจ๋ผ. ๋‹จ๊ณ„ 2. n๋ฒˆ์งธ ๋ง์„ peg 3(๋ชฉ์  peg)์œผ๋กœ ์˜ฎ๊ฒจ๋ผ. ๋‹จ๊ณ„ 3. peg 2(๋ณด์กฐ peg)์— ์žˆ๋Š” n-1๊ฐœ์˜ ๋ง์„ peg 3(๋ชฉ์  peg) ์œผ๋กœ ์˜ฎ๊ฒจ๋ผ. public static void doTowers(int numRings, int begPeg, int auxPeg, int endPeg){ if(numRings>0){ doTower(numRings-1, begPeg, endPeg, auxPeg); system.out.println(โ€œMove ring from peg โ€+ begPeg + โ€œ to peg โ€ + endPeg); doTower(numRings-1, auxPeg, begPeg, endPeg); } }

์œ„ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด n๊ฐœ์˜ ๋ง์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ•˜๋…ธ์ด ํƒ€์›Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถœ๋ ฅํ•˜ ์—ฌ ์ค€๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰

public boolean search(Object item){ if(isEmpty()) return new ListUnderflowException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; return search(x, 0, size-1); } private boolean search(Comparable item, int first, int last){ if(first>last) return false; else{ int mid = (first+last)/2; int comp = item.compareTo(element[mid]); if(comp==0) return true; else if(comp<0) return search(item, first, mid-1); else return search(item, mid+1,last); } }

Base case (1) first>last ร† false๋ฅผ ๋ฐ˜ํ™˜ (2) item.compareTo(element[mid])==0 ร† true๋ฅผ ๋ฐ˜ํ™˜ General case (1) item.compareTo(element[mid])<0 ร† search(first,mid-1) (2) item.compareTo(element[mid])>0 ร† search(mid+1,last)

์ด ์ ˆ ์ฒ˜์Œ์— ์„ ํ˜• ๊ฒ€์ƒ‰์„ ์žฌ๊ท€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณธ ๋ฐ” ์žˆ๋‹ค. ๊ทธ ๋•Œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์„ ํ˜• ๊ฒ€์ƒ‰์„ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด์—ˆ๋‹ค. ์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ n๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์˜€๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰์„ ์žฌ๊ท€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ log2n๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ(ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋น„์šฉ)๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

- 121 -


์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์žฌ๊ท€ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅ list

A

B

2

C

D

E

1 ์ด๊ฒƒ์„ ์ถœ๋ ฅ: E,D,C,B, A

์ด ๋ถ€๋ถ„์„ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅ: E,D,C,B

public void PrintReverse() { revPrint(list); } private void revPrint(ListNode node){ if(node != null){ revPrint(node.next); System.out.println(โ€œ โ€ + node.info); } }

์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค. ์ด ๋ฌธ์ œ ๋Š” ์žฌ๊ท€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒ ์€ LIFO ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์ด ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์Šคํƒ์— ์š”์†Œ๋“ค์„ pushํ•œ๋‹ค. ๊ทธ ๋‹ค ์Œ์— ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์˜€์œผ๋ฉด ์Šคํƒ์—์„œ ์ฐจ๋ก€๋Œ€๋กœ popํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค์„ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ์ฒซ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์› ๋ฌธ์ œ์˜ ์ž‘์€ ๋ฒ„์ „์ด๋ฏ€๋กœ ์œ„ ์„œ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ์žฌ ๊ท€ ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ์‰ฌ์šฐ๋‚˜ ๋ฐ˜๋ณต ๋ฐฉ์‹์œผ ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด ๋ฌธ์ œ๋„ ์žˆ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์žฌ๊ท€ โ€“ ๊ณ„์† private ListNode insert(ListNode subList, Comparable item){ if(subList==null || item.compareTo(subList.info)<0){ ListNode newNode = new ListNode(); newNode.info = item; newNode.next = subList; ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž… return NewNode; } Base Case: else{ (1) ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด subList.next = insert(subList.next, item); ๋นˆ ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž… return subList; (2) ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ } ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ์š”์†Œ๋ณด๋‹ค } ์ž‘์œผ๋ฉด ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž… public void insert(Object item){ General Case: if(item==null) insert(sublist.next, item) return new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; list = insert(list, x); }

- 122 -


์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์žฌ๊ท€ โ€“ ๊ณ„์† list

6

11

2

20

11

1

insert(list,15)

15

20

15

20

15

20

1 6

6

11

20 11

insert(subList.next,15) 2 11

list

20

6

insert(subList.next,15) 3 20

15

11

20

์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ์ž… ๋ฌธ์ œ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์˜ˆ๋„ ์„ ํ˜• ๊ฒ€์ƒ‰๊ณผ ๋งˆ ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ n๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์˜ˆ๋Š” ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฝ์ž… ๋ฌธ์ œ๋ฅผ ์ด์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ(๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ์‚ฝ์ž…)๋กœ ๋ฐ”๊พธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์›๋ž˜ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฝ ์ž…์€ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ญ์ƒ ๋งจ ์•ž์˜ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ๋ฐ”๊พธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

9.4. ์žฌ๊ท€์˜ ๋™์ž‘ ์›๋ฆฌ

์žฌ๊ท€์˜ ๋™์ž‘ ์›๋ฆฌ public static int factorial(int n){ if(n==2) return 2; else return (n * factorial(n-1)); } factorial(3)/ call factorial(2)

public static void main(String[] args){ int result = factorial(4); System.out.println(โ€œ4! = โ€+result); }

parameter

2

Return Address 1000 return 2

factorial(4)/ call factorial(3)

Return Value

?

parameter

3

2

Return Address 1000 return 3*2 call

return Return Value main/ call factorial(4)

runtime stack

?

parameter

4

Return Address

100

Return Value

?

6

return 4*6 24

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” C/C++ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋–ค ๋ฉ”์†Œ๋“œ ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ์ž‘์—… ๊ณต๊ฐ„์ด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค. ์ด ๊ณต๊ฐ„์„ ์Šคํƒ ํ”„๋ ˆ์ž„(stack frame) ๋˜๋Š”

activation record๋ผ ํ•œ๋‹ค. ์ด ๊ณต๊ฐ„์—๋Š” ๋ณต๊ท€ ์ฃผ์†Œ(return address), ๋ฐ˜ํ™˜๋  ๊ฐ’, ๋งค๊ฐœ ๋ณ€์ˆ˜, ์ง€ ์—ญ ๋ณ€์ˆ˜ ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค. ์ด ๊ณต๊ฐ„์„ ์Šคํƒ ํ”„๋ ˆ์ž„์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒˆ ๋ฉ”์†Œ๋“œ์˜ ์ž‘์—… ๊ณต๊ฐ„์ด ๊ธฐ์กด ์ž‘์—… ๊ณต๊ฐ„ ์œ„์—

- 123 -


์Œ“์—ฌ์ง€๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์˜ˆ์ œ์ฒ˜๋Ÿผ ์žฌ๊ท€ ๋ฐฉ์‹์˜ ๊ณ„์Šน ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ณ„์Šน ๋ฉ” ์†Œ๋“œ๋ฅผ ์œ„ํ•œ ์ž‘์—… ๊ณต๊ฐ„์ด ํ• ๋‹น๋œ๋‹ค. ์ด ๋•Œ ์ด ๋ฉ”์†Œ๋“œ์—์„œ ๋‹ค์‹œ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ๊ธฐ ์กด ์ž‘์—… ๊ณต๊ฐ„์€ ์Šคํƒ์— push๋˜๊ณ  ๋˜ ๋‹ค๋ฅธ ์ž‘์—… ๊ณต๊ฐ„์ด ํ• ๋‹น๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ๊ธฐ ์ € ๊ฒฝ์šฐ์— ๋„๋‹ฌ๋˜์–ด ํ˜„์žฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ์—์„œ ์ž‘์—… ๊ณต๊ฐ„์„ ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

9.5. ๊ธฐํƒ€ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋˜๋ฉด ๋ณดํ†ต ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€ ๋งŒ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ ๊ฒฐ๊ณผ๊ฐ€ ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ๋Š” ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ์—๋Š” ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ์ œ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฐฉ๋ฒ•์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ข‹์€ ์ˆ˜๋‹จ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

์žฌ๊ท€์˜ ์ œ๊ฑฐ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ• ๋ฐฉ๋ฒ• 1. ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋ฐ˜๋ณต๋ฌธ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ผฌ๋ฆฌ ์žฌ๊ท€(tail recursion)์ด๋ฉด ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์žฌ๊ท€ ๋ฐฉ๋ฒ• 2. ์Šคํƒ ์‚ฌ์šฉ ๋ฆฌ์ŠคํŠธ์˜ ์—ญ์ˆœ ์ถœ๋ ฅ: ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ๋…ธ๋“œ์˜ ์š”์†Œ ๊ฐ’์„ ์Šคํƒ์— pushํ•œ ๋‹ค์Œ์— ์Šคํƒ์—์„œ ํ•˜๋‚˜์”ฉ pop ํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ด ์žˆ๋‹ค. ์ฒซ์งธ, ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ๋‘˜์งธ, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ „์ž๋Š” ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด ์‰ฝ๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , ํ›„์ž๋Š” ์Šคํƒ์„ ์ง ์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์ด ํฌ๊ฒŒ ์ œ๊ณ ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

- 124 -


์žฌ๊ท€ ร† ๋ฐ˜๋ณต ๊ผฌ๋ฆฌ ์žฌ๊ท€: ๋ฉ”์†Œ๋“œ ๋‚ด์— ๋ชจ๋“  ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์ธ ๊ฒฝ์šฐ base case๊ฐ€ ๋˜๋ฉด ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋˜๋„๋ก ๋ฐ˜๋ณต๋ฌธ์„ ๊ตฌ์„ฑํ•˜์—ฌ ์‰ฝ๊ฒŒ ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ ์ด ๋•Œ ๋ฃจํ”„ ๋ณ€์ˆ˜๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ์ธ์ž ๊ผฌ๋ฆฌ ์žฌ๊ท€๊ฐ€ ์•„๋‹ˆ๋ฉด ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. boolean search(Comparable item){ int loc = 0; boolean found = false; while(loc<size && !found){ if(item.compareTo(element[loc])==0) found = true; else loc++; } return found; }

boolean search(Comparable item, int start){ if(item.compareTo(element[start])==0) return true; else if(start==size-1) return false; else return search(item, start+1); }

์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์†Œ๋“œ ์ค‘์— ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋ชจ๋‘ ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์ด๋ฉด ์ด๋Ÿฐ ์žฌ๊ท€๋ฅผ ๊ผฌ๋ฆฌ ์žฌ๊ท€

(tail recursion)๋ผ ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ทธ ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์ด๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ ๋ฌธ์žฅ ์ดํ›„์— ๋” ์ด์ƒ ์ถ”๊ฐ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์žฅ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฅผ ๋งํ•œ๋‹ค. ๊ผฌ๋ฆฌ ์žฌ๊ท€์ธ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์ € ๊ฒฝ์šฐ์— ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋˜๋„๋ก ๋ฐ˜๋ณต๋ฌธ์„ ๊ตฌ์„ฑํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ์ธ์ž๋ฅผ ๋ฐ˜๋ณต ๋ฌธ์˜ ์ œ์–ด ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์žฌ๊ท€์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด: ๋ช…ํ™•์„ฑ, ํšจ์œจ์„ฑ ๋ช…ํ™•์„ฑ: ์žฌ๊ท€๊ฐ€ ๋ณดํ†ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค. ์˜ˆ8.2) ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ํšจ์œจ์„ฑ: ์žฌ๊ท€๊ฐ€ ๋‹น์—ฐํžˆ ๊ณต๊ฐ„๊ณผ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ ๋ชจ๋‘ ๋‚˜์˜๋‹ค. ์ ˆ๋Œ€์ ์ธ ๊ฒƒ์€ ์•„๋‹˜: ๋ฌธ์ œ, ์ปดํ“จํ„ฐ, ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ8.3) factorial(n): n+1๊ฐœ์˜ stack frame์ด ํ•„์š” ร† O(n) ๋ฌธ์ œ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ์žฌ๊ท€์— ๋งž์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ร† ์กฐํ•ฉ: ๊ฐ™์€ ๊ณ„์‚ฐ์ด ๋ฌด์ˆ˜ํžˆ ๋ฐ˜๋ณต ร† O(2N) C(5,3) C(4,3)

C(4,2) C(3,1)

C(3,2) C(2,1)

C(3,2)

C(2,2)

C(2,1)

C(3,3)

C(2,2)

์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช…ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๋ฉด์— ์„œ ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์ ˆ๋Œ€์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์žฌ๊ท€๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋œ ์–ธ์–ด๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฌ๊ท€ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์„ ๋•Œ ์กฐํ•ฉ๊ณผ ๊ฐ™์ด ๊ฐ™์€ ๊ณ„์‚ฐ ์„ ๋ฌด์ˆ˜ํžˆ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์žฌ๊ท€์— ๋งž์ง€ ์•Š๋Š” ๋ฌธ์ œ์ด๋‹ค.

- 125 -


๋ช…ํ™•์„ฑ ์ธก๋ฉด์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณดํ†ต ์žฌ๊ท€์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ํŠนํžˆ ํ”„๋กœ๊ทธ๋žจ ๋ฌธ์žฅ ์ˆ˜ ์ธก๋ฉด์—์„œ๋Š” ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์„ ๊ฒฝ ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์šฐ์„  ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ์ง€ ์‚ดํŽด๋ณธ๋‹ค. ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ๋„ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์ด ์—†๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. ๋งŒ์•ฝ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋‚˜์œ ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ž์„œ ์‚ดํŽด๋ณธ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•œ๋‹ค.

- 126 -


์ œ10์žฅ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ์ด ์žฅ์—์„œ๋Š” ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค. ํŠนํžˆ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(binary search tree)์— ๋Œ€ํ•ด ์ง‘์ค‘์ ์œผ๋กœ ์‚ดํŽด๋ณธ๋‹ค.

10.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ํŠธ๋ฆฌ ๊ฐœ์š” ์ด์ง„ ํŠธ๋ฆฌ ๊ฐœ์š” ์ˆœํšŒ ๋ฐฉ๋ฒ• ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ADT ๊ฒ€์ƒ‰ ์‚ฝ์ž… ์‚ญ์ œ ์ˆœํšŒ ์ด์ง„ ํŠธ๋ฆฌ ๊ท ํ˜• ๋งž์ถ”๊ธฐ

10.2. ํŠธ๋ฆฌ

ํŠธ๋ฆฌ ๊ตฌ์กฐ ์„ ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์— ๋น„ํ•ด ์šฐ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ๋Š” ์šฐ์ˆ˜ํ•˜๋‹ค. ์„ ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋˜ ๋‹ค๋ฅธ ๋‹จ์ ์€ ์ž„์˜ ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์—์„œ๋„ ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์„ ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋งŒ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ฆฌ(tree)๋Š” ํŠธ๋ฆฌ ๋ฃจํŠธ(root)๋ผ๊ณ  ํ•˜๋Š” ์œ ์ผํ•œ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ์„œ, ๊ตฌ์กฐ ๋ฃจํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ์œ ์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์กฐ ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ๋Š” ์žฌ๊ท€ ๊ตฌ์กฐ(recursive structure)์ด๋‹ค. ๊ตฌ์กฐ ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„ํŠธ๋ฆฌ(subtree)๋ฅผ ๋ถ€๋ถ„ํŠธ๋ฆฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

7์žฅ์—์„œ ์‚ดํŽด๋ณธ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋ฆฌ์ŠคํŠธ๋Š” 5์žฅ์—์„œ ์‚ดํŽด๋ณธ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๊ณต๊ฐ„ ํ™œ์šฉ ์ธก๋ฉด์—์„œ๋Š” ์šฐ์ˆ˜ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ์˜คํžˆ๋ ค ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์šฐ์ˆ˜ ํ•˜๋‹ค. ํŠนํžˆ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์€ ์ž„์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ

- 127 -


์ง€๋งŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ์—๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฐ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํŠธ๋ฆฌ(tree) ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํŠธ๋ฆฌ๋Š” ๋ฃจํŠธ(root)๋ผ๊ณ  ํ•˜๋Š” ์œ ์ผํ•œ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ๋ฃจํŠธ์— ์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ(path)๊ฐ€ ์œ ์ผํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๋…ธ๋“œ A์—์„œ ๋…ธ๋“œ B๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ž€ ๋…ธ๋“œ A์™€ ๋…ธ๋“œ B๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ ๋“ค์— ์˜ํ•ด ์ธ์ ‘ํ•œ ์ผ๋ จ์˜ ๋…ธ๋“œ๋“ค์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ ์˜ ์ •์˜์— ์˜ํ•˜๋ฉด 7์žฅ์—์„œ ์‚ดํŽด๋ณธ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์„ ํ˜• ๋ฆฌ์ŠคํŠธ๋Š” ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ตœ๋Œ€ ํ•˜๋‚˜ ๋งŒ ๊ฐ€์ง€๋Š” ์ผ์ข…์˜ ํŠธ๋ฆฌ์ด๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ์žฌ๊ท€ ๊ตฌ์กฐ๋ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๋Š” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ํŠธ๋ฆฌ๋ฅผ ์› ํŠธ๋ฆฌ์˜ ๋ถ€ ๋ถ„ ํŠธ๋ฆฌ(subtree)๋ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ ๊ตฌ์กฐ โ€“ ๊ณ„์† root (๋ฃจํŠธ ๋…ธ๋“œ) internal node, intermediate node (์ค‘๊ฐ„ ๋…ธ๋“œ, ๋‚ด๋ถ€ ๋…ธ๋“œ)

ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹˜ ร† ๊ทธ๋ž˜ํ”„

subtree (๋ถ€๋ถ„ ํŠธ๋ฆฌ)

leaf node (๋‹จ๋ง ๋…ธ๋“œ)

๋ฃจํŠธ: ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ ๋‹จ๋ง: ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ

๋ฃจํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ถ€๋ชจ๊ฐ€ ํ•˜๋‚˜์ด์–ด์•ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ ์šฉ์–ด ๋ฃจํŠธ ๋…ธ๋“œ(root node): ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ์œ ์ผํ•œ ๋…ธ๋“œ ๋‹จ๋ง ๋…ธ๋“œ(leaf node): ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ ์ค‘๊ฐ„ ๋…ธ๋“œ(internal node): ๋‹จ๋ง ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ ํ˜•์ œ ๋…ธ๋“œ(sibling node): ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ ์กฐ์ƒ ๋…ธ๋“œ(ancestor node): ๋…ธ๋“œ์—์„œ ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ ํ›„์† ๋…ธ๋“œ(descendant node): ๋…ธ๋“œ์—์„œ ๋‹จ๋ง ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ: ๋ฃจํŠธ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ ๋ฃจํŠธ ๋…ธ๋“œ๋Š” 0 ๋ ˆ๋ฒจ์— ์œ„์น˜ํ•˜๋ฉฐ, ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ๊ทธ ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ์ด ๋œ๋‹ค. ํŠธ๋ฆฌ์˜ ๋†’์ด: ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ๊ธธ์ด

ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์œ ์ผํ•œ ์‹œ์ž‘ ๋…ธ๋“œ์ธ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด ๋…ธ๋“œ๋งŒ ์œ  ์ผํ•˜๊ฒŒ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค. ๋˜ํ•œ ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋ฅผ ๋‹จ๋ง ๋…ธ๋“œ(leaf node)๋ผ ํ•˜๋ฉฐ, ๋‹จ๋ง ๋…ธ ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ค‘๊ฐ„ ๋…ธ๋“œ ๋˜๋Š” ๋‚ด๋ถ€ ๋…ธ๋“œ๋ผ ํ•œ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฃจ ํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋งํ•˜๋ฉด ๊ฐ ๋…ธ๋“œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜

- 128 -


๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ๋“ค์„ ํ˜•์ œ ๋…ธ๋“œ(sibling node)๋ผ ํ•œ๋‹ค. ๋…ธ๋“œ์—์„œ ๋ฃจํŠธ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋…ธ๋“œ์˜ ์กฐ์ƒ ๋…ธ๋“œ(ancestor node)๊ฐ€ ๋˜๋ฉฐ, ๊ฑฐ๊พธ๋กœ ํ•œ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹จ๋ง ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๊ทธ ๋…ธ๋“œ์˜ ํ›„์† ๋…ธ๋“œ(descendant

node)๊ฐ€ ๋œ๋‹ค. ํŠธ๋ฆฌ์˜ ๋ ˆ๋ฒจ(level)์ด๋ž€ ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ๋ ˆ๋ฒจ 0 ์— ์œ„์น˜ํ•˜๋ฉฐ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๋ฐ”๋กœ ์ž์‹ ๋…ธ๋“œ๋“ค์€ ๋ ˆ๋ฒจ 1์— ์œ„์น˜ํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ๋ ˆ๋ฒจ์ด ๋†’์€ ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ์— ์˜ํ•ด ํŠธ๋ฆฌ์˜ ๋†’์ด(height)๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ ์ด์ง„ ํŠธ๋ฆฌ(binary tree): ํŠธ๋ฆฌ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ ๊ฐ ๋ ˆ๋ฒจ l์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ์˜ ์ˆ˜: 2l ๋†’์ด๊ฐ€ h์ธ ํŠธ๋ฆฌ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ์˜ ์ˆ˜: 2h+1-1 20 + 21 +"+ 2h =

2h+1 โˆ’ 1 h+1 = 2 โˆ’1 2 โˆ’1

root

level 0

A

level 1 B

C

level 2 D

E

F

level 3 G height(depth): 3

N๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ์˜ ์ตœ์†Œ ๋†’์ด: โŽฃโŽข log 2 N โŽฆโŽฅ 2h โ‰ค N < 2h+1 (๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ 2 ์ผ ๋•Œ ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” h) 2h โˆ’ 1 < 2h < 2h+1 โˆ’ 1 h

h โ‰ค log2 N < h + 1

H

I

J leaf

G๋Š” B์˜ ์ž์† ๋…ธ๋“œ C๋Š” I์˜ ์กฐ์ƒ ๋…ธ๋“œ G๋Š” D์˜ ์™ผ์ชฝ ์ž์‹(left child) H๋Š” D์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹(right child) G์™€ H๋Š” ํ˜•์ œ ๋…ธ๋“œ(sibling)

ํŠธ๋ฆฌ ์ค‘์— ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 2์ธ ํŠธ๋ฆฌ๋ฅผ ์ด์ง„ ํŠธ๋ฆฌ(binary tree)๋ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ง„ ํŠธ๋ฆฌ์˜ ๊ฐ ๋ ˆ๋ฒจ ๎ƒฐ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ์˜ ์ˆ˜๋Š” ๎€ต๎ƒฐ ์ด๋‹ค. ๋˜ํ•œ ๋†’์ด๊ฐ€ ๎ƒฌ ์ธ ํŠธ๋ฆฌ์— ์žˆ ๎€ฝ ๎€ด ๎ƒฌ ๎ƒฌ๎ˆ๎€ด ๎† ๎€ด ์ด๋‹ค. ๎€ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ๋…ธ๋“œ์˜ ์ˆ˜๋Š” ๎€ต ๎ˆ ๎€ต ๎ˆ ๎“๎“๎“ ๎ˆ ๎€ต ๎‡ ๎€ต

์žˆ๋Š” ์ตœ๋Œ€์˜ ๋†’์ด๋Š” ๎€ -1์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ๎€ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ์˜ ์ตœ์†Œ ๋†’์ด๋Š”

๎ƒฐ๎ƒณ๎ƒซ๎€ต๎€ ์ด๋‹ค. ์ด๊ฒƒ์€ ๎€ ์˜ ๋ฒ”์œ„๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ๎€ต๎ƒฌ โ‰ฆ ๎€ ๎• ๎€ต๎ƒฌ ๎ˆ ๎€ด ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ ค ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

- 129 -


์ด์ง„ ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜

ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(full binary tree):

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(complete binary tree):

๋ชจ๋“  ๋‹จ๋ง ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ์ค‘๊ฐ„ ๋…ธ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ

๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๋ฉด ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ ์ด๋ฉฐ, ์ดคํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋‹จ๋ง ๋…ธ๋“œ๋“ค์€ ์™ผ์ชฝ์— ์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง„ ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ

๋‹จ๋ง ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ n์ด๋ฉด ์ „์ฒด ๋…ธ๋“œ์˜ ์ˆ˜๋Š” N=2n-1์ด๋‹ค.

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์—์„œ ์ค‘๊ฐ„ ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2์ผ ๋•Œ ๋‹จ๋ง ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ n์ด๋ฉด ์ „์ฒด ๋…ธ๋“œ์˜ ์ˆ˜๋Š” N=2n-1์ด๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ๋‹จ๋ง ๋…ธ๋“œ๋Š” ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๊ณ  ๋ชจ๋“  ์ค‘๊ฐ„ ๋…ธ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ๋ฅผ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(full binary tree)๋ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๋ฉด ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์ด๋ฉฐ, ์ตœํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋‹จ๋ง ๋…ธ๋“œ๋“ค์€ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง„ ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋Š” ํŠธ๋ฆฌ ๋ฅผ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(complete binary tree)๋ผ ํ•œ๋‹ค.

10.3. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(binary search tree)๋ž€ ํŠธ๋ฆฌ ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์™ผ์ชฝ ์ž์† ๋…ธ๋“œ๋“ค์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค๋Š” ํ•ญ์ƒ ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ ์ž์† ๋…ธ๋“œ๋“ค์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค๋Š” ํ•ญ์ƒ ์ž‘์€ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. 60

45 (์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ) left subtree

63

41

40

55

43

62

(์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ) right subtree

65

50

์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’<๋ฃจํŠธ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’<์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(binary search tree)๋ž€ ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์™ผ์ชฝ ์ž์† ๋…ธ๋“œ๋“ค์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค๋Š” ํ•ญ์ƒ ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ ์ž์† ๋…ธ๋“œ๋“ค์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค๋Š” ํ•ญ์ƒ ์ž‘์€ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค.

- 130 -


์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์˜ˆ 60

height: 9 ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ (skewed binary tree)

40

50

41 45

63

40

55

43 45

41

55

62

65

45

62 50

40

43

50

43 height: 3

60

65

60

height: 4 41

55

63 62 63 65

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ชจ์Šต์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์— ๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑํ•œ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ชจ์Šต์˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ์—ฌ ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํŽธํ–ฅ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด ์—ฐ ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ๋ฆฌ์ŠคํŠธ์™€ ์ฐจ์ด๊ฐ€ ์ „ํ˜€ ์—†๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ ์ˆœํšŒ(traversing): ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ ์ˆœํšŒ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• ์ „์œ„(preorder) ์ˆœํšŒ: ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ร† ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ์ „์œ„ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ร† ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ์ค‘์œ„(inorder) ์ˆœํšŒ: ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ร† ๋ฃจํŠธ ์ค‘์œ„ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ร† ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ํ›„์œ„(postorder) ์ˆœํšŒ: ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ร† ํ›„์œ„ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ร† ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ด๋“ค ์ˆœํšŒ ๋ฐฉ๋ฒ•์€ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ์— ์˜ํ•ด ๊ตฌ๋ถ„๋˜๋ฉฐ, ๊ตฌ๋ถ„ ์œ„ ์„ธ ๊ฐ€์ง€ ์ˆœํšŒ ๋ฐฉ๋ฒ•์€ ๊ณตํ†ต์ ์œผ๋กœ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ณด๋‹ค ๋จผ์ € ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ค‘์œ„ ์ˆœํšŒ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค.

์ˆœํšŒ(traverse)๋ž€ ๊ตฌ์กฐ์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ตœ์†Œ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ ์‹์˜ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์ฒซ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ์—์„œ ์ˆœํšŒ๋Š” ํ•œ ๋…ธ๋“œ์—์„œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๋…ธ ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•˜๊ฒŒ ์ˆœํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ ๋˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ „์œ„(preorder), ์ค‘์œ„(inorder), ํ›„์œ„(postorder) ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋“ค์€ ๋ฃจํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ์— ์˜ํ•ด ๊ตฌ๋ถ„๋˜๋ฉฐ, ํ•ญ์ƒ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ๋ฅผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ๋ณด๋‹ค ๋จผ์ € ๋ฐฉ๋ฌธํ•œ๋‹ค. ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ์ค‘์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค.

- 131 -


์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ์˜ ์˜ˆ 60

45

41

Preorder: 60 45 41 55 63 65 Inorder: 41 45 55 60 63 65 Postorder: 41 55 45 65 63 60

63

55

65

50

40

Preorder: 50 40 45 43 47 55 52 62 60 65 Inorder: 40 43 45 47 50 52 55 60 62 65 Postorder: 43 47 45 40 52 60 65 62 55 50

55

45

43

52

47

62

60

65

BST Interface Import java.util.Iterator; public interface BST{ int INORDER = 1; int PREORDER = 2; int POSTORDER = 3; boolean isEmpty(); boolean isFull(); void clear(); int numOfNodes(); boolean search(Object item); Object retrieve(Object item); void insert(Object item); boolean delete(Object item); Iterator iterator(int type); }

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ค‘๋ณต ์š”์†Œ์˜ ์ถ”๊ฐ€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

์ˆœํšŒ ๋ฐฉ๋ฒ•

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •์˜์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ๋‹ค๋งŒ size ๋ฉ”์†Œ๋“œ ๋Œ€์‹ ์— numOfNodes๋ผ๋Š” ๋ฉ”์†Œ ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ์„ธ ์ข…๋ฅ˜์˜ ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ƒ์ˆ˜ ๊ฐ’๋“ค์ด ์ถ”๊ฐ€๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

- 132 -


public class BinarySearchTree implements BST{ protected class BSTNode{ public Object info; public BSTNode left; public BSTNode right; } protected class TreeIterator implements Iterator{ LinkedQueue traverseQueue; public TreeIterator(int type){โ€ฆ} public boolean hasNext(){โ€ฆ} public Object next(){โ€ฆ} public void remove(){โ€ฆ} private void preOrder(BSTNode node){โ€ฆ} node.left private void inOrder(BSTNode node){โ€ฆ} private void postOrder(BSTNode node){โ€ฆ} } protected BSTNode root = null; protected int numOfNodes = 0; public BinarySearchTree(){} public boolean isEmpty(){ return (root==null); } public boolean isFull(){ return false; } void clear() { โ€ฆ } public int numOfNodes(){ return numOfNodes; } public boolean search(Object item){โ€ฆ} public Object retrieve(Object item){โ€ฆ} public void insert(Object item){โ€ฆ} public boolean delete(Object item){โ€ฆ} public Iterator iterator(int type){ return new TreeIterator(type); } }

node.right node.info

ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด BSTNode๋ผ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. BSTNode ํด๋ž˜์Šค ๋Š” 7์žฅ์—์„œ ์‚ฌ์šฉํ•œ ListNode์™€ ๋‹ฌ๋ฆฌ ๋‘ ๊ฐ€์ง€ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. left๋Š” ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜์ด๊ณ , right๋Š” ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋‹ค. TreeIterator๋Š” ์ˆœํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค์ด๋‹ค.

NumOfNodes ์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ public int size(){ return size(root); } private int size(BSTNode node){ if(node == null) return 0; // leaf node else return(size(node.left)+size(node.right)+1); }

Tip. ํŠธ๋ฆฌ๋Š” ์žฌ๊ท€์  ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๋‹ค.

ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ์ฆ๊ฐ€ํ•˜๊ณ  ์‚ญ์ œ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ์†Œํ•˜๋Š” numOfNodes ๋ผ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์–ธ์ œ๋“ ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ทธ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค. ์ด ๋ฉ”์†Œ๋“œ ์—์„œ ์žฌ๊ท€ ํ˜ธ์ถœ์€ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํŠธ ๋ฆฌ๋Š” ๊ทธ ์ž์ฒด๊ฐ€ ์žฌ๊ท€ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์„ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

- 133 -


NumOfNodes ๋น„์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ E F C

C

E

F

A

count = 0; A ํŠธ๋ฆฌ๊ฐ€ empty๊ฐ€ ์•„๋‹ˆ๋ฉด ๋‹ค์Œ์„ ์Šคํƒ์„ ์Šคํƒ ํ•˜๋‚˜ ์ƒ์„ฑ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— push ์Šคํƒ์ด empty๊ฐ€ ์•„๋‹ˆ๋ฉด ๋‹ค์Œ์„ ๋ฐ˜๋ณต ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์Šคํƒ top์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ ์Šคํƒ์—์„œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ popํ•œ ๋‹ค์Œ์— count๋ฅผ 1 ์ฆ๊ฐ€ ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ ์ž์‹์ด ์žˆ์œผ๋ฉด ๊ทธ ์ž์‹์„ ์Šคํƒ์— push ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์žˆ์œผ๋ฉด ๊ทธ ์ž์‹์„ ์Šคํƒ์— push return count;

์žฌ๊ท€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณด์ž. ์žฌ๊ท€ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์„ ๋ณด๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๊ฐ™์€ ๋ฌธ์žฅ์—์„œ ๋‘ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ๊ผฌ๋ฆฌ ์žฌ๊ท€๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‰ฝ๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉ ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๋Œ€์‹ ์— ์Šคํƒ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค. ๋น„์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ ๊ณ ๋ฆฌ์ฆ˜์€ ์œ„ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™๋‹ค.

search ์žฌ๊ท€ ๋ฐฉ๋ฒ•์œผ๋กœ private boolean search(Comparable item, BSTNode node){ if(node == null) return false; int comp = item.compareTo(node.info); if(comp<0) return search(item, node.left); else if(comp>0) return search(item, node.right); else return true; } public boolean search(Object item){ if(isEmpty()) throw new TreeUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; return search(x, root); }

60

45

63

41

55

62

65

์ „ํ˜•์ ์ธ ์ด์ง„ ๊ฒ€์ƒ‰ 40

43

50

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰์€ ์ „ํ˜•์ ์œผ๋กœ ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋จผ์ € ๋ฃจํŠธ์™€ ๋น„๊ตํ•œ ๋‹ค์Œ์— ๋ฃจํŠธ๋ณด๋‹ค ์ฐพ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์ž‘์œผ๋ฉด ๋ฃจํŠธ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ๋ฒˆ ๋น„๊ตํ•  ๋•Œ๋งˆ๋‹ค ํ•œ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋Š” ํ›„๋ณด์—์„œ ์ œ์™ธ๋œ๋‹ค. ํŠธ๋ฆฌ๊ฐ€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๊ณ , ํŠธ๋ฆฌ์— ๎€ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ํŠธ๋ฆฌ์—์„œ ์žฌ๊ท€ ํ˜ธ์ถœ์€ ์ตœ๋Œ€ ํŠธ๋ฆฌ์˜ ๋†’์ด์ธ ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

- 134 -

๎ƒฐ๎ƒณ๎ƒซ๎€ต๎€ ๋ฒˆ ์ด๋ฃจ์–ด์ง„๋‹ค.


search ๋ฐ˜๋ณต ๋ฐฉ๋ฒ•์œผ๋กœ found = false; ํŠธ๋ฆฌ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด return false; moreToSearch = true; node = root; found๊ฐ€ true์ด๊ฑฐ๋‚˜ moreToSearch๊ฐ€ false์ผ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์„ ๋ฐ˜๋ณต node์™€ item์„ ๋น„๊ต ๊ฐ™์œผ๋ฉด return true; item์ด node๋ณด๋‹ค ์ž‘์œผ๋ฉด node = node.left; item์ด node๋ณด๋‹ค ํฌ๋ฉด node = node.right; moreToSearch = (node != null) return found

๊ฒ€์ƒ‰์˜ ์žฌ๊ท€ ๊ตฌํ˜„์€ ๊ผฌ๋ฆฌ์žฌ๊ท€์ด๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์—๋Š” ์‰ฝ๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

insert 1 insert(5)

2 insert(9)

5

5 insert(8)

9 3 insert(7)

4

insert(3)

5

7

3

3

9

7

6

7

9

3 12

9

4

7

12

5 9

7

5

7

insert(12)

8 3

insert(4)

5

5

9

8

insert(6)

5

5

6 3

8

6

8

9

12

7

8

ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ๋กœ ์ถ”๊ฐ€๋œ๋‹ค. ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ๊ฐ€ ํŠธ๋ฆฌ์˜ ๋ชจ์Šต์„ ๊ฒฐ์ •ํ•œ๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์ƒˆ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ๋กœ ์ถ”๊ฐ€๋˜๋ฉฐ, ์ด ์ถ”๊ฐ€๊ฐ€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน ์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์„ ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰ํ•˜๋“ฏ์ด ๊ธฐ์กด ํ‚ค ๊ฐ’๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž… ์œ„์น˜๋ฅผ ์ฐพ์•„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ์˜ ๋ชจ์Šต์€ ํ‚ค ๊ฐ’๋“ค์ด ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

- 135 -


insert public void insert(Object item){ if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; root = insert(x, root); } private BSTNode insert(Comparable item, BSTNode node){ if(node == null){ BSTNode newNode = new BSTNode(); newNode.info = item; newNode.left = null; newNode.right = null; numOfNodes++; return newNode; } int comp = item.compareTo(node.info); if(comp<0) node.left = insert(item, node.left); else if(comp>0) node.right = insert(item, node.right); else node.info = item; return node; }

delete delete(8)

delete(2)

5

3

9

4

3

12

7

6

5

5

2

9

4

8

7

5

9

4

12

3

6

12

7

6

4

9

3

8

12

7

6

๋‹จ๋ง ๋…ธ๋“œ์˜ ์‚ญ์ œ

์ž์‹์ด ํ•˜๋‚˜์ธ ๋…ธ๋“œ์˜ ์‚ญ์ œ

๋ฐ”๋กœ ์‚ญ์ œ

๋‚จ์€ ์ž์‹๊ณผ ๋…ธ๋“œ๋ฅผ ๊ต์ฒด

8

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋Š” ์ถ”๊ฐ€๋ณด๋‹ค ๋ณต์žกํ•˜๋‹ค. ์ถ”๊ฐ€๋Š” ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€ ์ง€๋งŒ ์‚ญ์ œ๋Š” ๋‹จ๋ง๋…ธ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„๋…ธ๋“œ๋„ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ญ์ œ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰˜์–ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ์งธ, ๋‹จ๋ง๋…ธ๋“œ์˜ ์‚ญ์ œ ๋‘˜์งธ, ์ž์‹์ด ํ•˜๋‚˜ ์žˆ๋Š” ์ค‘๊ฐ„๋…ธ๋“œ์˜ ์‚ญ์ œ ์…‹์งธ, ์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„๋…ธ๋“œ์˜ ์‚ญ์ œ ๋‹จ๋ง๋…ธ๋“œ์˜ ์‚ญ์ œ๋Š” ๊ทธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ์‚ญ์ œ๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ค‘ ์‚ญ์ œํ•  ๋…ธ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๊ฐ’์„ null ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ ๋‹ค. ์ž์‹์ด ํ•˜๋‚˜ ์žˆ๋Š” ์ค‘๊ฐ„๋…ธ๋“œ์˜ ์‚ญ์ œ๋Š” ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ค‘ ์ž์‹ ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ž์‹ ์˜ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

- 136 -


delete โ€“ ๊ณ„์† delete(9) 5

3

9

4

์•Œ๊ณ ๋ฆฌ์ฆ˜

5

3

12

7

4

8

6

์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ์ด๋ฉด ๋…ธ๋“œ ์‚ญ์ œ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํ•œ ๋‹จ๊ณ„ ์œ„๋กœ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํ•œ ๋‹จ๊ณ„ ์œ„๋กœ ์ž์‹์ด ๋‘˜ ๋‹ค ์žˆ์œผ๋ฉด predecessor๋ฅผ ์ฐพ์•„ ์ด๊ฒƒ์„ ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๊ฐ’๊ณผ ๋ฐ”๊ฟˆ predecessor ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ

8

12

7

6

์ž์‹์ด ๋‘˜์ธ ๋…ธ๋“œ์˜ ์‚ญ์ œ

์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ(predecessor)์™€ ๊ต์ฒด - ์ด ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ณด๋‹ค๋Š” ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ณด๋‹ค๋Š” ์ž‘์€ ๋…ธ๋“œ์ด๋‹ค. ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์™€ ๊ต์ฒด ๊ฐ€๋Šฅ

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

delete โ€“ ๊ณ„์† 5

5

3

12

4

3

7

15

9

6

8

5

13

9

4

17

3

7

15

9

6

13

8

- 137 -

9

4

17

7

6

15

8

13

17


public boolean delete(Object item){ if(isEmpty()) throw new TreeUnderflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable x = (Comparable)item; deleteSuccessful = false; root = delete(x, root); if(deleteSuccessful){ numOfNodes--; return true; } else return false; } private BSTNode delete(Comparable item, BSTNode node){ if(node == null) return node; int comp = item.compareTo(node.info); if(comp<0) node.left = delete(item, node.left); else if(comp>0) node.right = delete(item, node.right); else{ deleteSuccessful = true; node = deleteNode(node); } return node; }

private BSTNode deleteNode(BSTNode node){ if(node.left==null&&node.right==null) return null; // ๋‹จ๋ง๋…ธ๋“œ else if(node.right==null) return node.left; // ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ else if(node.left==null) return node.right; // ์™ผ์ชฝ ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ else{ // ์ž์‹์ด ๋ชจ๋‘ ์žˆ๋Š” ๋…ธ๋“œ Object predecessor = getPredecessor(node.left); node.info = predecessor; node.left = delete((Comparable)predecessor, node.left); return node; } } private getPredecessor(BSTNode node){ โ€ฆ } 10

5

12

8

3

7

- 138 -

8

5

3

12

7


Traverse ์„ธ ๊ฐ€์ง€ ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค ์‚ฌ์šฉ ์ง€์ •๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฏธ๋ฆฌ ์ˆœํšŒํ•˜์—ฌ ์ˆœํšŒํ•œ ์ˆœ์„œ๋กœ ํ์— ๋…ธ๋“œ์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•จ

protected class TreeIterator implements Iterator{ LinkedQueue traverseQueue; public TreeIterator(int type){ traverseQueue = new LinkedQueue(); switch(type){ case INORDER: inOrder(root); return; case PREORDER: preOrder(root); return; case POSTORDER: postOrder(root); return; } // switch } public boolean hasNext() { return !traverseQueue.isEmpty(); } public Object next(){ return traverseQueue.deq(); } public void remove(){ return new UnsupportedOperationException(โ€œโ€ฆโ€); } private void preOrder(BSTNode node){ โ€ฆ } private void inOrder(BSTNode node){ if(node!=null){ if(node.left!=null) inOrder(node.left); traverseQueue.enq(node.info); if(node.right!=null) inOrder(node.right); } } private void postOrder(BSTNode node){ โ€ฆ } }

์ˆœํšŒ๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ฐ˜๋ณต์ž ํด ๋ž˜์Šค๋Š” ์ด๋“ค ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. ์ˆœํšŒ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € ์ง€์ •๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฏธ๋ฆฌ ์ˆœํšŒ๋ฅผ ํ•œ๋‹ค. ์ด ๋•Œ ์ˆœํšŒํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ์˜ ์š”์†Œ ๋“ค์„ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ˆœํšŒ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด ํ์— ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ํ๋ฅผ ํ†ตํ•ด ์ˆœํšŒ๋ฅผ ํ•œ๋‹ค.

๋น„๊ต BST*

๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ

O(1)

O(N)

O(1)

search

O(log2N)

O(log2N)

O(N)

retrieve Find process Total

O(log2N) O(1) O(log2N)

O(log2N) O(1) O(log2N)

O(N) O(1) O(N)

insert Find process Total

O(log2N) O(1) O(log2N)

O(log2N) O(N) O(N)

O(N) O(1) O(N)

delete Find process Total

O(log2N) O(log2N) O(log2N)

O(log2N) O(N) O(N)

O(N) O(1) O(N)

constructor

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

*. ๊ท ํ˜• ํŠธ๋ฆฌ์ผ ๊ฒฝ์šฐ์—๋งŒ O(log2N)

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๊ธฐ์กด ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ๋‚˜ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์—ฐ ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ง€์ˆ˜์‹œ๊ฐ„์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ๊ท  ํ˜• ํŠธ๋ฆฌ์ผ ๊ฒฝ์šฐ์—๋งŒ ์ง€์ˆ˜์‹œ๊ฐ„์ด๊ณ , ์ตœ์•…์— ๊ฒฝ์šฐ์—๋Š” ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ท ํ˜• ํŠธ๋ฆฌ๋ž€ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์˜ ์ฐจ๊ฐ€ ์ตœ๋Œ€ ํ•˜๋‚˜์ธ ํŠธ ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค.

- 139 -


ํŠธ๋ฆฌ์˜ ๊ท ํ˜• ๋งž์ถ”๊ธฐ ๊ธฐ๋ณธ์ ์ธ ์ƒ๊ฐ ๋‹จ๊ณ„ 1. ํŠธ๋ฆฌ ์ •๋ณด๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ ๋‹ค์Œ์— ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•: inorder, preorder, postorder ๋‹จ๊ณ„ 2. ์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑ ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ? ํŠธ๋ฆฌ์˜ ํ˜„์žฌ ๋†’์ด์™€ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ˆ˜๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ์˜ ํŠธ๋ฆฌ์˜ ๋†’์ด์˜ ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ๊ธฐ์ค€์€ ์‘์šฉ์— ๋”ฐ๋ผ ๊ฒฐ์ •

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ง€์ˆ˜ ์‹œ๊ฐ„์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์ด ์œ ์ง€ ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ทธ๋ ‡๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ชจ์Šต์€ ๋…ธ๋“œ๋“ค์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ์— ์˜ํ•ด ๊ฒฐ์ • ๋˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผ๋˜๋ฉด ๋งค์šฐ ํŽธํ–ฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ ํ•ด์„œ๋Š” ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ์ข…์ข… ๋งž์ถ”์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ ๋ฏ€๋กœ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜๋Š” ์—†๋‹ค. ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜• ํŠธ๋ฆฌ๊ฐ€ ๋˜๋„๋ก ์‚ฝ์ž… ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋นˆ ํŠธ๋ฆฌ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋ฆฌ์˜ ๊ท ํ˜• ๋งž์ถ”๊ธฐ โ€“ ๊ณ„์† 3

10

5

12

8

3

7

10

5

5

7

12

8

3

8

3

7

5

8

12

7

10

10

inorder: 3 5 7 8 10 12 12

preorder: 10 5 3 8 7 12 postorder: 3 7 8 5 12 10

inorder

preorder

postorder

ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ ๋“  ๋…ธ๋“œ๋ฅผ ์ž„์‹œ๋กœ ํ๋‚˜ ๋ฐฐ์—ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ์— ์ €์žฅ์„ ํ•ด์•ผ ํ•œ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ์„ธ ๊ฐ€์ง€ ์ˆœํšŒ๋ฐฉ ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ํ์— ์ €์žฅํ•œ ํ›„์— ๊ทธ ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์‹œ ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜ ๋ฉด ์„ธ ๊ฐ€์ง€ ์ˆœํšŒ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๊ท ํ˜• ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค.

- 140 -


ํŠธ๋ฆฌ์˜ ๊ท ํ˜• ๋งž์ถ”๊ธฐ โ€“ ๊ณ„์† 7

8 10 5 5

3 8

3

12

5

10

12

7

7

10

8

3

12

๋ฐฉ๋ฒ•: inorder์—์„œ ์ค‘๊ฐ„ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‚ฝ์ž… 3 3

5 5

10 12

low=0, high=6, mid=3

7

8

7

low=0, high=2, mid=1

inorder: 3 5 7 8 10 12 3 7 10 12

low=4, high=5 ร† high, low์ˆœ์œผ๋กœ ์‚ฝ์ž…

ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜• ํŠธ๋ฆฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋ฆฌ์— ์žˆ๋Š” ์ „์ฒด ๋…ธ๋“œ๋“ค ์ค‘์— ์ค‘๊ฐ„ ๊ฐ’์ด ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ํŠธ ๋ฆฌ์˜ ๋ฃจํŠธ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์ค‘๊ฐ„ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค ์ค‘์—์„œ ์ค‘๊ฐ„ ๊ฐ’๊ณผ ๊ทธ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’๋“ค ์ค‘์—์„œ ์ค‘๊ฐ„ ๊ฐ’์ด ๊ทธ ๋‹ค์Œ ๋ ˆ๋ฒจ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ์˜ ๊ท ํ˜• ๋งž์ถ”๊ธฐ โ€“ ๊ณ„์† public void BalanceTree(){ inorder๋กœ Object ๋ฐฐ์—ด nodes์— BST์˜ ๊ฐ ๋…ธ๋“œ ๊ฐ’์„ ์ฐจ๋ก€๋กœ ์‚ฝ์ž… BalanceTree(0,numOfNodes,nodes); } private void BalanceTree(int low, int high, Object[] nodes){ low==high์ด๋ฉด nodes[low]๋ฅผ ์‚ฝ์ž… (low+1)==high์ด๋ฉด nodes[high]์™€ nodes[low]๋ฅผ ๋ชจ๋‘ ์‚ฝ์ž… ์œ„ ๋‘ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด mid = (low+high)/2 nodes[mid]๋ฅผ ์‚ฝ์ž… BalanceTree(low, mid-1, nodes); BalanceTree(mid+1, high, nodes); }

ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ค‘์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ˆœ ํšŒํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ž„์‹œ ๋ฐฐ์—ด์— 0๋ฒˆ์งธ ์ƒ‰์ธ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ํŠธ๋ฆฌ๋ฅผ ๋นˆ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ  ์ž„์‹œ ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค. ์ด ๋•Œ ์ค‘๊ฐ„๊ฐ’์„ ๊ฐ€์žฅ ๋จผ์ € ์‚ฝ ์ž…ํ•˜๊ณ  ์ค‘๊ฐ„๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ์ด๋“ฑ๋ถ„ํ•˜์—ฌ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ 1 ๋˜๋Š” 2๊ฐ€ ์•„๋‹Œ ์ด์ƒ ๋‹ค์‹œ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๊ณ , ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2์ธ ๊ฒฝ ์šฐ์—๋Š” ํฐ ๊ฐ’๋ถ€ํ„ฐ ๋จผ์ € ์‚ฝ์ž…ํ•œ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ฆฌ๋ฅผ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.

- 141 -


์ œ11์žฅ ํž™, AVL ํŠธ๋ฆฌ ์ด ์žฅ์—์„œ๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์ธ ํž™(heap)๊ณผ AVL ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

11.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์œ ์šฉํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ ์šฐ์„ ์ˆœ์œ„ ํ: ํž™(heap) AVL ํŠธ๋ฆฌ: ๊ท ํ˜• ํŠธ๋ฆฌ

11.2. ์šฐ์„ ์ˆœ์œ„ ํ

์šฐ์„ ์ˆœ์œ„ ํ ์ผ๋ฐ˜์ ์œผ๋กœ ํ๋Š” FIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ์–ด๋–ค ์šฐ์„ ์ˆœ์œ„์— ์˜ํ•ด ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ํ๋ฅผ ๋งํ•œ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” ์‘์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, ๋“ค์–ด์˜ค๋Š” ์ˆœ์„œ๊ฐ€ ๋น ๋ฅผ ์ˆ˜๋ก ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ์—๋Š” FIFO ํ๋„ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ

์ •๋ ฌ ๋ฆฌ์ŠคํŠธ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

enq

O(1)

O(N)

O(log2N)*

deq

O(N)

O(1)

O(log2N)

๋ชจ๋‘ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋น„์šฉ์ด๋‹ค. *. ํ‰๊ท  ๋น„์šฉ์ด๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ํ˜„์žฌ ๋ชจ์Šต์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

6์žฅ์—์„œ ์‚ดํŽด๋ณธ ๋ฐ”์™€ ๊ฐ™์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ๋Š” FIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ ํ์— ์‚ฝ์ž…๋œ ์ˆœ์„œ ์— ์˜ํ•ด ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜์ง€ ์•Š๊ณ , ์–ด๋–ค ์šฐ์„ ์ˆœ์œ„์— ์˜ํ•ด ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ํ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ(priority queue)๋ผ ํ•œ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์šฐ์„ ์ˆœ์œ„๋Š” ์‘์šฉ์— ๋”ฐ ๋ผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, 6์žฅ์—์„œ ๋ฐฐ์šด ์ผ๋ฐ˜ ํ๋„ ํ์— ์‚ฝ์ž…๋œ ์ˆœ์„œ์— ์˜ํ•ด ์šฐ์„ ์ˆœ์œ„

- 143 -


๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์˜ ํ•œ ์ข…๋ฅ˜๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ ๋น„ ์šฉ์„ ๋น„๊ตํ•˜์—ฌ ๋ณด์ž. ์šฐ์„  ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ์—๋Š” enqueue๋Š” O(1)์ด์ง€๋งŒ

dequeue๋Š” ํ˜„์žฌ ํ์— ์ €์žฅ๋˜๋Š” ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•˜์—ฌ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•˜๋ฏ€ ๋กœ O(๎€ )์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ์—๋Š” enqueueํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ •๋ ฌ ์ด ๋˜๋„๋ก ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(๎€ )์ด์ง€๋งŒ dequeue์˜ ๋น„์šฉ์€ O(1)์ด๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ด ์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด enqueue์™€ dequeue ๋ชจ๋‘ ํ‰๊ท ์ ์œผ๋กœ O(๎€ฅ๎€จ๎€  ๎€ต๎€ )์ด๋‹ค. ํ•˜์ง€ ๋งŒ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ์— ์˜ํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ์Šต์ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ์„  ํ˜• ๋ฆฌ์ŠคํŠธ์™€ ์ฐจ์ด๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์ ˆ์—์„œ ๋ฐฐ์šธ ํž™์€ ์ด๋Ÿฐ ๋‹จ์ ์ด ์—†๋Š” ์ด์ง„ ํŠธ๋ฆฌ ํ˜• ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

11.3. ํž™

ํž™ ํž™(heap)์€ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ, ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ํŠน์„ฑ์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ์–‘ ํŠน์„ฑ: ํŠน์„ฑ ํ•ญ์ƒ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ์ˆœ์„œ ํŠน์„ฑ: ํŠน์„ฑ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์€ ๊ทธ๊ฒƒ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. J

J heap

H

I

D

B

G

C

E

F

I

A

H

F

B

G

C

E

A

D

ํž™(heap)์€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ํŠน์„ฑ์„ ๋งŒ ์กฑํ•˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค. ์ฒซ์งธ, ํ•ญ์ƒ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๋‘˜์งธ, ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์€ ๊ทธ๊ฒƒ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํŠน์„ฑ์„ ๋ชจ์–‘ ํŠน์„ฑ์ด๋ผ ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ํŠน์„ฑ์„ ์ˆœ์„œ ํŠน์„ฑ์ด๋ผ ํ•œ๋‹ค. ์ˆœ์„œ ํŠน์„ฑ ๋•Œ๋ฌธ ์— ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉฐ, ๋ชจ์–‘ ํŠน์„ฑ ๋•Œ๋ฌธ์— ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ํ•ญ์ƒ ์ตœ ์†Œ ๋†’์ด๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ ํž™์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ํŠธ๋ฆฌ์˜ ๋ชจ์Šต ์€ ์ผ์ •ํ•˜๋‹ค. ๋‹ค๋งŒ, ๋…ธ๋“œ๋“ค์˜ ๊ฐ’์€ ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

- 144 -


ํž™: dequeue ํž™์—์„œ dequeue๋Š” ํ•ญ์ƒ ๋ฃจํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค. ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํž™์€ ํ•ญ์ƒ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜๋„๋ก ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ํŠธ๋ฆฌ๊ฐ€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์œ ์ง€๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋‹จ๋ง ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. J

D

I

H

F

B

G

C

I

E

A

H

F

D

B

G

E

A

C

ํž™: dequeue โ€“ ๊ณ„์† ์ด ๊ฒฝ์šฐ ๋ชจ์–‘ ํŠน์„ฑ์€ ๋งŒ์กฑ๋˜์ง€๋งŒ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ˆœ์„œ ํŠน์„ฑ์ด ๋งŒ์กฑ๋˜๋„๋ก ์ž์‹ ๋…ธ๋“œ ๊ฐ’๊ณผ ๊ต์ฒดํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Ÿฐ ๊ต์ฒด๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋œ๋‹ค. ์ด๋Ÿฐ ์žฌ์กฐ์ •์„ reheapdown์ด๋ผ ํ•œ๋‹ค. reheapdown D

I

I

F

B

H

G

C

E

G

A

F

B

H

D

E

A

C

ํž™์€ ํŠน์„ฑ์ƒ ๋ฃจํŠธ ๋…ธ๋“œ์— ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ dequeue๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค. ํž™์€ ๋ชจ์–‘ ํŠน์„ฑ๊ณผ ์ˆœ์„œ ํŠน์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํ•˜์ง€ ๋Š” ์•Š๋‹ค. ์šฐ์„  ๋ชจ์–‘ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ ์ค‘์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค. ์ด๋ ‡๊ฒŒ ์˜ฎ๊ธฐ๋ฉด ๋ชจ์–‘ ํŠน์„ฑ์€ ์œ ์ง€๋˜์ง€๋งŒ ์ˆœ ์„œ ํŠน์„ฑ์€ ๋งŒ์กฑ๋˜์ง€ ๋ชปํ•œ๋‹ค. ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ž์‹ ๋…ธ๋“œ๋“ค๊ณผ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ž ์‹ ๋…ธ๋“œ์™€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค. ์ด๋Ÿฐ ๋ฐ”๊ฟˆ์€ ์ˆœ์„œ ํŠน์„ฑ์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ๊ณผ์ •์„ reheapdown์ด๋ผ ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์˜ฎ ๊ธฐ๋Š” ๋น„์šฉ์ด ์ƒ์ˆ˜ ๋น„์šฉ์ด๋ฉด ํž™์˜ ๋†’์ด๋Š” ํ•ญ์ƒ ๎€ฅ๎€จ๎€  ๎€ต๎€ ์ด๋ฏ€๋กœ ํž™์—์„œ dequeue์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๋Š” ๋กœ๊ทธ ์‹œ๊ฐ„์ด๋‹ค.

- 145 -


ํž™: enqueue ํž™์—์„œ enqueue๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ์–‘ ํŠน์„ฑ์€ ๋งŒ์กฑ๋˜๋‚˜ ์‚ฝ์ž…๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ ์ˆœ์„œ ํŠน์„ฑ์€ ๋งŒ์กฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. P

P

L

N

E

B

F

C

K

L

G

A

N

E

B

F

C

A

K

G

M

ํž™: enqueue โ€“ ๊ณ„์† dequeue์™€ ๋น„์Šทํ•˜๊ฒŒ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜๋„๋ก ๋ถ€๋ชจ์™€ ๊ฐ’์„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ต์ฒด๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋Ÿฐ ์žฌ์กฐ์ •์„ reheapup์ด๋ผ ํ•œ๋‹ค. reheapup

P

P

L

N

E

B

F

C

A

K

M

M

G

N

E

B

L

C

A

K

G

F

ํž™์—์„œ enqueue๋Š” ๋ชจ์–‘ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ๋กœ ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ dequeue์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ชจ์–‘ ํŠน์„ฑ์„ ๋งŒ์กฑํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ˆœ์„œ ํŠน์„ฑ์€ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด ์„œ๋กœ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค. ์ด๋Ÿฐ ๋ฐ”๊ฟˆ์€ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ๊ณผ์ •์„ reheapup์ด๋ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ๋กœ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ์ด ์ƒ์ˆ˜ ๋น„์šฉ์ด๋ฉด enqueue์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ์—ญ์‹œ ๋กœ๊ทธ์‹œ๊ฐ„์ด๋‹ค.

- 146 -


ํž™์˜ ๊ตฌํ˜„ ํž™์„ ๊ตฌํ˜„ํ•  ๋•Œ ํŠธ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋…ธ๋“œ์—์„œ ๊ทธ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์—ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด์— ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ํž™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ํ•ญ์ƒ ์œ ์ง€ํ•˜๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„์—์„œ๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๋ช…๋ฐฑํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ ์— ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์ƒ‰์ธ์„ ์ด์šฉํ•˜์—ฌ ๋ถ€๋ชจ์™€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์ƒ‰์ธ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

enqueue์™€ dequeue์˜ ์„ค๋ช…์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๋“ค ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋กœ๊ทธ์‹œ๊ฐ„์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ๋กœ ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ์ด ๋กœ๊ทธ์‹œ๊ฐ„์„ ๋„˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๋˜ํ•œ reheapup์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…ธ๋“œ์—์„œ ๊ทธ๊ฒƒ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋…ธ๋“œ์—์„œ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ 10์žฅ์—์„œ ์‚ฌ์šฉ๋œ ์—ฐ๊ฒฐ๊ตฌ์กฐ ๋ฐฉ์‹์˜ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ํž™์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ๋ฌผ ๋ก  ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด์— ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์ด ์ปค์ง€๋ฉฐ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํž™์€ ํ•ญ์ƒ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

0

P

L

E

B

N

F

C

K

G

P

1

L

2

N

3

E

4

F

5

K

6

G

7

B

8

C

๋ถ€๋ชจ์˜ ์œ„์น˜: (index-1)/2 ์™ผ์ชฝ ์ž์‹์˜ ์œ„์น˜: (index*2)+1 ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์œ„์น˜: (index*2)+2

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ‘œํ˜„์€ ํ•œ ๋…ธ๋“œ์—์„œ ์ž์‹ ๋…ธ๋“œ๋“ค์€ ๋ฌผ๋ก  ๋ถ€๋ชจ ๋…ธ๋“œ๋„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ‘œํ˜„์€ ์ค‘๊ฐ„์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ์ด ์—†๋‹ค. ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง ๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ์ƒ‰์ธ์ด 0์ธ ํ•ญ์— ์œ„์น˜ํ•˜๋ฉฐ, ๊ทธ๊ฒƒ์˜ ์™ผ์ชฝ ์ž์‹์€ ์ƒ‰์ธ์ด 1์ธ ํ•ญ์— ์œ„์น˜ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ์ƒ‰์ธ์ด 2์ธ ํ•ญ์— ์œ„์น˜ํ•œ๋‹ค. ์ฆ‰, ํ•œ ๋…ธ๋“œ๊ฐ€ ์ƒ‰์ธ์ด i์ธ ํ•ญ์— ์œ„์น˜ํ•˜๋ฉด ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋Š” ์ƒ‰์ธ์ด (i-1)/2์ธ ํ•ญ์— ์œ„์น˜ํ•˜๋ฉฐ, ๊ทธ๊ฒƒ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ์ƒ‰์ธ์ด (i*2)+1์ธ ํ•ญ์—, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ์ƒ‰์ธ์ด (i*2)+2์ธ ๋…ธ๋“œ์— ์œ„์น˜ํ•œ๋‹ค. ์ด๋ ‡ ๊ฒŒ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด ํ•œ ๋…ธ๋“œ์—์„œ ์ž์‹ ๋…ธ๋“œ๋Š” ๋ฌผ๋ก  ๋ถ€๋ชจ ๋…ธ๋“œ๊นŒ์ง€ ์‰ฝ

- 147 -


๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”์šฑ์ด ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋ฉด ์ค‘๊ฐ„์— ๋นˆ ํ•ญ๋“ค์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ํŠธ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ํŠธ๋ฆฌ์— ์žˆ ๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํž™์˜ ๊ตฌํ˜„: PriorityQueue, Heap

public interface PriorityQueue{ boolean isEmpty(); boolean isFull(); void enq(Object item); Object deq(); }

public class Heap implements PriorityQueue{ private static final int MAX_HEAP_SIZE = 50; private Object[] elements; private int lastIndex = -1; public Heap(){ setup(MAX_HEAP_SIZE); } public Heap(int capacity){ if(capacity>0) setup(capacity); else setup(MAX_HEAP_SIZE); } private void setup(int capacity){ elements = new Object[capacity]; } public boolean isEmpty(){ return (lastIndex == -1); } public boolean isFull(){ return (lastIndex == elements.length-1); } โ€ฆ }

Enqueue public void enq(Object item) throws QueueOverflowException{ if(isFull()) throw new QueueOverflowException(โ€œโ€ฆโ€); if(item==null) throw new NullPointerException(โ€œโ€ฆโ€); Comparable o = (Comparable)item; lastIndex++; reheapUp(o); } private void reheapUp(Comparable item){ int hole = lastIndex; int parent = (hole-1)/2; while((hole>0) && (item.compareTo(elements[parent])>0)){ elements[hole] = elements[parent]; hole = parent; parent = (hole-1)/2; } L elements[hole] = item; }

P

N

E

B

F

C

A

K

hole

G

M

item

enqueue๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์šฐ์„  ๋ชจ์–‘ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ๋˜๋„๋ก ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ ํ˜„์—์„œ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ํŠธ๋ฆฌ์˜ ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌํ˜„์—์„œ๋Š” lastIndex ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ์ด ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค. ์šฐ์„  ์ด ๊ฐ’์„ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ์ด ์œ„์น˜์— ๋นˆ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— reheapup ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆœ์„œ ํŠน ์„ฑ์ด ๋งŒ์กฑ๋˜๋„๋ก ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜์˜€์„ ๋•Œ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ถ”๊ฐ€ ํ•  ๊ฐ’์ด ์ž‘์œผ๋ฉด ๋นˆ ๋…ธ๋“œ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ enqueue๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด ๋‹ค ์ถ”๊ฐ€ํ•  ๊ฐ’์ด ํฌ๋ฉด ๋นˆ ๋…ธ๋“œ์— ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์˜ฎ๊ธฐ๊ณ  ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๋นˆ ๋…ธ๋“œ๋กœ ๋งŒ๋“ ๋‹ค. ์ด ๊ณผ์ •์„ ์ˆœ์„œ ํŠน์„ฑ์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

- 148 -


Dequeue public Object deq() throws QueueUnderflowException{ if(isEmpty()) throw new QueueUnderflowException(โ€œโ€ฆโ€); Comparable toMove = (Comparable)elements[lastIndex]; Object tmp = elements[0]; lastIndex--; reheapDown(toMove); return tmp; } private void reheapDown(Comparable item){ int hole = 0; int nextHole; nextHole = findNextHole(hole, item); while(nextHole != hole){ elements[hole] = elements[nextHole]; hole = nextHole; nextHole = findNextHole(hole, item); } elements[hole] = item; }

Dequeue

hole nextHole M

N

E

B

L

C

A

K

G

F

private int findNextHole(int hole, Comparable item){ int left = hole*2+1; int right = hole*2+2; Comparable leftChild = null; // hole์ด ์ž์‹์ด ์—†๋Š” ๊ฒฝ์šฐ if(left>lastIndex){ return hole; } // hole์ด ์™ผ์ชฝ ์ž์‹๋ฐ–์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ else if(left==lastIndex){ if(item.compareTo(elements[left])>0) return hole; else return left; } // hole์ด ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ else{ leftChild = (Comparable)elements[left]; if(leftChild.compareTo(elements[right])>0){ if(item.compareTo(leftChild)>0) return hole; else return left; } else{ if(item.compareTo(elements[right])>0) return hole; else return right; } } }

dequeue๋Š” enqueue๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๋‹ค. ์šฐ์„  lastIndex ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋‹จ๋ง๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธฐ๊ณ  ์ด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์ด ์‚ญ์ œ๋Š” lastIndex ๊ฐ’์„ ํ•˜๋‚˜ ๊ฐ์†Œํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ˆœ์„œ ํŠน์„ฑ์ด ๋งŒ์กฑ๋˜๋„๋ก reheapdown์„ ํ•ด์•ผ ํ•œ๋‹ค. reheapup์€ ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ตœ๋Œ€ ๋ฃจํŠธ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋ฉด ๋˜์ง€๋งŒ reheapdown์€ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ์ž์‹๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์ด ์ค‘์— ๋ณด๋‹ค ํฐ ๊ฐ’๊ณผ ๊ต์ฒด๋˜์–ด์•ผ ํ•œ๋‹ค. ์–ด๋–ค ์ž์‹๊ณผ ๊ต์ฒดํ• ์ง€๋Š” findNextHole ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •ํ•œ๋‹ค.

- 149 -


ํž™ VS. ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

ํž™

์ •๋ ฌ๋ฆฌ์ŠคํŠธ (์—ฐ๊ฒฐ๊ตฌ์กฐ)

๊ท ํ˜•

ํŽธํ–ฅ

enq

O(log2N)

O(N)

O(log2N)

O(N)

deq

O(log2N)

O(1)

O(log2N)

O(N)

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜•ํŠธ๋ฆฌ์ผ ๊ฒฝ์šฐ์—๋Š” ํž™๊ณผ ์„ฑ๋Šฅ์ด ๊ฐ™๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์‚ฝ์ž…๋˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ํŽธํ–ฅ ํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํž™์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ํ•ญ์ƒ ๋น„์šฉ์ด ์ผ์ •ํ•˜๋‹ค.

ํž™์„ ์ด์šฉํ•œ ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์š”์†Œ๋“ค์ด ํ์— ์‚ฝ์ž…๋œ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ enqueue์™€ dequeue ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋กœ๊ทธ ์‹œ๊ฐ„์ด๋‹ค.

11.4. AVL ํŠธ๋ฆฌ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๋“ค์ด ์‚ฝ์ž…๋œ ์ˆœ์„œ์— ์˜ํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ์Šต์ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ๋งค์šฐ ํ•œ์ชฝ ๋ฐฉํ–ฅ ์œผ๋กœ ํŽธํ–ฅ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์ด๋‹ค. ์ด ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ ํ•ด ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋งž์ถœ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ๋‹ค. AVL ํŠธ ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋‹จ์ ์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค.

AVL ํŠธ๋ฆฌ(๊ท ํ˜•ํŠธ๋ฆฌ) AVL(AdelsonAVL(Adelson-Velskii and Landis) ํŠธ๋ฆฌ: ํŠธ๋ฆฌ ๊ฐ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์˜ ์ฐจ์ด๊ฐ€ 1์ดํ•˜์ธ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๊ท ํ˜•์„ ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ํ•ญ์ƒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๋ณธ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ฌธ์ œ์ ์„ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ•œ ๋…ธ๋“œ๊ฐ€ AVL ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฐ€์žฅ ๊ธด ์™ผ์ชฝ ๊ฒฝ๋กœ์˜ ๊ธธ์ด์™€ ๊ฐ€์žฅ ๊ธด ์˜ค๋ฅธ์ชฝ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ๋น„๊ต ๋‘ ๊ฒฝ๋กœ์˜ ์ฐจ์ด๋ฅผ ๊ท ํ˜• ์ธ์ˆ˜(balance factor)๋ผ ํ•œ๋‹ค. ์ธ์ˆ˜ 2

60

45

1

63

60

45

0 41

55

61

41 non AVL Tree

AVL Tree

AVL ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์˜ ์ฐจ์ด๊ฐ€ 1์ดํ•˜์ธ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋งํ•˜๋ฉฐ, ๋Ÿฌ์‹œ์•„ ์ˆ˜ํ•™์ž Adelson-Velskii์™€ Landis์— ์˜ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ•œ ๋…ธ๋“œ๊ฐ€ AVL ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ๋‹จ๋ง๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ์˜ ๊ธธ์ด์™€ ๊ทธ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ๋‹จ๋ง๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€์žฅ ๊ธด

- 150 -


๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋‘ ๊ฒฝ๋กœ์˜ ์ฐจ์ด๋ฅผ ๊ท ํ˜•์ธ์ˆ˜(balance factor)๋ผ ํ•˜๋ฉฐ, ์ด ๊ฐ’ ์ด -1์—์„œ 1 ์‚ฌ์ด์˜ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ AVL ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์ตœ์†Œ ๋†’ ์ด์™€ ํ•ญ์ƒ ์ผ์น˜ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ตœ์†Œ ๋†’์ด์™€ ๊ฑฐ์˜ ๊ทผ์ ‘ํ•œ ๋†’์ด๋กœ ์œ ์ง€๋œ๋‹ค.

AVL ํŠธ๋ฆฌ: ์‚ฝ์ž… ์‚ฝ์ž…์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฝ์ž…์ด AVL ํŠธ๋ฆฌ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•ต์‹ฌ. ๋ฃจํŠธ์—์„œ ์‚ฝ์ž…๋œ ์œ„์น˜๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค๋งŒ ๊ท ํ˜• ์ธ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋…ธ๋“œ๋“ค์˜ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค. ์žฌ๊ท ํ˜•์€ ์‚ฝ์ž…๋œ ์œ„์น˜๋ถ€ํ„ฐ ๋ฃจํŠธ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ท ํ˜• ์ธ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ๊ฐฑ์‹ ํ•˜๋Š” ๋„์ค‘์— AVL ์„ฑ์งˆ์„ ์œ„๋ฐฐํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ด ๋…ธ๋“œ์˜ ๋ถ€๋ถ„ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•œ๋‹ค. ํ•œ๋ฒˆ ์žฌ์กฐ์ •์„ ํ•˜๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ํŠธ๋ฆฌ๋Š” ๋‹ค์‹œ AVL ์„ฑ์งˆ์„ ๋งŒ์กฑํ•œ๋‹ค. ์ด๊ฒƒ์€ ์‚ฝ์ž…๋˜๊ธฐ ์ „์— ํŠธ๋ฆฌ๋Š” AVL ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์‚ฝ์ž…๋œ ํ›„์— ๋…ธ๋“œ๋“ค์˜ ๊ท ํ˜• ์ธ์ˆ˜ ๊ฐ’์€ ์ตœ๋Œ€ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

- 151 -


AVL ํŠธ๋ฆฌ: ์‚ฝ์ž… โ€“ ๊ณ„์† ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ x๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฝ์ž…๋œ ๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. LL: x์˜ ์™ผ์ชฝ ์ž์‹์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ RR: x์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ LR: x์˜ ์™ผ์ชฝ ์ž์‹์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ RL: x์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์— ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ 2

2

-2 A

A -1

1 B C

RR

A 1

-1 B

B

LL

-2 A

C

B C

C RL

LR

ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•ด์•ผ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฝ์ž…๋œ ๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ํฌ๊ฒŒ LL, RR, LR, RL ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

LL, RR ํšŒ์ „ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์€ ๋…ธ๋“œ๋“ค์„ ํšŒ์ „(rotate)ํ•˜์—ฌ ๋งž์ถ˜๋‹ค. ํšŒ์ „ LL๊ณผ RR์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ผ ํšŒ์ „์œผ๋กœ ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜ ์žˆ์ง€๋งŒ LR๊ณผ RL์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ค‘ ํšŒ์ „์„ ํ•ด์•ผ ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค. 2

0

A

A

1

-1

A

T3 T1

T2

T1

B 0

0 B

0

-2

B

B

A

T1 T2

T3

LL Rotate

T2

T3

T1

T2

T3

RR Rotate

ํŠธ๋ฆฌ์˜ ๊ตฐํ˜•์€ ๋…ธ๋“œ๋“ค์„ ํšŒ์ „ํ•˜์—ฌ ๋งž์ถ˜๋‹ค. ์‚ฝ์ž…๋œ ๋…ธ๋“œ์˜ ์œ„์น˜์™€ ๊ทธ๊ฒƒ์˜ ์กฐ์ƒ ๋…ธ๋“œ ์ค‘์— ์ฒ˜ ์Œ์œผ๋กœ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2 ๋˜๋Š” 2๊ฐ€ ๋œ ๋…ธ๋“œ์˜ ์œ„์น˜์— ๋”ฐ๋ผ LL, RR, LR, RL ํšŒ์ „์„ ํ•œ๋‹ค. ์‚ฝ์ž… ๋œ ๋…ธ๋“œ์˜ ์กฐ์ƒ ๋…ธ๋“œ๋“ค ์ค‘์— ์‚ฝ์ž…์— ์˜ํ•ด ์ฒ˜์Œ์œผ๋กœ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2 ๋˜๋Š” 2๊ฐ€ ๋œ ๋…ธ๋“œ๋ฅผ ํšŒ์ „ ์˜ ๊ธฐ์ค€ ๋…ธ๋“œ๋ผ ํ•œ๋‹ค. ์ด ๋•Œ LL๊ณผ RR์€ ๋‹จ์ผ ํšŒ์ „์œผ๋กœ ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜ ์žˆ์ง€๋งŒ LR๊ณผ RL์€ ๋‘ ๋ฒˆ ํšŒ์ „์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด์ค‘ ํšŒ์ „์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•œ๋‹ค. LL๊ณผ RR์€ ๊ธฐ์ค€ ๋…ธ๋“œ์˜ ์ž์‹ ์ค‘ ์ƒˆ๋กœ ์‚ฝ์ž…๋œ ๋…ธ๋“œ์˜ ์กฐ์ƒ ๋…ธ๋“œ๊ฐ€ ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€ ๋…ธ๋“œ ์ž๋ฆฌ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ  ๊ธฐ์ค€ ๋…ธ๋“œ๋Š” ๋ฐ˜ ๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚ด๋ฆฐ๋‹ค.

- 152 -


LR ํšŒ์ „ 2

2

A

2 A

A

-1

-1 B

-1 B

1

B -1 C

C

C T4 T1

T2

T3

0

0

0

C

C 0

0 B

T4 T1

T3

T2

C

0

A

1

-1 B

T1

A

T3

T2

0 B

T4

A

T2

T1

T3

T4

LR ํšŒ์ „์€ ์ฒ˜์Œ์œผ๋กœ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 2๊ฐ€ ๋œ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ทธ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‚ฝ์ž…๋œ ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ ๋กœ์— ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๊ฐœ์˜ ํ›„์† ๋…ธ๋“œ๋“ค์ด ํšŒ์ „์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋œ๋‹ค. ๊ธฐ์ค€ ๋…ธ๋“œ๋ฅผ A ๋…ธ๋“œ ๋ผ ํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ํ›„์† ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ B์™€ C ๋…ธ๋“œ๋ผ ํ•˜๋ฉด, ์ด ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•˜์˜€ ์„ ๋•Œ ๋ฃจํŠธ๋Š” C๊ฐ€ ๋˜๊ณ , C์˜ ์™ผ์ชฝ ์ž์‹์€ B, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ A ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ C ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋Š” B ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๊ฐ€ ๋˜๊ณ , C์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ A์˜ ์™ผ์ชฝ ๋ถ€ ๋ถ„ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

RL ํšŒ์ „ -2

-2

-2

A

A

A

1 1

1

B

B

-1

B 1

C

C

C T1

T1 T2

T4 T3

T2 0

0

0

C

C 0

0 A

T4

T3

C

1

B

0 A

T1

0

B

T2

T3

-1 A

T4

T1

B

T2

T3

T4

RL ํšŒ์ „์€ LR ํšŒ์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒ˜์Œ์œผ๋กœ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2๊ฐ€ ๋œ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ทธ ๋…ธ๋“œ๋ถ€ ํ„ฐ ์‚ฝ์ž…๋œ ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๊ฐœ์˜ ํ›„์† ๋…ธ๋“œ๋“ค์ด ํšŒ์ „์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋œ ๋‹ค. ๊ธฐ์ค€ ๋…ธ๋“œ๋ฅผ A ๋…ธ๋“œ๋ผ ํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ํ›„์† ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ B์™€ C ๋…ธ๋“œ๋ผ ํ•˜๋ฉด, ์ด ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•˜์˜€์„ ๋•Œ ์ด ํšŒ์ „ ์—ญ์‹œ C๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๊ณ , C์˜ ์™ผ์ชฝ ์ž์‹์€ A, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ B ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ C ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ๋Š” A ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๊ฐ€ ๋˜ ๊ณ , C์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ B์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

- 153 -


AVL ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„์— ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ท ํ˜•์ธ์ˆ˜ ๊ฐ’ ์„ ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ๋…ธ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ถ€๋ชจ๋…ธ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์ฆ๊ฐ€๋˜๋ฏ€๋กœ ๊ฐ์ข… ์—ฐ์‚ฐ๋“ค์ด ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์ด๊ฒƒ์„ ๊ทน๋ณตํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์‚ฝ์ž…์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ ๋ง๋…ธ๋“œ๋ฅผ ์ฐพ์•„๊ฐˆ ๋•Œ ์Šคํƒ์— ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ pushํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํƒ์˜ top์—๋Š” ํ•ญ์ƒ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ฒŒ ๋œ๋‹ค.

AVL ํŠธ๋ฆฌ: ์‚ฝ์ž… ์˜ˆ -1

1

15

0

15

-2

2

2

10

45

7

0

10

1

45

15

30

45

30

LR

2 15

5

1 15

2

30

30

15

1 0

5

0

LL

2

0

0 45

5

0

30 0

0 45

5

0 -1

15

-1

45

5

RR

15

30

1

0 30 15

2

30

0

5 5

0 15

2

2 2

30

30

10

10

45

45

45 7

12

AVL ํŠธ๋ฆฌ์˜ ์‚ฝ์ž… ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฒซ์งธ, ์‚ฝ์ž…๋œ ๋‹จ๋ง๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” ํ•ญ์ƒ ๋ณ€ํ•œ๋‹ค. ๋‘˜์งธ, ์‚ฝ์ž…๋œ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ๋…ธ๋“œ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋ฉด ๊ท ํ˜•์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์–ด๋–ค ๋…ธ๋“œ์˜ ๊ท ํ˜„ ์ธ ์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด 0์ด ๋˜๋ฉด ๊ทธ ์ดํ›„์˜ ์กฐ์ƒ๋…ธ๋“œ๋“ค์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์œ„ ์˜ˆ์ œ์— ์„œ 12๋ฅผ ์‚ฝ์ž…ํ•˜์˜€์„ ๋•Œ 10 ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜ ๊ฐ’์€ 1์—์„œ 0์„ ๋ณ€๊ฒฝ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ดํ›„ ์กฐ ์ƒ ๋…ธ๋“œ๋“ค์€ ๊ท ํ˜•์ธ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

AVL ํŠธ๋ฆฌ: ์‚ฝ์ž… ์˜ˆ โ€“ ๊ณ„์† 2 1

15

10 0

15

-2 5

RL

30

0 15

1

0

7 7

30

1 2

10

45

5 5

-1

10

8

12

30

45 15 2

7

12

14

2 2

8

12

-1 7

30

8

-1 5

2

10

8

45

12

14

- 154 -

LR

45


AVL ํŠธ๋ฆฌ: ์‚ญ์ œ ์‚ญ์ œ๋„ ์ผ๋ฐ˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ๋‹ค. ์‚ญ์ œ๋„ ์‚ฝ์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ AVL ํŠธ๋ฆฌ์˜ ์„ฑ์งˆ์„ ์œ„๋ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ์—๋Š” ์ฒซ ๋ฒˆ์งธ ์œ„๋ฐฐ๋œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žฌ์กฐ์ •ํ•˜๋ฉด ์ „์ฒด ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์ด ์ด๋ฃจ์–ด์ง€์ง€๋งŒ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ๋Š” ํ•œ๋ฒˆ ์žฌ์กฐ์ •์„ ํ•˜์—ฌ๋„ ์—ฌ์ „ํžˆ ํŠธ๋ฆฌ๊ฐ€ AVL ํŠธ๋ฆฌ์˜ ์„ฑ์งˆ์„ ์œ„๋ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํŠธ๊นŒ์ง€ ๊ณ„์† ๊ฒ€์‚ฌํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋  ์‚ญ์ œ ๊ฒฝ์šฐ์—๋Š” ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค๋งŒ ๊ท ํ˜• ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ž์‹์ด ํ•˜๋‚˜์ธ ์ค‘๊ฐ„๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋  ์‚ญ์ œ ๊ฒฝ์šฐ์—๋Š” ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋„๋ถ€ํ„ฐ ๋ฃจํŠธ๊นŒ์ง€ ๊ท ํ˜• ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋  ์‚ญ์ œ ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„๋…ธ๋“œ์™€ ๋Œ€์ฒด๋˜๋Š” ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ๊นŒ์ง€ ๊ท ํ˜• ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

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

AVL ํŠธ๋ฆฌ: ์‚ญ์ œ โ€“ ๊ณ ๋ ค์‚ฌํ•ญ1 ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ท ํ˜•์ธ์ˆ˜๋ฅผ ์žฌ์กฐ์ •ํ•  ๋•Œ ๋‹ค์Œ์„ ๊ณ ๋ คํ•œ๋‹ค. ๊ฒฝ์šฐ 1. ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 0์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. (๋ฐ”๋€Œ๊ธฐ ์ „ ์ธ์ˆ˜ ๊ฐ’์€ 1 ๋˜๋Š” -1) ๊ฒฝ์šฐ 2. ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 1 ๋˜๋Š” -1๋กœ ๋ฐ”๋€Œ๋ฉด ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. (๋ฐ”๋€Œ๊ธฐ ์ „ ์ธ์ˆ˜ ๊ฐ’์€ 0) ๊ฒฝ์šฐ 3. ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 2 ๋˜๋Š” -2๋กœ ๋ฐ”๋€Œ๋ฉด ๊ทธ ์œ„์น˜์—์„œ ์žฌ์กฐ์ • ํ•ด์•ผ ํ•˜๋ฉฐ, ์žฌ์กฐ์ •๋˜๋ฉด ๊ทธ ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” 0์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ์šฐ 1๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. 0 1 0

-1

๊ฒฝ์šฐ 1.

0

0

๊ฒฝ์šฐ 2.

0

0 0

1 0

0

์‚ญ์ œ๋œ ๋…ธ๋“œ(์ž์‹์˜ ๋‘˜์ธ ์ค‘๊ฐ„๋…ธ๋“œ๋Š” ์‹ค์ œ ์‚ญ์ œ๋œ ๋‹จ๋ง๋…ธ๋“œ)์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ท ํ˜•์ธ์ˆ˜๋ฅผ ์žฌ์กฐ์ •ํ•  ๋•Œ ์‚ฝ์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ๊นŒ์ง€ ๊ณ„์† ๊ฒ€ํ†  ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์‚ญ์ œ๋Š” ์ค‘๊ฐ„๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์—ญ์‹œ ์‹ค์ œ๋กœ๋Š” ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ญ์ œ๋œ ๋‹จ๋ง๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ๊ฒƒ์˜ ๊ท ํ˜•์ธ ์ˆ˜๊ฐ€ ๋ฐ”๋€๋‹ค. ํ•˜์ง€๋งŒ ์กฐ์ƒ๋…ธ๋“œ๋“ค์€ ํ•ญ์ƒ ๋ณ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ ์‚ญ์ œ ๋•Œ๋ฌธ

- 155 -


์— 0์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์ด๊ฒƒ์€ ๊ทธ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ํ•˜๋‚˜ ๊ฐ์†Œํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋„ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ ์‚ญ์ œ ๋•Œ๋ฌธ์— 1 ๋˜๋Š” -1๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์‚ญ์ œ ์ „ ์—๋Š” ํŠธ๋ฆฌ๊ฐ€ AVL ํŠธ๋ฆฌ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š”

0, 1, ๋˜๋Š” -1์ด๋‹ค. ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 1 ๋˜๋Š” -1๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ์ „์— ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 0 ์ด์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜์—ฌ, ์ด ๊ฒฝ์šฐ์—๋Š” ์ด ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ๋ณ€ํ•˜๊ฐ€ ์—†๋‹ค ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๊ฒƒ์˜ ์กฐ์ƒ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๋Š” ๋‹น์—ฐ ํžˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์‚ญ์ œ์— ์˜ํ•œ ํŠธ๋ฆฌ์˜ ์žฌ์กฐ์ •์€ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

AVL ํŠธ๋ฆฌ: ์‚ญ์ œ โ€“ ๊ณ ๋ ค์‚ฌํ•ญ2 ์‚ฝ์ž…๊ณผ ์ „ํ˜€ ๋‹ค๋ฅธ ํ˜•ํƒœ ์กด์žฌ 1

2

15

15 0

0 10 0

-1 10

LL

1

0

0 10

20

5

0 12

5

-1

-2

10

5 0 15

0 15

0

-1 10

20 0 25

20

RR 0

20

12 1

10 0

0

0

12

5

15

0 25

25 0 15

AVL ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋Š” ๊ธฐ์กด ์‚ฝ์ž…์—์„œ ๋ณด์•˜๋˜ LL, LR, RR, RL ๋„ค ๊ฐ€์ง€ ์™ธ์— ํŠน์ดํ•œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ณดํ†ต ์‚ฝ์ž…์—์„œ LL์€ A ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 2์ด๊ณ , B ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 1 ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์ด ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ณด์—ฌ์ฃผ๋“ฏ์ด A ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 2์ด๊ณ , B ๋…ธ๋“œ ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ๋„ LL ํšŒ์ „์„ ํ†ตํ•ด ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜ ์žˆ ๋‹ค. ๋˜ํ•œ ์‚ฝ์ž…์—์„œ ๊ฒ€ํ† ๋˜์—ˆ๋˜ RR์€ A ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2์ด๊ณ , B ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -1 ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์ด ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ณด์—ฌ์ฃผ๋“ฏ์ด A ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2์ด๊ณ , B ๋…ธ ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ๋„ RL ํšŒ์ „์„ ํ†ตํ•ด ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

- 156 -


AVL ํŠธ๋ฆฌ: ์‚ญ์ œ ์˜ˆ -1 -1

0

30

8

5

10

17

50

25

7

20

10

25

17

60

40

7

50

20

8

50

65

55

15

30

60

40

0

-1 8

20

30

RR

15

-1 7

0

-2

RR

15

10

17

40

25

55

60

65

65

55

์‚ญ์ œ์˜ ๊ฒฝ์šฐ, ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฃจํŠธ๊นŒ์ง€ ๊ท ํ˜•์ธ์ˆ˜๋ฅผ ๊ฒ€ํ† ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์ด ํšŒ์ „์— ์‚ฌ์šฉ๋˜๋Š” B๋…ธ๋“œ, C๋…ธ๋“œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. (์‚ฝ์ž…๊ณผ ์ฐจ์ด์ )

๋‹จ๋ง๋…ธ๋“œ์˜ ์‚ญ์ œ ํ‚ค ๊ฐ’์ด 5์ธ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋กœ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๋‘ ๋ฒˆ์˜ ํšŒ์ „์ด ํ•„์š”ํ•˜๋‹ค.

์ด ์˜ˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์ด๋‹ค. ๋‹จ๋ง๋…ธ๋“œ 5๊ฐ€ ์‚ญ์ œ๋˜๋ฉด 7 ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜ ๊ฐ’ ์ด -2๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€ ๋…ธ๋“œ๋กœ ํŠธ๋ฆฌ๋ฅผ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋•Œ ์ด ๋…ธ๋“œ๊ฐ€ A ๋…ธ๋“œ๊ฐ€ ๋˜๋ฉฐ, ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ ๋ฐ˜๋Œ€์ชฝ ๋ฐฉํ–ฅ์˜ ๋…ธ๋“œ๋“ค์ด B ๋…ธ๋“œ์™€ C ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, A ๋…ธ๋“œ ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ญ์ œ๋œ ๋…ธ๋“œ๊ฐ€ A ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ์—ˆ์œผ๋ฉด A ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์ด B ๋…ธ๋“œ์™€ C ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ์ด ์ ๊ณผ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์‚ฝ์ž… ๊ณผ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค. ์œ„ ์˜ˆ์—์„œ 7๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žฌ์กฐ์ •ํ•œ ๊ฒฐ๊ณผ ๊ทธ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ์ธ 15 ๋…ธ๋“œ์˜ ๊ท ํ˜•์ธ์ˆ˜๊ฐ€ -2๊ฐ€ ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์žฌ์กฐ์ •์„ ํ•ด์•ผ ํ•œ ๋‹ค. ์ฆ‰, 5์˜ ์‚ญ์ œ๋กœ ์ด ๋‘ ๋ฒˆ์˜ ์žฌ์กฐ์ •์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.

AVL ํŠธ๋ฆฌ: ์‚ญ์ œ ์˜ˆ โ€“ ๊ณ„์† -1

-1

15

15

-1

-1 7

-1

30

7

25 1

5

8

20

10

17

50

25

40

55

5

60

-1 20

8

10

17

65

50

40

55

60

65

์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„ ๋…ธ๋“œ์˜ ์‚ญ์ œ ์ด ๊ฒฝ์šฐ์—๋Š” ์ „ํ˜€ ํšŒ์ „์ด ํ•„์š”์—†๋‹ค.

์ด ์˜ˆ๋Š” ์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์˜ˆ์ด๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„๋…ธ ๋“œ์˜ ์‚ญ์ œ๋Š” ๊ทธ๊ฒƒ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์‚ญ์ œ๋ฅผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋กœ ๋ณด๊ธฐ ๋ณด๋‹ค๋Š” 25 ๋…ธ๋“œ์˜ ์‚ญ์ œ๋กœ ์ƒ๊ฐํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

- 157 -


AVL ํŠธ๋ฆฌ: ์‚ญ์ œ ์˜ˆ โ€“ ๊ณ„์† -2

-1 10

15

7

10

25

17

5

50

40

55

10

1

-1 20

8

-1 7

25 1

5

25

0

-1

20

8

60

50

-1 50

17

60

40

65

7

55

5

20

8

17

40

55

60

65

65

์ด ์˜ˆ๋Š” ์—ญ์‹œ ์ž์‹์ด ๋‘˜์ธ ์ค‘๊ฐ„๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์˜ˆ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ๋Š” ์•ž ์˜ˆ์ œ์™€ ๋‹ฌ๋ฆฌ ํšŒ์ „์ด ํ•„์š”ํ•˜๋‹ค.

AVL ํŠธ๋ฆฌ ๋ถ„์„ AVL ํŠธ๋ฆฌ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

์ฐพ๊ธฐ: T(N) = O(log2N) ์ฒ˜๋ฆฌ: T(N) = O(1) ์‚ฝ์ž… ๊ท ํ˜•: W(N) = O(log2N) ์ „์ฒด: W(N) = O(log2N)

์ „์ฒด: W(N) = O(N)

์ฐพ๊ธฐ: T(N) = O(log2N) ์ฒ˜๋ฆฌ: W(N) = O(log2N) ์‚ญ์ œ ๊ท ํ˜•: W(N) = O(log2N ์ „์ฒด: W(N) = O(log2N)

์ „์ฒด: W(N) = O(N)

๊ฒ€์ƒ‰ ์ „์ฒด: T(N) = O(log2N)

์ „์ฒด: W(N) = O(N)

ํšŒ์ „ ๋น„์šฉ์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋ฉฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ๋†’์ด๋งŒํผ ํšŒ์ „ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์˜ ์ „์ฒด ๋น„์šฉ์€ ํŠธ๋ฆฌ ๋†’์ด์— ๋น„๋ก€ํ•œ๋‹ค. ์ฆ‰, AVL ํŠธ๋ฆฌ๋Š” ์ผ๋ฐ˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์˜ ์—ฐ์‚ฐ ๋น„์šฉ๋„ ์ €๋ ดํ•˜๋ฉด์„œ ๊ฒ€์ƒ‰์€ ํ•ญ์ƒ O(log2N)์ธ ํŠธ๋ฆฌ์ด๋‹ค.

- 158 -


์ œ12์žฅ ๊ทธ๋ž˜ํ”„ ์ด ์žฅ์—์„œ๋Š” ๊ทธ๋ž˜ํ”„๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

12.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ ๊ฐœ์š” ๊ทธ๋ž˜ํ”„๋Š” ํŠธ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ณด๋‹ค ํฐ ๊ฐœ๋…์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ, ๋…ธ๋“œ์™€ ๋˜ ๋‹ค๋ฅธ ๋…ธ๋“œ ๊ฐ„์— ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰: ๋„ˆ๋น„ ์šฐ์„ , ๊นŠ์ด ์šฐ์„  ์‹ ์žฅ ํŠธ๋ฆฌ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

12.2. ๊ทธ๋ž˜ํ”„

๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„(graph): ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹Œ ์ •์ (vertex)๋“ค์˜ ์œ ํ•œ ์ง‘ํ•ฉ๊ณผ ๊ทธ๋ž˜ํ”„ ์ •์  ์ด ์ •์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ (edge)์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐ„์„  ์ˆ˜ํ•™์  ์ •์˜: ๊ทธ๋ž˜ํ”„ G๋Š” G = (V, E)๋กœ ์ •์˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ V(G): ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹Œ ์ •์ ๋“ค์˜ ์œ ํ•œ์ง‘ํ•ฉ E(G): ๊ฐ„์„ ๋“ค์˜ ์ง‘ํ•ฉ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(undirected graph): ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„ ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(directed graph, digraph): ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๊ฐ„์„ ์„ ์•„ํฌ(arc)๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์•„ํฌ ์ธ์ ‘ ์ •์ (adjacent vertex): ๊ฐ„์„ ์— ์˜ํ•ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •์  ์ •์  ๊ฒฝ๋กœ(path): ๋‘ ๊ฐœ์˜ ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ผ๋ จ์˜ ์ •์ ๋“ค ๊ฒฝ๋กœ ์ •์  a์—์„œ b๊นŒ์ง€์˜ ๊ฒฝ๋กœ a, v1, v2, โ€ฆ, vn, b๊ฐ€ ์กด์žฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ„์„  (a, v1), (v1, v2), โ€ฆ, (vn-1, vn), (vn, b)๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

๊ณต์ง‘ํ•ฉ์ด ์•„๋‹Œ ์ •์ (vertex)๋“ค์˜ ์œ ํ•œ์ง‘ํ•œ๊ณผ ์ด ์ •์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ (edge)์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ž˜ํ”„(graph)๋ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ 10์žฅ, 11์žฅ์—์„œ ์‚ดํŽด๋ณธ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ๊ทธ๋ž˜ํ”„์— ์† ํ•œ๋‹ค. ์ฆ‰, ํŠธ๋ฆฌ๋Š” ๊ทธ๋ž˜ํ”„์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์ด๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋ฌด๋ฐฉ ํ–ฅ(undirected) ๋˜๋Š” ์œ ๋ฐฉํ–ฅ(directed) ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜๋‰˜์–ด ์ง„๋‹ค. ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ„์„ ์„ ๋‹ค๋ฅธ ๋ง

- 159 -


๋กœ ์•„ํฌ(arc)๋ผ ํ•œ๋‹ค. ์ธ์ ‘์ •์ (adjacent vertex)์ด๋ž€ ๊ฐ„์„ ์— ์˜ํ•ด ์—ฐ๊ฒฐ๋˜๋Š” ์ •์ ์„ ๋งํ•˜๋ฉฐ, ๊ฒฝ๋กœ(path)๋ž€ ๋‘ ๊ฐœ์˜ ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ผ๋ จ์˜ ์ •์ ๋“ค์„ ๋งํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„ โ€“ ๊ณ„์† M

A

V(G1)= {A,B,E,L,M}

E B

D

E(G1)= {(A,E),(B,L),(E,A) (L,L),(L,A),(M,B),(M,E)} B

C V(G1)={A,B,C,D} A

L

Path(M,A): M, B, L, A - ๊ธธ์ด: 3

E(G1)={(A,B),(A,D),(B,C),(C,D)}

๊ฒฝ๋กœ์˜ ๊ธธ์ด: ๊ธธ์ด ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜ ์ฃผ๊ธฐ(cycle): ์ฒซ ๋ฒˆ์งธ ์ •์ ๊ณผ ๋งˆ์ง€๋ง‰ ์ •์ ์ด ๊ฐ™์€ ๊ฒฝ๋กœ ์ฃผ๊ธฐ ์ •์ ์˜ ์ฐจ์ˆ˜: ์ฐจ์ˆ˜ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ๋งํ•˜๋ฉฐ, ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ์ง„์ž… ์ฐจ์ˆ˜(indegree)์™€ ์ง„์ถœ ์ฐจ์ˆ˜(outdegree)๋กœ ๋‚˜๋ˆ„์–ด ๊ณ ๋ ค๋œ๋‹ค. ์ฐจ์ˆ˜ ์ฐจ์ˆ˜

์ด ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ A์˜ ์ธ์ ‘์ •์ ์€ B์™€ D์ด๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ž€ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ๊ฒฝ๋กœ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์ •์ ๊ณผ ๋ ์ •์ ์ด ๊ฐ™์œผ๋ฉด ์ฃผ๊ธฐ(cycle)๋ผ ํ•œ ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ (A, B), (B, C), (C, D), (D, A)๋Š” ์ฃผ๊ธฐ์ด๋ฉฐ, ์ด ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋Š” 4์ด๋‹ค. ๊ฒฝ๋กœ์˜ ์ฐจ์ˆ˜(degree)๋ž€ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ๋งํ•˜๋ฉฐ, ์œ ๋ฐฉํ–ฅ ๊ทธ ๋ž˜ํ”„์—์„œ๋Š” ์ง„์ž…์ฐจ์ˆ˜์™€ ์ง„์ถœ์ฐจ์ˆ˜๋ฅผ ๋‚˜๋ˆ„์–ด ๊ณ ๋ คํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์— ์„œ A์˜ ์ฐจ์ˆ˜๋Š” 2์ด๊ณ , ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ A์˜ ์ง„์ถœ์ฐจ์ˆ˜๋Š” 1์ด๊ณ , ์ง„์ž…์ฐจ์ˆ˜๋Š” 2์ด๋‹ค.

๊ทธ๋ž˜ํ”„ โ€“ ๊ณ„์† ์™„์ „ ๊ทธ๋ž˜ํ”„(complete graph): ์ตœ๋Œ€ ์ˆ˜์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง„ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„ ๋ชจ๋“  ์ •์ ์ด ์ธ์ ‘ ์ •์ ์ด ๋œ๋‹ค. N๊ฐœ์˜ ์ •์ ์ด ์žˆ์œผ๋ฉด ์œ ๋ฐฉํ–ฅ์€ N(N-1)๊ฐœ, ๋ฌด๋ฐฉํ–ฅ์€ N(N-1)/2๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค.

์™„์ „ ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (complete directed graph)

์™„์ „ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (complete undirected graph)

์™„์ „ ๊ทธ๋ž˜ํ”„(complete graph)๋ž€ ์ตœ๋Œ€ ์ˆ˜์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ •์ ์€ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์˜ ์ธ์ ‘ ์ •์ ์ด ๋œ๋‹ค. ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๎€ ๊ฐœ์˜ ์ •์ ์ด ์žˆ์„ ๋•Œ, ์ด ๊ทธ๋ž˜ ํ”„๊ฐ€ ์™„์ „ ๊ทธ๋ž˜ํ”„์ด๋ฉด ์ด ๎€ ๎„ ๎€ ๎† ๎€ด ๎… ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๊ฐ™์€ ์กฐ๊ฑด ์—์„œ๋Š” ์ด ๎€ ๎„ ๎€ ๎† ๎€ด ๎… ๎”๎€ต ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค.

- 160 -


๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„(weighted graph): ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„ 120

10

์ธ์ฒœ

120

์„œ์šธ

์›์ฃผ

๊ฐ•๋ฆ‰

90 160 180

140

์ฒœ์•ˆ

250

50

๋Œ€์ „

๊ด‘์ฃผ

200

60 60 80

๋Œ€๊ตฌ

๋ถ€์‚ฐ 80

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„(weighted graph)๋ž€ ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋งํ•œ๋‹ค.

12.3. ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„

๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ• 1. ์ธ์ ‘ ํ–‰๋ ฌ

M

A E B

D B C A A

B

C

D

A

0

1

0

1

B

1

0

1

0

C

0

1

0

1

D

1

0

1

0

L

ํ•ฉ: ์ •์ ์˜ ์ฐจ์ˆ˜

A

B

E

L

M

A

0

0

1

0

0

B

0

0

0

1

0

E

1

0

0

0

0

L

1

0

0

1

0

M

0

1

1

0

0

ํ–‰์˜ ํ•ฉ: ์ •์ ์˜ ์ง„์ถœ ์ฐจ์ˆ˜ ์—ด์˜ ํ•ฉ: ์ •์ ์˜ ์ง„์ž… ์ฐจ์ˆ˜

๋‹จ์ . ๋‹จ์ . n2 ๊ณต๊ฐ„์ด ํ•„์š” - ๋ฌด๋ฐฉํ–ฅ ํ–‰๋ ฌ์€ ์ด๊ฒƒ์˜ ๋ฐ˜๋งŒ์œผ๋กœ ํ‘œํ˜„๊ฐ€๋Šฅ

๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์ปดํ“จํ„ฐ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ฒซ์งธ, ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ๋ฒ• ๋‘˜์งธ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ๋ฒ• ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ๋ฒ•์€ ํ–‰๋ ฌ์„ ํ†ตํ•ด ์ •์  ๊ฐ„์— ์ธ์ ‘ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ์—๋Š” ๎€ต ํ–‰๋ ฌ์ด ๋Œ€์นญ์ ์ด๋ฏ€๋กœ ์‹ค์ œ๋Š” ๎ƒฒ ๎”๎€ต ๋งŒํผ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋ฉด ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋Š” ํ–‰๋ ฌ์ด ๋Œ€ ๎€ต ์นญ์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ๎ƒฒ ๋งŒํผ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ํ–‰์˜ ํ•ฉ์ด ์ •์ ์˜ ์ง„์ถœ

์ฐจ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์—ด์˜ ํ•ฉ์€ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

- 161 -


๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„ โ€“ ๊ณ„์† ๋ฐฉ๋ฒ• 2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

A

M

A E B

D B

E

B

L

E

A

L

A

L

M

B

E

C A A

B

D

B

A

C

C

B

D

D

A

C

L

๋‹จ์ . ๋‹จ์ . ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค. - ์—ญ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์œ ์ง€

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์€ ๊ฐ ์ •์ ๋งˆ๋‹ค ๊ทธ๊ฒƒ์˜ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์œ ์ง€ํ•œ๋‹ค. ์œ  ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„ ๋ฐฉ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์—ญ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

Graph ADT <<interface>> Graph

MatrixGraph

WeightedMatrixGraph

ListGraph

UnweightedMatrixGraph

WeightedListGraph

DirectedWeightedMatrixGraph

UnweightedListGraph

UndirectedUnweightedListGraph

UndirectedUnweightedMatrixGraph

๊ทธ๋ž˜ํ”„๋Š” ํฌ๊ฒŒ ์ธ์ ‘ ํ–‰๋ ฌ ๋˜๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Graph๋ผ๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ ํ›„์—, ์ธ์ ‘ ํ–‰๋ ฌ์„ ์ด์šฉํ•˜๋Š” ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์œ„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค

MatrixGraph์™€ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์œ„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ListGraph๋ฅผ ์ •์˜ ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ฐ€์ค‘์น˜, ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์ธ์ง€์— ๋”ฐ๋ผ ListGraph๋Š” ๋‹ค์‹œ ๊ทธ๊ฒƒ์˜ ์ž ์‹

์ถ”์ƒํด๋ž˜์Šค์ธ

WeightedListGraph,

UnweightedListGraph๋ฅผ

WeightedMatrixGraph, UnweightedMatrixGraph๋ฅผ ์ •์˜ํ•œ๋‹ค.

- 162 -

์ •์˜ํ•˜๊ณ ,

MatrixGraph๋Š”


Graph ADT import java.util.Iterator; interface Graph{ int DEF_CAPACITY = 10; int DFS = 1; // ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์ˆ˜ int BFS = 2; // ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์ˆ˜ boolean isEmpty(); boolean isFull(); void clear(); void insertVertex(String label) throws GraphOverflowException; void removeVertex(String label) throws GraphUnderflowException; void removeEdge(String from, String to) throws GraphUnderflowException; // ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ // void insertEdge(String from, String to); // ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ // void insertEdge(String from, String to, int weight); Iterator iterator(int type, String start); }

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋Š” ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ์—ฐ๊ด€๋œ ๊ทธ๋ž˜ํ”„๋กœ์„œ ํ›„์— ๋ณด๋‹ค ์ž์„ธํžˆ ์„ค๋ช…ํ•œ๋‹ค. ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์˜ ์ถ”๊ฐ€๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์„ ์ถ”๊ฐ€ํ•  ๋•Œ์—๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ํ•„์š” ์—†๋‹ค. public abstract ListGraph implements Graph{ protected class Vertex{ public String label; public SortedLinkedList edges; } protected class GraphIterator implements Iterator{ โ€ฆ } protected Vertex[] graph; protected int size = 0; // ์ •์ ์˜ ๊ฐœ์ˆ˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ public ListGraph(){ setup(DEF_CAPACITY); } public ListGraph(int capacity){ if(capcity>0) setup(capacity); else setup(DEF_CAPACITY); } private void setup(int capacity){ โ€ฆ } public boolean isEmpty(){ return (size == 0); } public boolean isFull(){ return (size == graph.length); } public void clear() { โ€ฆ } protected int index(String label){ โ€ฆ } // ์ •์ ์˜ ์ƒ‰์ธ ์ฐพ๊ธฐ public void insertVertex(String label) throws GraphOverflowException { โ€ฆ } public abstract void removeVertex(String label) throws GraphUnderflowException; public abstract void removeEdge(String from, String to) throws GraphUnderflowException; public boolean search(int type, String from, String to) throws GraphUnderflowException { โ€ฆ } public Iterator iterator(int type, String start) throws GraphUnderflowException { โ€ฆ } }

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

- 163 -


WeightedListGraph, UnweightedListGraph public abstract class WeightedListGraph extends ListGraph{ public WeightedListGraph(){ super(); } public WeightedListGraph(int capacity){ super(capacity); } public abstract void insertEdge(String from, String to, int weight); } public abstract class UnweightedListGraph extends ListGraph{ public WeightedListGraph(){ super(); } public WeightedListGraph(int capacity){ super(capacity); } public abstract void insertEdge(String from, String to); }

UndirectedUnweightedListGraph public abstract UndirectedUnweightedListGraph implements UnweightedGraph{ public UndirectedUnweightedListGraph(){ super(DEF_CAPACITY); } public UndirectedUnweightedListGraph(int capacity){ super(DEF_CAPACITY); } public void removeVertex(String label) throws GraphUnderflowException { โ€ฆ } public void removeEdge(String from, String to) throws GraphUnderflowException { โ€ฆ } public void insertEdge(String from, String to) throws GraphUnderflowException { โ€ฆ } }

์ด ์ ˆ์—์„œ๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด๋ฐฉํ–ฅ ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค. ์ด ๋ฅผ ์œ„ํ•ด UnweightedListGraph์„ ์ƒ์†๋ฐ›์€ UndirectedUnweightedListGraph ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ ๋‹ค.

- 164 -


Insert Vertex public void insertVertex(String label) throws GraphOverflowException{ if(label==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isFull()) throw new GraphOverflowException(โ€œโ€ฆ"); Vertex v = new Vertex(); v.label = label; v.edges = new SortedLinkedList(); graph[size] = v; size++; } // ListGraph: insertVertex protected int index(String label){ for(int i=0; i<size; i++){ if(label.equals(graph[i].label)) return i; } return -1; ์ •์ ๋“ค์€ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฐฉ์‹์œผ๋กœ ์œ ์ง€ } // ListGraph: index

์ด ์žฅ์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋กœ ์ •์ ๋“ค์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์˜ ์ถ”๊ฐ€๋Š” ๋ฆฌ์Šค ํŠธ์˜ ๋งจ ๋์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ •์ ์˜ ์ œ๊ฑฐ, ๊ฐ„์„ ์˜ ์ถ”๊ฐ€, ๊ฐ„์„ ์˜ ์ œ๊ฑฐ๋Š” ๋ชจ๋‘ ํ•ด๋‹น ์ •์ ์ด ์ด๋ฏธ ๊ทธ๋ž˜ํ”„์— ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„์— ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ์ •์ ์ด ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์—๋Š” ๊ทธ ์ •์ ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด index๋ผ๋Š” ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

Insert Edge public void insertEdge(String from, String to) throws GraphUnderflowException{ if(from==null||to==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new GraphUnderflowException(โ€œโ€ฆโ€); int v1 = index(from); int v2 = index(to); // v1 ์ •์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(v1==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); // v2 ์ •์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(v2==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); graph[v1].edges.insert(graph[v2].label); graph[v2].edges.insert(graph[v1].label); } // UndirectedUnweightedListGraph: insertEdge ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ์–‘์ชฝ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ.

๊ฐ„์„ ์„ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ„์„ ์˜ ๋‘ ์ •์ ์ด ๋ชจ๋‘ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ A์—์„œ B๋ฅผ ์ž‡๋Š” ๊ฐ„์„ ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ์—๋Š” B์—์„œ A๋ฅผ ์ž‡๋Š” ๊ฐ„์„ ๋„ ํ•จ ๊ป˜ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

- 165 -


Remove Vertex public void removeVertex(String label) throws GraphUnderflowException{ if(label==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new GraphUnderflowException(โ€œโ€ฆโ€); int v = index(label); // ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ •์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(v == -1) throw new GraphUnderflowException(โ€œโ€ฆโ€); graph[v] = graph[size-1]; size--; for(int i=0;i<size;i++){ if(!graph[i].edges.isEmpty()) graph[i].edges.delete(label); } } // UndirectedUnweightedListGraph: RemoveVertex ์ •์ ์„ ์ œ๊ฑฐํ•˜๋Š” ์ด ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

์ •์ ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ์ •์ ๊ณผ ๊ทธ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ์ •์ ์„ ์ •์ ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋ฌผ๋ก  ๊ทธ๊ฒƒ์˜ ์ธ ์ ‘ ์ •์ ๋“ค์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์—์„œ๋„ ์ด ์ •์ ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ตฌํ˜„์—์„œ๋Š” ๋ชจ๋“  ์ •์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ •์ ์ด ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด๊ฒƒ์„ ๊ฐœ์„  ํ•˜๊ธฐ ์œ„ํ•œ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ •์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ์ธ์ ‘ํ•œ ์ • ์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋งŒ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Remove Edge public void removeEdge(String from, String to) throws GraphUnderflowException{ if(isEmpty()) throw new GraphUnderflowException(โ€œโ€ฆโ€); if(from==null||to==null) throw new NullPointerException(โ€œโ€ฆโ€); int v1 = index(from); int v2 = index(to); // v1 ์ •์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(v1==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); // v2 ์ •์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(v2==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); // v1์—์„œ v2๋ฅผ ์ž‡๋Š” ๊ฐ„์„ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if(!graph[v1].edges.delete(graph[v2].label)) throw new GraphUnderflowException(โ€œโ€ฆโ€); graph[v2].edges.delete(graph[v1].label); } // UndirectedUnweightedListGraph: RemoveEdge ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ์–‘์ชฝ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๋ชจ๋‘ ์ œ๊ฑฐํ•ด์•ผ ํ•จ.

A์—์„œ B๋ฅผ ์ž‡๋Š” ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์—๋Š” A ์ •์ ๊ณผ B ์ •์ ์ด ์กด์žฌํ•ด์•ผ ํ•  ๋ฟ๋งŒ ์•„ ๋‹ˆ๋ผ A์—์„œ B๋ฅผ ์ž‡๋Š” ๊ฐ„์„ ์ด ์‹ค์ œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ A์—์„œ B๋ฅผ ์ž‡ ๋Š” ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•  ๋•Œ B์—์„œ A๋ฅผ ์ž‡๋Š” ๊ฐ„์„  ์ •๋ณด ์—ญ์‹œ ํ•จ๊ป˜ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

12.4. ์ˆœํšŒ ํŠธ๋ฆฌ์—์„œ ์ˆœํšŒ๋Š” ํฌ๊ฒŒ ์ „์œ„, ์ค‘์œ„, ํ›„์œ„ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„์—์„œ ์ˆœํšŒ๋Š” ํฌ๊ฒŒ

- 166 -


๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•๊ณผ ๋„ˆ๋น„์šฐ์„  ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

Traverse ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS, Depth First Search) ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰ ๋‹จ๊ณ„ 1. ์ •์  i๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค. ๋‹จ๊ณ„ 2. ์ •์  i์— ์ธ์ ‘ํ•œ ์ •์  ์ค‘์— ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์ด ์žˆ์œผ๋ฉด ๋ชจ๋‘ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค. ๋‹จ๊ณ„ 3. ์Šคํƒ์—์„œ ์ •์ ์„ ์ œ๊ฑฐํ•˜๊ณ , ์ด ์ •์ ์„ i๋กœ ํ•˜์—ฌ ๋‹จ๊ณ„ 1๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋งŒ์•ฝ ์Šคํƒ์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜์˜€์œผ๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. A A ์ˆœํšŒ ์ˆœ์„œ: A,D,G,C,F,B,E C

์ˆœํšŒ ์ˆœ์„œ: A,C,E,D,B

C D

B

B G

D

E

E

F

๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•์€ ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์Šค ํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € A์—์„œ ์ถœ๋ฐœํ•˜๋ฏ€๋กœ A๋ฅผ ์Šคํƒ์— pushํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์Šคํƒ์—์„œ ์ • ์ ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ด ์ •์ ์˜ ์ธ์ ‘ ์ •์ ์„ ์Šคํƒ์— pushํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํƒ์— B์™€ C๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ

push๋œ๋‹ค. ์Šคํƒ์— ์ธ์ ‘ ์ •์ ๋“ค์„ pushํ•œ ๋‹ค์Œ์—๋Š” ๋ฐ”๋กœ ์ •์ ์„ ํ•˜๋‚˜ pop์„ ํ•œ๋‹ค. C๊ฐ€ top ์— ์žˆ์œผ๋ฏ€๋กœ ์ด ์ •์ ์˜ ์ธ์ ‘ ์ •์ ์„ ์Šคํƒ์— pushํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํƒ์— D, E ์ˆœ์œผ๋กœ push๋œ ๋‹ค. ํ˜„์žฌ ์Šคํƒ์— ์žˆ๋Š” ์ •์ ์€ top๋ถ€ํ„ฐ ๋‚˜์—ดํ•˜์˜€์„ ๋•Œ E, D, B์ด๋‹ค. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” A, C, E, D, B ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค.

Traverse ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS, Breadth First Search) ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰ ๋‹จ๊ณ„ 1. ์ •์  i๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค. ๋‹จ๊ณ„ 2. ์ •์  i์— ์ธ์ ‘ํ•œ ์ •์  ์ค‘์— ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์ด ์žˆ์œผ๋ฉด ๋ชจ๋‘ ํ์— ์ €์žฅํ•œ๋‹ค. ๋‹จ๊ณ„ 3. ํ์—์„œ ์ •์ ์„ ์ œ๊ฑฐํ•˜๊ณ , ์ด ์ •์ ์„ i๋กœ ํ•˜์—ฌ ๋‹จ๊ณ„ 1๋ถ€ํ„ฐ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋งŒ์•ฝ ํ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜์˜€์œผ๋ฉด ์ข…๋ฃŒ ํ•œ๋‹ค. A A ์ˆœํšŒ ์ˆœ์„œ: A,B,C,D,F,E,G C

์ˆœํšŒ ์ˆœ์„œ: A,B,C,E,D

C D

B

B G

D

E

E

F

๋„ˆ๋น„์šฐ์„  ๋ฐฉ๋ฒ•์€ ์ถœ๋ฐœ ์ •์ ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ •์ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ• ์€ ๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € A์—์„œ ์ถœ๋ฐœํ•˜๋ฏ€๋กœ A๋ฅผ ํ์—

enqueueํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ํ์—์„œ ์ •์ ์„ dequeueํ•˜๊ณ  ์ด ์ •์ ์˜ ์ธ์ ‘ ์ •์ ๋“ค์„ ํ์— enqueue

- 167 -


ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ์— B์™€ C๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ enqueue๋œ๋‹ค. ํ•œ ์ •์ ์˜ ์ธ์ ‘ ์ •์ ๋“ค์„ ํ์—

enqueue๋ฅผ ํ•œ ๋‹ค์Œ์—๋Š” ๋ฐ”๋กœ ์ •์ ์„ ํ•˜๋‚˜ dequeueํ•œ๋‹ค. B๊ฐ€ ํ front์— ์žˆ์œผ๋ฏ€๋กœ ์ด ์ •์  ์˜ ์ธ์ ‘ ์ •์ ์„ ํ์— enqueueํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ์— E๊ฐ€ enqueue๋œ๋‹ค. ํ˜„์žฌ ํ์— ์žˆ๋Š” ์ •์ ์€ ํ front๋ถ€ํ„ฐ ๋‚˜์—ดํ•˜๋ฉด C, E์ด๋‹ค. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” A, B, C, E, D ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค.

UnweightedListGraph์˜ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค public Iterator iterator(int type, String start) throws GraphUnderflowException { if(start==null) throw new NullPointerException(โ€œโ€ฆโ€); int v = index(start); if(v==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); if(type==Graph.BFS||type==Graph.DFS) return new GraphIterator(type, v); else throw new GraphUnderflowException(โ€œโ€ฆโ€); } protected class GraphIterator implements Iterator{ LinkedQueue traverseQueue; public GraphIterator(int type, int start){ โ€ฆ } public boolean hasNext() { โ€ฆ } public Object next() { โ€ฆ } public void remove() { โ€ฆ } private void BreadthFirstSearch(int start); private void DepthFirstSearch(int start); } public GraphIterator(int type, int start){ traverseQueue = new LinkedQueue(); if(type==Graph.BFS) BreadthFirstSearch(start); else DepthFirstSearch(start); }

๊ทธ๋ž˜ํ”„๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์ž ํด๋ž˜์Šค ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ traverseQueue๋Š” ๊ฐ ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ๊ฐ€ ์•„๋‹ˆ๊ณ  ๊ฐ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์ˆœํšŒ๋˜๋Š” ์ •์ ์˜ ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜๋Š” ํ์ด๋‹ค. ๋”ฐ๋ผ์„œ BreadthFirstSearch์™€ DepthFirstSearch ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋Š” traverseQueue ์™ธ์— ๊ฐ๊ฐ ๋ณ„๋„์˜ ์Šคํƒ๊ณผ ํ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์—ฐ๊ฒฐ ์—ฌ๋ถ€ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„(connected graph): ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ทธ๋ž˜ํ”„ ์Œ์˜ ์ •์ ๋“ค ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„ DFS, BFS๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. DFS(G, i): i ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ์ •์  ์ด ๋•Œ G = DFS(G, i)์ด๋ฉด ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ ์–ด๋–ค ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์˜ ์ฐจ์ˆ˜๊ฐ€ ์ง์ˆ˜์ด๋ฉด ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•˜์—ฌ๋„ ์—ฌ์ „ํžˆ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„(connected graph)๋ž€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์Œ์˜ ์ •์ ๋“ค ์‚ฌ์ด์— ๊ฒฝ ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋งํ•œ๋‹ค. ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์Œ์˜ ์ •์ ๋“ค ์‚ฌ์ด์— ๊ฐ„ ์„ ์ด ์กด์žฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ชจ๋“  ์Œ์˜ ์ •์ ๋“ค ์‚ฌ์ด์— ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋ฉด ์ด ๊ทธ๋ž˜

- 168 -


ํ”„๋ฅผ ์™„์ „ ๊ทธ๋ž˜ํ”„๋ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ์™„์ „ ๊ทธ๋ž˜ํ”„๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ๊ทธ๋ž˜ํ”„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊นŠ์ด์šฐ์„  ๋˜๋Š” ๋„ˆ๋น„์šฐ์„ ์œผ๋กœ ์ˆœํšŒํ•˜์˜€์„ ๋•Œ ๋ฐฉ๋ฌธ ์ •์ ๋“ค์˜ ์ง‘ํ•ฉ์ด ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ๋“ค์˜ ์ง‘ํ•ฉ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ทธ๋ž˜ํ”„๋Š” ๋น„์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

Spanning Tree ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„(subgraph): ๋‹ค์Œ์ด ์„ฑ๋ฆฝํ•˜๋ฉด G'(V', E')๋Š” G(V, E)์˜ ๊ทธ๋ž˜ํ”„ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„๋ผ ํ•œ๋‹ค. V' โŠ† V, E' โŠ† E ์‹ ์žฅ ํŠธ๋ฆฌ(spanning tree): G์˜ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„ ์ค‘ G์˜ ๋ชจ๋“  ์ •์ ๋“ค์„ ํŠธ๋ฆฌ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ A

A

C

B

D

E

A

B

C

D

A

C

B

D

E

๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„์ด์ง€๋งŒ ์ตœ์†Œ ์‹ ์žฅํŠธ๋ฆฌ๊ฐ€ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹˜ ์•„๋‹˜

C

B

D

E

์ตœ์†Œ ์‹ ์žฅํŠธ๋ฆฌ

๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„(subgraph)๋ž€ ์› ๊ทธ๋ž˜ํ”„์˜ ์ •์  ์ง‘ํ•ฉ ์ค‘์— ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ทจํ•˜๊ณ , ์› ๊ทธ๋ž˜ํ”„์—์„œ ์ด๋“ค ๋ถ€๋ถ„์ง‘ํ•ฉ์— ์†ํ•œ ์ •์ ๋“ค์„ ์ž‡๋Š” ๊ฐ„์„  ์ค‘์— ์ผ๋ถ€๋ฅผ ์ทจํ•ด ๋งŒ๋“  ๊ทธ๋ž˜ํ”„๋ฅผ ์› ๊ทธ๋ž˜ํ”„์˜ ๋ถ€ ๋ถ„ ๊ทธ๋ž˜ํ”„๋ผ ํ•œ๋‹ค. ์‹ ์žฅ ํŠธ๋ฆฌ(spanning tree)๋ž€ ์› ๊ทธ๋ž˜ํ”„์˜ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„ ์ค‘ ์› ๊ทธ๋ž˜ํ”„์˜ ๋ชจ ๋“  ์ •์ ์„ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ์ˆœํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊นŠ์ด์šฐ์„  ๋ฐฉ๋ฒ•์ด๋‚˜ ๋„ˆ ๋น„์šฐ์„  ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(minimum spanning tree): ์ตœ์†Œ์˜ ๊ฐ„์„  ์ˆ˜๋กœ ํŠธ๋ฆฌ ๊ตฌ์„ฑ๋œ ๊ทธ๋ž˜ํ”„์˜ ์‹ ์žฅ ํŠธ๋ฆฌ ๊ทธ๋ž˜ํ”„์˜ ์ •์  ์ˆ˜๊ฐ€ N์ด๋ฉด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ˆ˜๋Š” N-1์ด๋‹ค. DFS, BFS๋กœ ๋งŒ๋“ค์–ด์ง„ ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. ๊นŠ์ด์šฐ์„  ์‹ ์žฅํŠธ๋ฆฌ(depth first spanning tree) ์‹ ์žฅํŠธ๋ฆฌ ๋„ˆ๋น„์šฐ์„  ์‹ ์žฅํŠธ๋ฆฌ(breadth first spanning tree) ์‹ ์žฅํŠธ๋ฆฌ A

A

A

C

B

D

E

์› ๊ทธ๋ž˜ํ”„

C

B

D

E

DFS(A)์˜ ์‹ ์žฅ ํŠธ๋ฆฌ

C

B

D

E

BFS(A)์˜ ์‹ ์žฅ ํŠธ๋ฆฌ

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(minimum spanning tree)๋ž€ ์ตœ์†Œ์˜ ๊ฐ„์„  ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ž˜์˜ ์ •์ ์˜ ์ˆ˜๊ฐ€ ๎€ ์ด๋ฉด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์˜ ๊ฐ„์„ ์˜ ์ˆ˜๋Š” ๎€ ๎† ๎€ด ์ด๋‹ค. ๊นŠ์ด์šฐ์„  ๋˜ ๋Š” ๋„ˆ๋น„์šฐ์„  ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

- 169 -


12.5. ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ• 1. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์„œ์šธ

๋™๊ฒฝ

๋ถ€์‚ฐ

100

๋ถ๊ฒฝ

60

180

๋ถ€์‚ฐ ์ œ์ฃผ

๋ถ๊ฒฝ

180

๋™๊ฒฝ ํ™์ฝฉ

60

์‹œ์• ํ‹€

1600

์„œ์šธ

๋ถ๊ฒฝ

600

ํ™”์™€์ด

800

1200 100

ํ•˜์™€์ด

120

ํ™์ฝฉ

60

90

์‹œ์• ํ‹€

๋™๊ฒฝ

๋ถ€์‚ฐ

-

40

20

์ œ์ฃผ

40

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„ โ€“ ๊ณ„์† ๋ฐฉ๋ฒ• 2. ์ธ์ ‘ ํ–‰๋ ฌ 0

1

2

3

4

5

6

7

8

0

์„œ์šธ

0

0

60

90

100

120

180

800

1600

-

9 -

1

๋ถ€์‚ฐ

1

60

0

-1

20

-1

-1

-1

-1

-

-

2

์ œ์ฃผ

2

90

-1

0

40

40

-1

-1

-1

-

-

3

๋™๊ฒฝ

3

100

-1

-1

0

-1

-1

-1

1200

-

-

4

ํ™์ฝฉ

4

-1

-1

-1

-1

0

60

-1

-1

-

-

5

๋ถ๊ฒฝ

5

180

-1

-1

-1

-1

0

-1

-1

-

-

6

ํ•˜์™€์ด

6

-1

-1

-1

-1

-1

-1

0

600

-

-

7

์‹œ์• ํ‹€

7

1600

-1

-1

1200

-1

-1

600

0

-

-

8

-

8

-

-

-

-

-

-

-

-

-

-

9

-

9

-

-

-

-

-

-

-

-

-

-

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋„ ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ๋ฒ•์— ๊ฒฝ์šฐ์—๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๋…ธ๋“œ์— ๊ฐ€์ค‘์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉฐ, ์ธ์ ‘ ํ–‰๋ ฌ์˜ ๊ฐ ํ•ญ์—๋Š” ๊ฐ€์ค‘์น˜ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ์ธ์ ‘ ํ–‰๋ ฌ ์—์„œ ๊ฐ„์„ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์ค‘์น˜ ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฐ’์œผ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค. ์ด ์ ˆ์—์„œ๋Š” -1 ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„์„ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ ‘ ํ–‰๋ ฌ ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ„์„ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

- 170 -


public abstract MatrixGraph implements Graph{ public static final int NULLEDGE = -1; protected class GraphIterator implements Iterator{ โ€ฆ private void setup(int capacity){ } graph = new String[capacity]; protected String[] graph; adjMatrix = new int[capacity][capacity]; protected int size = 0; // ์ •์ ์˜ ๊ฐœ์ˆ˜ for(int i=0; i<capacity; i++) public MatrixGraph(){ for(int j=0; j<capacity; j++) setup(DEF_CAPACITY); if(i!=j) adjMatrix[i][j] = NULLEDGE; } else adjMatrix[i][j] = 0; public MatrixGraph(int capacity){ } if(capcity>0) setup(capacity); else setup(DEF_CAPACITY); } private void setup(int capacity){ โ€ฆ } ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ public boolean isEmpty(){ return (size == 0); } public boolean isFull(){ return (size == graph.length); } public void clear() { โ€ฆ } protected int index(String label){ โ€ฆ } // ์ •์ ์˜ ์ƒ‰์ธ ์ฐพ๊ธฐ public void insertVertex(String label) throws GraphOverflowException { โ€ฆ } public abstract void removeVertex(String label) throws GraphUnderflowException; public abstract void removeEdge(String from, String to) throws GraphUnderflowException; public boolean search(int type, String from, String to) throws GraphUnderflowException { โ€ฆ } public Iterator iterator(int type, String start) throws GraphUnderflowException { โ€ฆ } }

์ด ์ ˆ์—์„œ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์œ ๋ฐฉํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๋น„๊ฐ€ ์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ ๋“ค์„ ์ •๋ ฌํ•˜์—ฌ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ ์„  Graph ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค MatrixGraph๋ฅผ ์ •์˜ํ•œ๋‹ค. MatrixGraph๋„ ์•ž์„œ ์‚ดํŽด๋ณธ ListGraph์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ ์˜ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰, ์ˆœํšŒ๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ์—ฌ๋ถ€, ๋ฐฉํ–ฅ์„ฑ ์—ฌ ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

WeightedMatrixGraph, UnweightedMatrixGraph public abstract class WeightedMatrixGraph extends MatrixGraph{ public WeightedMatrixGraph(){ super(); } public WeightedMatrixGraph(int capacity){ super(capacity); } public abstract void insertEdge(String from, String to, int weight); } public abstract class UnweightedMatrixGraph extends MatrixGraph{ public WeightedMatrixGraph(){ super(); } public WeightedMatrixGraph(int capacity){ super(capacity); } public abstract void insertEdge(String from, String to); }

- 171 -


DirectedWeightedMatrixGraph public class DirectedWeightedMatrixGraph implements WeightedListGraph{ public DirectedWeightedMatrixGraph(){ super(); } public DirectedWeightedMatrixGraph(int capacity){ super(capacity); } public void removeVertex(String label) throws GraphUnderflowException { โ€ฆ } public void removeEdge(String from, String to) throws GraphUnderflowException { โ€ฆ } public void insertEdge(String from, String to, int weight) throws GraphUnderflowException { โ€ฆ } }

Insert Vertex public void insertVertex(String label) throws GraphOverflowException{ if(label==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isFull()) throw new GraphOverflowException(โ€œโ€ฆโ€); graph[size] = label; size++; } // MatrixGraph: insertVertex

์ •์ ๋“ค์„ ์ •๋ ฌํ•˜์—ฌ ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์˜ ์ถ”๊ฐ€๋Š” ๋ฌด๋ฐฉํ–ฅ ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์™€ ๋งˆ์ฐฌ๊ฐ€ ์ง€๋กœ ์ •์ ๋“ค์˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์˜ ๋์— ์ถ”๊ฐ€ํ•œ๋‹ค.

- 172 -


Insert Edge public void insertEdge(String from, String to, int weight) throws GraphUnderflowException{ if(from==null||to==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new GraphUnderflowException(โ€œโ€ฆโ€); int v1 = index(from); int v2 = index(to); if(v1==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); if(v2==-1) throw new GraphUnderflowException(โ€œโ€ฆโ€); adjMatrix[v1][v2] = weight; } // DirectedWeightedMatrixGraph: insertEdge

์œ ๋ฐฉํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฌด๋ฐฉํ–ฅ๊ณผ ๋‹ฌ๋ฆฌ A์—์„œ B๋กœ ๊ฐ€๋Š” ์•„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ B์—์„œ

A๋กœ ๊ฐ€๋Š” ์•„ํฌ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Remove Vertex public void removeVertex(String label) throws GraphUnderflowException{ if(label==null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new GraphUnderflowException(โ€œโ€ฆโ€); int v = index(label); if(v == -1) throw new GraphUnderflowException(โ€œโ€ฆโ€); size--; graph[v] = graph[size]; for(int i=0;i<size; i++){ adjMatrix[v][i] = adjMatrix[size][i]; adjMatrix[size][i] = NULLEDGE; adjMatrix[i][v] = adjMatrix[i][size]; adjMatrix[i][size] = NULLEDGE; } adjMatrix[v][v] = NULLEDGE; }// DirectedWeightedMatrixGraph: insertEdge

์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์—์„œ ์ •์ ์˜ ์ œ๊ฑฐ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋น„์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งจ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ์ •์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ •์ ์„ ๋ฎ์–ด ์“ฐ๋ฉด ๋œ๋‹ค. ์ด ๋•Œ ์ง„์ž…๊ณผ ์ง„์ถœ ์•„ํฌ ๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

12.6. ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ(shortest path problem)๋ž€ ์ •์  ๊ฐ„์— ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ๋งํ•œ๋‹ค. ์งง์€ ๊ฒฝ๋กœ๋ž€ ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ ์—์„œ๋Š” ๊ฒฝ๋กœ์— ์žˆ๋Š” ๊ฐ„์„ ๋“ค์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ์„ ๋งํ•œ๋‹ค.

- 173 -


์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ: ๋ฌธ์ œ ์ •์  ๊ฐ„์— ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์‘์šฉ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„๊ฐ€ ์œ ํ•œ ๊ทธ๋ž˜ํ”„์ธ์ง€ ๋ฌดํ•œ ๊ทธ๋ž˜ํ”„์ธ์ง€? ์œ ํ•œ ๊ทธ๋ž˜ํ”„: ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ์œ ํ•œํ•œ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์œ ๋ฐฉํ–ฅ์ธ์ง€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ธ์ง€? ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฝ์šฐ, ๊ฐ€์ค‘์น˜๊ฐ€ ๋ชจ๋‘ ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ, ์Œ์ˆ˜์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(๊ฐ€์žฅ ์–ด๋ ค์›€)

์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋‹ค๋ฅด๋‹ค. ํŠนํžˆ ๊ทธ๋ž˜ํ”„๊ฐ€ ์œ ๋ฐฉํ–ฅ์ธ ์ง€ ๋ฌด๋ฐฉํ–ฅ์ธ์ง€์— ๋”ฐ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์ค‘์น˜ ๊ฐ’์— ์˜ํ•ด ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋˜๋ฏ€๋กœ ๋”์šฑ ์–ด๋ ต๋‹ค. ๊ฐ€์žฅ ์–ด๋ ค์šด ๊ฒฝ์šฐ๋Š” ์œ ๋ฐฉํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ ๋ž˜ํ”„์—์„œ ์Œ์ˆ˜์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1. ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™์€ ์œ ํ•œ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ •์  s์—์„œ ์ •์  t๊นŒ์ง€ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ผ. BFS ๊ฒ€์ƒ‰์„ ์ด์šฉํ•˜๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. Moore ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์ ์˜ ์ˆ˜๋Š” n์ด๋ผ ํ•˜์ž. ๋‹จ๊ณ„ 1. โˆ€ฮป[v] = -1 ฮป[s] = 0; ๋‹จ๊ณ„ 2. l = 0; ๋‹จ๊ณ„ 3. ฮป[v] = l์ธ ์ •์  v์™€ ์ธ์ ‘ํ•œ ๋ชจ๋“  ์ •์  u ์ค‘ ฮป[u]๊ฐ€ -1์ด๋ฉด ฮป[u] = l +1, ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. ๋‹จ๊ณ„ 4. ฮป[t] != -1์ด๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. ๋‹จ๊ณ„ 5. l = l +1; ๋‹จ๊ณ„ 3๋ถ€ํ„ฐ ๋ฐ˜๋ณต

๋จผ์ € ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™์€ ์œ ํ•œ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ด ํŽด๋ณธ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Moore๊ฐ€ ์ œ์•ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์„œ ๋„ˆ๋น„์šฐ์„  ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค.

- 174 -


์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1. โ€“ ๊ณ„์† A์—์„œ D๊นŒ์ง€

A

B

E

C

D

C์—์„œ A๊นŒ์ง€

A

B

C

D

E

A

B

C

D

E

-1

-1

-1

-1

-1

-1

-1

-1

-1

-1

A

B

C

D

E

A

B

C

D

E

0

-1

-1

-1

-1

-1

-1

0

-1

-1

A

B

C

D

E

A

B

C

D

E

0

1

-1

-1

1

-1

1

0

1

1

A

B

C

D

E

A

B

C

D

E

0

1

2

2

1

2

1

0

1

1

Moore์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € ์ •์  ๊ฐœ์ˆ˜๋งŒํผ์˜ ์ •์ˆ˜ ๋ฐฐ์—ด ์„ ๋งŒ๋“ ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ์€ ์šฐ์„  -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ถœ๋ฐœ ์ •์ ์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ถœ๋ฐœ ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ์ •์ ์˜ ํ•ญ์˜ ๊ฐ’์€ 1๋กœ ๋ฐ”๊พผ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ถœ๋ฐœ ์ •์  ์ด A์ด๋ฏ€๋กœ A์˜ ํ•ญ ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ๊ณ , A์˜ ์ธ์ ‘ ์ •์ ์ธ B์™€ E๋Š” 1 ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ ๋‹ค. ๊ทธ ๋‹ค์Œ ๋ฐฐ์—ด์˜ ํ•ญ ๊ฐ’์ด 1์ธ ๊ฐ ์ •์ ์— ๋Œ€ํ•ด ๊ทธ๊ฒƒ์˜ ์ธ์ ‘ ์ •์ ์„ ์ฐพ์•„ ์ด ์ •์ ๋“ค์˜ ๋ฐฐ ์—ด ๊ฐ’์„ 2๋กœ ๋ฐ”๊พผ๋‹ค. ๋”ฐ๋ผ์„œ B์˜ ์ธ์ ‘ ์ •์ ์ธ C์™€ D๋Š” 2 ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์ •์ ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ๋•Œ ๋ฐฐ์—ด์˜ ํ•ญ์— ์žˆ๋Š” ๊ฐ’์ด ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฐ’์ด ๋œ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2. ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ธ ์œ ํ•œ ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ •์  s์—์„œ ์ •์  t๊นŒ์ง€ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ผ. Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์ ์˜ ์ˆ˜๋Š” n์ด๋ผ ํ•˜๊ณ , ์ •์ ๋“ค์˜ ์ง‘ํ•ฉ์„ V๋ผ ํ•˜์ž. ๋‹จ๊ณ„ 1. โˆ€ฮป[v] = โˆž; ฮป[s] = 0; ๋‹จ๊ณ„ 2. T ร… V ๋‹จ๊ณ„ 3. T ์ค‘์— ฮป[u]๊ฐ€ ์ตœ์†Œ์ธ ์ •์ ์„ u๋ผ ํ•˜์ž. ๋‹จ๊ณ„ 4. u๊ฐ€ t์ด๋ฉด ์ข…๋ฃŒ e โ†’ v ์— ๋Œ€ํ•ด vโˆˆT์ด๊ณ  ๋‹จ๊ณ„ 5. ์ •์  u์—์„œ ์ง„์ถœํ•˜๋Š” ๋ชจ๋“  ๊ฐ„์„  u โŽฏโŽฏ ฮป[v] > ฮป[u]+l(e)์ด๋ฉด ฮป[v] = ฮป[u]+l(e) ๋‹จ๊ณ„ 6. T ร… T - {u}, ๋‹จ๊ณ„ 3๋ถ€ํ„ฐ ๋ฐ˜๋ณต

๋‘ ๋ฒˆ์งธ๋กœ ์‚ดํŽด๋ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ธ ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์— ์ ์šฉํ•  ์ˆ˜ ์žˆ ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์„œ Dijkstra๊ฐ€ ์ œ์•ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

- 175 -


์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2. โ€“ ๊ณ„์† A์—์„œ D๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ์˜ˆ

A

5

2 3 B

E 7 1

6

B

C

D

E

0

99

99

99

99

A

B

C

D

E

0

2

3

99

5

A

B

C

D

E

0

2

3

8

5

A

B

C

D

E

0

2

3

8

4

A

B

C

D

E

0

2

3

6

4

T = {A,B,C,D,E}

T = {B,C,D,E}

C

3 D

A

2

T = {C,D,E}

T = {D,E}

T = {D}

Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Moore ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋ž˜ํ”„์˜ ์ •์  ์ˆ˜๋งŒํผ์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ๋‹ค. ์ฐจ์ด์ ์€ ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’์€ -1๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  โˆž ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. ์ฆ‰, ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜ ๊ฐ’๋“ค์˜ ํ•ฉ์ด โˆž ๋ณด๋‹ค๋Š” ์ ˆ๋Œ€ ํด ์ˆ˜ ์—†๋„๋ก โˆž ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ถœ๋ฐœ ์ •์ ์€ Moore ์•Œ๊ณ ๋ฆฌ ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ถœ๋ฐœ ์ •์ ์—์„œ ์ง„์ถœํ•˜๋Š” ๋ชจ๋“  ๊ฐ„์„ ์ด ์ž‡๋Š” ์ • ์ ์— ๋Œ€ํ•ด ๊ทธ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ •์ ์˜ ๋ฐฐ์—ด ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ A๊ฐ€ ์ถœ๋ฐœ ์ • ์ ์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ์˜ ์ธ์ ‘ํ•œ B, C, E๋Š” ๊ฐ๊ฐ 2, 3, 5 ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ ๋ฐฐ์—ด์˜ ๊ฐ’ ์ค‘ ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ๊ทธ ์ •์ ๊ณผ ์ด์›ƒํ•œ ์ •์ ์— ๋Œ€ํ•ด ๋ฐฐ์—ด ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ด ๋•Œ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐํ•œ ๊ฒฝ๋กœ์˜ ๊ฐ’์ด ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ (A, B), (B, C) ๊ฒฝ๋กœ์˜ ๊ฐ’์€ (A, C) ๊ฒฝ๋กœ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— (A, B), (B, C) ๊ฒฝ๋กœ๋Š” ๋ฐฐ์—ด์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ณผ์ •์„ ๋ชจ๋“  ์ •์ ์„ ๋‹ค ๊ณ ๋ คํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3. A

๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์œ ํ•œ ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ •์  s์—์„œ ์ •์  t๊นŒ์ง€ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ผ. ์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ n์ด ์ •์ ์˜ ์ˆ˜์ผ ๋•Œ, ์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ n-1์ด๋‹ค. ๊ธฐ๋ณธ ์ƒ๊ฐ ๊ธธ์ด๊ฐ€ 1์ธ ๊ฒƒ๋ถ€ํ„ฐ n-1์ธ ๊ฒƒ๊นŒ์ง€ ๋ชจ๋‘ ๊ตฌํ•œ๋‹ค.

5 3 B -2 C

A

5 3 B -2 1 C

์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ž˜ํ”„ ๋‚ด์— ์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†์œผ ๋ฏ€๋กœ ์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๎ƒฒ ์ด ๊ทธ๋ž˜ํ”„์— ์žˆ๋Š” ์ •์ 

- 176 -


์˜ ์ˆ˜์ผ ๋•Œ, ์Œ์˜ ์ฃผ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ ๎ƒฒ ๎† ๎€ด ์ด๋‹ค. ์ด๊ฒƒ์€ ๊ฒฝ๋กœ์˜ ๊ธธ์ด ๊ฐ€ ๎ƒฒ ๎† ๎€ด ์„ ๋„˜์œผ๋ฉด ์ด ๊ฒฝ๋กœ์— ๋‘ ๋ฒˆ ์ด์ƒ ํฌํ•จ๋œ ์ •์ ์ด ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ํ•ญ์ƒ ์ด ๊ฒฝ๋กœ๋ณด๋‹ค ๋Š” ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3. โ€“ ๊ณ„์† D

5 -1

3

๊ฒฝ๋กœ์˜ ๊ธธ์ด=3

๊ฒฝ๋กœ์˜ ๊ธธ์ด=1

-2 A

A

B

C

D

E

A

B

C

D

E

0

99

99

99

99

99

99

99

0

99

A

B

C

D

E

A

B

C

D

E

0

5

3

-2

99

99

99

99

0

7

3

B -2

E

๊ฒฝ๋กœ์˜ ๊ธธ์ด=2

-1

C

๊ฒฝ๋กœ์˜ ๊ธธ์ด=4

A

B

C

D

E

A

B

C

D

E

99

99

99

4

99

99

99

99

99

3

A

B

C

D

E

99

1

99

4

2

A

B

C

D

E

99

1

99

4

1

Bellman๊ณผ Ford๊ฐ€ ์ œ์•ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ž˜ํ”„์— ๎ƒฒ ๊ฐœ์˜ ์ •์ ์ด ์žˆ์„ ๋•Œ ์ถœ๋ฐœ ์ •์ ๋ถ€ํ„ฐ ๊ฒฝ๋กœ ๊ฐ€ 1์ธ ๊ฒƒ๋ถ€ํ„ฐ ๎ƒฒ ๎† ๎€ด ๊ฒƒ๊นŒ์ง€ ๋ชจ๋‘ ๊ตฌํ•œ ๋‹ค์Œ ์ด๋“ค์„ ๋น„๊ตํ•˜์—ฌ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค. ์œ„ ์˜ˆ์— ์„œ ์šฐ์„  A๋ฅผ ์ถœ๋ฐœ ์ •์ ์œผ๋กœ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ 1์ธ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๊ฒฝ๋กœ์˜ ๊ธธ์ด ๊ฐ€ 1์ธ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ด ๊ฒฝ๋กœ์˜ ๋ ๊ฒฝ๋กœ์—์„œ ์ง„์ถœํ•˜๋Š” ๊ฐ„์„ ์„ ๊ณ ๋ คํ•˜๋ฉด ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€

2์ธ ๊ฒฝ๋กœ์˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณผ์ •์„ ๎ƒฒ ๎† ๎€ด ์ธ ๊ฒฝ๋กœ์˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๊ตฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3. โ€“ ๊ณ„์† Bellman๊ณผ Bellman๊ณผ Ford ์•Œ๊ณ ๋ฆฌ์ฆ˜ Distk[u]: ์‹œ์ž‘ ์ •์  v์—์„œ u๊นŒ์ง€ ์ตœ๋Œ€ k๊ฐœ์˜ ์•„ํฌ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ Dist k [u] โ† min(Dist k โˆ’1 [ u],min(Dist k โˆ’1 [i ] + weight[ i , u])) D

5 -1

3

3

B -2 C

E

Dist1

A

B

C

D

E

A

0

5

3

-2

99

A

B

C

D

E

B

99

0

99

-1

99

0

5

3

-2

99

C

99

-2

99

99

-1

D

99

99

99

99

3

E

99

99

99

99

99

-2 A

-1

- 177 -

Dist2 ๊ฐ ์ •์ ์˜ ์ง„์ž…์ฐจ์ˆ˜ ๊ณ ๋ ค(์—ด) Dist2[B] = min(5, (3+(-2))=1 Dist2[D] = min(-2, (5+(-1))=-2 Dist2[E] = min(99, min(3+(-1), -2+3))=1


์ œ13์žฅ 2-3 ํŠธ๋ฆฌ, 2-3-4 ํŠธ๋ฆฌ ์ด ์žฅ์—์„œ๋Š” 2-3 ํŠธ๋ฆฌ, 2-3-4 ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค.

13.1. ๊ต์œก๋ชฉํ‘œ ์ด ์žฅ์˜ ๊ต์œก๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ต์œก๋ชฉํ‘œ 2-3 ํŠธ๋ฆฌ 2-3-4 ํŠธ๋ฆฌ 2-3 ํŠธ๋ฆฌ์™€ 2-3-4 ํŠธ๋ฆฌ๋Š” AVL ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ท ํ˜• ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค.

13.2. 2-3 ํŠธ๋ฆฌ AVL ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๊ฑฐ์˜ ์ตœ์†Œ ๋†’์ด์— ๊ฐ€๊น๋„๋ก ์œ ์ง€ํ•ด ์ฃผ์ง€๋งŒ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค. 2-3 ํŠธ๋ฆฌ๋Š” ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์—ฐ์‚ฐ์ด AVL ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๊ฐ€ ๎€ฅ๎€จ๎€  ๎€ต๎ƒฒ ์ธ ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค.

2-3 ํŠธ๋ฆฌ 2-3 ํŠธ๋ฆฌ: ํŠธ๋ฆฌ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠธ๋ฆฌ ์กฐ๊ฑด 1. ๋ชจ๋“  ์ค‘๊ฐ„๋…ธ๋“œ๋“ค์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2 ๋˜๋Š” 3์ด๋‹ค. ์กฐ๊ฑด 2. ๋ชจ๋“  ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ๋ ˆ๋ฒจ ์žˆ๋‹ค. ์กฐ๊ฑด 3. ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ์— ์žˆ๋Š” ํ˜•ํƒœ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์กฑ ์ž์‹์ด ๋‘˜์ธ ๋…ธ๋“œ๋ฅผ 2-๋…ธ๋“œ๋ผ ๋…ธ๋“œ ํ•˜๊ณ , ์ž์‹์ด ์…‹์ธ ๋…ธ๋“œ๋ฅผ 3-๋…ธ๋“œ๋ผ ๋…ธ๋“œ ํ•œ๋‹ค. 2-3 ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ง„ ํŠธ๋ฆฌ๋Š” 2-3 ํŠธ๋ฆฌ์—์„œ 3-๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 2-3 ํŠธ๋ฆฌ๋Š” ๊ฐ™์€ ๋†’์ด์˜ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ฆ‰, ๋†’์ด๊ฐ€ h์ด๋ฉด ์ตœ์†Œํ•œ 2h+1-1 ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. n ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ 2-3 ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ๊ฐ™์€ ๊ฐœ์ˆ˜์˜ ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด์ธ โŽฃโŽข log 2 n โŽฆโŽฅ ๋ณด๋‹ค ํด ์ˆ˜ ์—†๋‹ค.

- 179 -


2-3 ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. z ์ฒซ์งธ, ๋ชจ๋“  ์ค‘๊ฐ„๋…ธ๋“œ๋“ค์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2 ๋˜๋Š” 3์ด๋‹ค. ์ด ๋•Œ ์ž์‹ ์ˆ˜๊ฐ€ 2์ธ ๋…ธ๋“œ๋ฅผ 2-๋…ธ๋“œ ๋ผ ํ•˜๊ณ , ์ž์‹ ์ˆ˜๊ฐ€ 3์ธ ๋…ธ๋“œ๋ฅผ 3-๋…ธ๋“œ๋ผ ํ•œ๋‹ค. 3-๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 2-3 ํŠธ๋ฆฌ ๋Š” ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค. z ๋‘˜์งธ, ๋ชจ๋“  ๋‹จ๋ง๋…ธ๋“œ๋“ค์ด ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์œ„์น˜ํ•œ๋‹ค. z ์…‹์งธ, ์ž์‹ ์ˆ˜๊ฐ€ ๋‘˜์ธ ๊ฒฝ์šฐ์—๋Š” ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฐ’์€ ์™ผ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด ๋‹ค ํฌ๊ณ , ์ค‘๊ฐ„ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ์ž‘์•„์•ผ ํ•œ๋‹ค. ์ž์‹ ์ˆ˜๊ฐ€ ์…‹์ธ ๊ฒฝ์šฐ์— ๋Š” ๋…ธ๋“œ์— ์žˆ๋Š” ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ํฌ๊ณ , ์ค‘๊ฐ„ ๋ถ€๋ถ„ํŠธ ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ์ž‘์•„์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ์— ์žˆ๋Š” ํฐ ๊ฐ’์€ ์ค‘๊ฐ„ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’๋ณด๋‹ค๋Š” ์ž‘์•„์•ผ ํ•œ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด 2-3 ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 2-3 ํŠธ๋ฆฌ์—์„œ 3-๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉด ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๋†’์ด์˜ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” 2-3 ํŠธ๋ฆฌ๊ฐ€ ๋งŽ ์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋†’์ด๊ฐ€ ๎ƒฌ ์ธ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๎€ต๎ƒฌ ๎ˆ ๎€ด ๎† ๎€ด ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๋†’ ์ด๊ฐ€ ๎ƒฌ ์ธ 2-3 ํŠธ๋ฆฌ๋Š” ๎€ต๎ƒฌ ๎ˆ ๎€ด ๎† ๎€ด ๊ฐœ๋ณด๋‹ค๋Š” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด ๎ƒฒ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๋งŒ ๋“ค ์ˆ˜ ์žˆ๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ๎€ฅ๎€จ๎€  ๎€ต๎ƒฒ ์ด๋ฏ€๋กœ ๎ƒฒ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” 2-3 ํŠธ๋ฆฌ ์˜ ๋†’์ด๋Š” ๎€ฅ๎€จ๎€  ๎€ต๎ƒฒ ๋ณด๋‹ค๋Š” ์ž‘๋‹ค.

2-3 ํŠธ๋ฆฌ โ€“ ๊ณ„์† 2-3 ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ S

S

L

empty 2-3 tree

TL

TR

TL < S < TR TL: 2-3 ํŠธ๋ฆฌ TR: 2-3 ํŠธ๋ฆฌ

TL

TM

TR

TL < S < TM TM < L < TR TL: 2-3 ํŠธ๋ฆฌ TM: 2-3 ํŠธ๋ฆฌ TR: 2-3 ํŠธ๋ฆฌ

- 180 -

class Tree23Node{ Object small; Object large; Tree23Node left; Tree23Node mid; Tree23Node right; }


2-3 ํŠธ๋ฆฌ์˜ ์˜ˆ 50

20

10

15

90

65

30

45

55

60

70

75

72

120

80

100

150

์ˆœํšŒ: 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

์ˆœํšŒ: 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

์ˆœํšŒ: ๋‹จ๋ง ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

inorder(left subtree) visit the small item inorder(middle subtree) visit the large item inorder(right subtree)

inorder(left subtree) visit the small item inorder(right subtree)

visit the item(s)

2-3 ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰ 2-3 ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ฐจ์ด์ . ์ฐจ์ด์ . ํ•œ ๋…ธ๋“œ์—์„œ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์ด ๋‘ ๊ฐœ์ผ ์ˆ˜ ์žˆ๋‹ค. 2-3 ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ์ตœ์†Œ ๋†’์ด์˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฏ€๋กœ ๋ณด๋‹ค ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๋…ธ๋“œ์—์„œ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ณด๋‹ค ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฌํ™”/์™„์ „ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ 2-3 ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” ๋” ์ข‹๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ‰๊ท ์ ์œผ๋กœ๋Š” 2-3 ํŠธ๋ฆฌ๊ฐ€ ๋” ์šฐ์ˆ˜ํ•˜๋‹ค. ์šฐ์ˆ˜ํ•˜๋‹ค

2-3 ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ฐจ์ด์ ์€ 3-๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฐ ๋…ธ๋“œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’๊ณผ ๋ชจ๋‘ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด 2-3 ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์†Œ ๋†’์ด์˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ณด๋‹ค๋Š” ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ 2-3 ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰๋ณด๋‹ค ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ๋…ธ ๋“œ์—์„œ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ณด๋‹ค ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฌํ™”/์™„์ „ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ ๋ฆฌ๊ฐ€ ์„ฑ๋Šฅ์€ ๋” ์šฐ์ˆ˜ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์‚ฝ์ž…๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ‰๊ท ์ ์œผ๋กœ๋Š” 2-3 ํŠธ๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด๋‹ค.

- 181 -


2-3 Tree: Search boolean search(Object item){ if(item == null) throw new NullPointerException(โ€œโ€ฆโ€); if(isEmpty()) throw new TreeUnderflowException(โ€œโ€ฆโ€); Comparable o = (Comparable)item; Tree23Node loc = root; while(loc!=null){ int comp = o.compareTo(loc.small); if(comp<0) loc = loc.left; else if(comp==0) return true; if(loc.large==null) loc = loc.middle; else{ comp = o.compareTo(loc.large); if(comp<0) loc = loc.middle; else if(comp==0) return true; else loc = loc.right; } } return false; }

2-3 Tree: Insert 2-3 ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์€ ํ•ญ์ƒ ๋‹จ๋ง ๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋จผ์ € ํ‚ค ๊ฐ’์ด ์‚ฝ์ž…๋  ๋‹จ๋ง๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 2-node์ด๋ฉด ๊ทธ ๋…ธ๋“œ์— ์‚ฝ์ž…ํ•œ๋‹ค. ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 3-node์ด๋ฉด ๋…ธ๋“œ๋ฅผ ๋ถ„ํ• ํ•ด์•ผ ํ•œ๋‹ค. 3-node์— ์žˆ๋˜ ๋‘ ๊ฐœ์˜ ๊ธฐ์กด ํ‚ค ๊ฐ’๊ณผ ์ƒˆ ํ‚ค ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ S, M, L์„ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„ํ• ๋œ๋‹ค. M S

M

L S

L

์ฆ‰, M์€ ๋ถ€๋ชจ ๋…ธ๋“œ์— ์‚ฝ์ž…๋œ๋‹ค. ์ด ๋•Œ ๋ถ€๋ชจ ๋…ธ๋“œ ์—ญ์‹œ 3-node์ด๋ฉด ๋˜ ๋‹ค์‹œ ๋ถ„ํ• ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฃจํŠธ๊ฐ€ ๋ถ„ํ• ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ํ•˜๋‚˜ ์ฆ๊ฐ€ ํ•œ๋‹ค.

2-3 ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ € ํ‚ค ๊ฐ’์ด ์‚ฝ์ž…๋  ๋‹จ๋ง๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์ด ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๋ฉด ์ด ๋…ธ๋“œ์— ํ‚ค ๊ฐ’์„ ์  ์ ˆํ•˜๊ฒŒ ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ์‚ฝ์ž…์ด ์™„๋ฃŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ด๋ฉด ์ด ๋…ธ๋“œ์— ์‚ฝ์ž…ํ•  ๊ณต ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ ์ด ๋…ธ๋“œ๋ฅผ ๋ถ„ํ• ํ•ด์•ผ ํ•œ๋‹ค. ๋…ธ๋“œ์˜ ๋ถ„ํ• ์€ ๊ธฐ์กด์˜ ๋…ธ๋“œ์— ์žˆ๋˜ ๋‘ ๊ฐœ์˜ ๊ฐ’๊ณผ ์ƒˆ ๊ฐ’์„ ์ •๋ ฌํ•˜์—ฌ ๊ทธ ์ค‘์— ์ค‘๊ฐ„ ๊ฐ’์„ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ๋‘ ๊ฐœ์˜ ๊ฐ’์€ ๊ธฐ์กด ๋…ธ๋“œ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ค‘๊ฐ„ ๊ฐ’์„ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•  ๋•Œ ๋ถ€๋ชจ๋…ธ๋“œ ์—ญ์‹œ 3-๋…ธ๋“œ์ด๋ฉด ์ด ๋…ธ๋“œ ์—ญ์‹œ ๋ถ„ํ• ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฃจํŠธ๊ฐ€ ๋ถ„ํ• ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

- 182 -


2-3 Tree: Insert โ€“ ๊ณ„์† ๋…ธ๋“œ๊ฐ€ ๋ถ„ํ• ๋˜์—ˆ์„ ๋•Œ ๊ทธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ 2-node์ธ ๊ฒฝ์šฐ SP

case i-1. M

SP

Z

M

S S

Z

L

L SP

case i-2. SP A

M

M A S

L

S

L

2-3 Tree: Insert โ€“ ๊ณ„์† ๋…ธ๋“œ๊ฐ€ ๋ถ„ํ• ๋˜์—ˆ์„ ๋•Œ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ 3-node์ธ ๊ฒฝ์šฐ SP

LP

2

1

M

SP

1

LP

SP

2

M

1

LP

2

M

case i-4. S

case i-3.

L

S

SP

LP

L

S

M

M

S

case i-5.

L

1

LP

SP

2

1

LP

S

L

L

SP

2

1

M

2

S

L

2-3 ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ์˜ ๋ถ„ํ• ์€ ํฌ๊ฒŒ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ฒŒ๋Š” ๋ถ„ ํ• ๋˜์—ˆ์„ ๋•Œ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์™€ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

- 183 -


2-3 Tree: Insert โ€“ ๊ณ„์† 50 50

50

50

90

split ํ•„์š” 20

30

90

20

50

30

30

20 30 40

90

50

30

90

50

split ํ•„์š” 20

40

90

20

40

60

90

20

40

60 80 90

50 30

20

80

40

60

90

2-3 Tree: Delete 2-3 ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋Š” ๋จผ์ € ์‚ญ์ œํ•  ๊ฐ’์ด ํฌํ•จ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ทธ ๊ฐ’๊ณผ ๊ทธ๊ฒƒ์˜ ์ค‘์œ„ ์ˆœ์œ„ ์ƒ์—์„œ ๋ฐ”๋กœ ์•ž ๊ฐ’์„ ๊ตํ™˜ํ•œ๋‹ค. ์ด ๊ฐ’์€ ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์— ์žˆ๋‹ค. ๋‹จ๋ง ๋…ธ๋“œ์—์„œ ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค. ์ด ๋•Œ ์ด ๋…ธ๋“œ์— ์ œ๊ฑฐํ•  ๊ฐ’ ์™ธ์— ๋‹ค๋ฅธ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ์‚ญ์ œ๋Š” ์ข…๋ฃŒ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์œ ์ผํ•œ ๊ฐ’์ด๋ฉด ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. 50

20

10

15

90

65

30

45

55

60

70

75

72

120

80

100

150

2-3 ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ญ์ œํ•  ๊ฐ’์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’ ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„ ๊ทธ ๊ฐ’๊ณผ ๊ต์ฒดํ•œ ๋‹ค์Œ์— ์‹ค์ œ ์‚ญ์ œ๋Š” ๊ต์ฒดํ•œ ๊ฐ’์ด ์žˆ๋Š” ๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์‚ญ์ œ๋Š” ์‹ค์ œ ๋‹จ๋ง๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด ์ง„๋‹ค. ์‚ญ์ œํ•  ๊ฐ’์ด ์žˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ด๋ฉด ๊ทธ ๊ฐ’์„ ๋…ธ๋“œ์—์„œ ์‚ญ์ œํ•จ์œผ๋กœ์จ ์‚ญ์ œ๋Š” ์ข… ๋ฃŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ผ ๋•Œ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋ฉด ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š”

2-3 ํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์„ ์œ ์ง€ํ•˜๋„๋ก ํ˜•์ œ๋…ธ๋“œ์™€ ๋ถ€๋ชจ๋…ธ๋“œ๋“ค์˜ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

- 184 -


2-3 Tree: Delete โ€“ ๊ณ„์† ๋‹จ๋ง๋…ธ๋“œ์— ์žˆ๋Š” ๊ฐ’์„ ์ œ๊ฑฐํ•˜์˜€์„ ๋•Œ ๊ทธ ๋…ธ๋“œ์— ๋” ์ด์ƒ ๊ฐ’์ด ์—†์œผ๋ฉด ๋จผ์ € ํ˜•์ œ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ˜•์ œ ์ค‘ 3-node๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ์žฌ๋ถ„๋ฐฐํ•œ๋‹ค. ํ•ญ์ƒ ์™ผ์ชฝ ํ˜•์ œ๋ฅผ ๋จผ์ € ์ด์šฉํ•œ๋‹ค. 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ถ€๋ชจ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฐ’์„ ์•„๋ž˜๋กœ ๋‚ด๋ ค ์ธ์ ‘ ํ˜•์ œ ๋…ธ๋“œ๋“ค์„ ๊ฒฐํ•ฉํ•œ๋‹ค. ์ด ๋•Œ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 2-node์ด๋ฉด ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณต ์ ์šฉํ•œ๋‹ค. ๊ฒฝ์šฐ 1. ๋ถ€๋ชจ๊ฐ€ 2-node ๊ฒฝ์šฐ 1-1, 1-2: 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ์šฐ 1-3, 1-4: 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฝ์šฐ 2. ๋ถ€๋ชจ๊ฐ€ 3-node ๊ฒฝ์šฐ 2-1(a), 2-1(b), 2-1(c): ์™ผ์ชฝ ๊ฒฝ์šฐ 2-2(a), 2-2(b), 2-2(c): ์ค‘๊ฐ„ ๊ฒฝ์šฐ 2-3(a), 2-3(b), 2-3(c): ์˜ค๋ฅธ์ชฝ c๋Š” 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

์‚ญ์ œํ•  ๊ฐ’์ด ์žˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๋ฉด ์šฐ์„  ํ˜•์ œ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ˜•์ œ๋…ธ๋“œ ์ค‘์— 3-๋…ธ๋“œ ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ์žฌ๋ถ„๋ฐฐํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ˜•์ œ๋…ธ๋“œ ์ค‘์— 3-๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ถ€ ๋ชจ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋‚ด๋ฆฌ๊ณ  ์ธ์ ‘ ํ˜•์ œ๋…ธ๋“œ์™€ ๊ฒฐํ•ฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๋ฉด ์ด ๊ณผ ์ •์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฒฐ๊ตญ ๋ฃจํŠธ์˜ ์žˆ๋Š” ๊ฐ’์„ ๋‚ด๋ฆฌ๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ํ•˜๋‚˜ ๊ฐ์†Œํ•˜ ๊ฒŒ ๋œ๋‹ค.

2-3 Tree: Delete โ€“ ๊ณ„์† ๊ฒฝ์šฐ 1-1, 1-2: 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ P S

L

1

3

2

P

L S

4

1

-

P 2

3

4

S S

L

2

1

P 4

3

1

L 2

3

4

๊ฒฝ์šฐ 1-3, 1-4: 3-node์ธ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ -

P S 1

2

3

S P 1

2

-

P 3

1

S 2

P 3

1

S 2

3

์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” ์‚ญ์ œ์˜ ๊ฒฐ๊ณผ๋กœ ๋…ธ๋“œ๊ฐ€ ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ ์ธ ๊ฒฝ์šฐ์— ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ์ผ ์ˆ˜ ์žˆ๊ณ , ์ด ๊ฒฝ์šฐ์—๋Š” ์ˆซ์ž๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋‹จ๋ง๋…ธ๋“œ๋“ค์€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ํ˜•์ œ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ ์ด๊ณ  ๋ถ€๋ชจ๋…ธ๋“œ๋„ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” ์‚ญ์ œ ๊ฒฐ๊ณผ ๋ถ€๋ชจ๋…ธ๋“œ๋„ ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

- 185 -


-

1

S

L

A

B

2

1

2

1

2

3

3

4

C

5

6

1

2

3

A

C

4

S

5

1

4

3

-

3

4

3

1

4

2

C

3

4

5

4

1

5

B

2

B

3

B

6

S

2

1

3

4

C

A

L

3

4

5

6

S -

4

L

2

1

L

A

B

C

A

-

S

A

2

C

L

B

L

B

2

S

S

B

L

L

3

1

4

S

L

B

A

C

A

A

2

1

B

S

-

B

L

A

S

L

S

C

4

3

S

-

A

A

5

B 2

1

3

L

4

5

์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” ์‚ญ์ œ์˜ ๊ฒฐ๊ณผ ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋˜๋Š” ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์— ์‚ญ์ œ ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” ์ด ์—ฌ์„ฏ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ์ด ์™ธ์— ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์ค‘๊ฐ„์ž์‹์ธ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ์ด ์Šฌ๋ผ์ด๋“œ์— ์ƒ๋žต๋˜์–ด ์žˆ๋‹ค. ๋นˆ ๋…ธ๋“œ์˜ ํ˜• ์ œ๋…ธ๋“œ ์ค‘์— 3-๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ด๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ’๋“ค์„ ์žฌ๋ถ„๋ฐฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋‘ ๊ฐœ์˜ ํ˜•์ œ๋…ธ๋“œ ๊ฐ€ ๋ชจ๋‘ 3-๋…ธ๋“œ์ด๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๋ž€ ๊ฐ€์žฅ ์™ผ์ชฝ ์— ์žˆ๋Š” ํ˜•์ œ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋…ธ๋“œ์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋งํ•œ๋‹ค.

2-3 ํŠธ๋ฆฌ์˜ ๊ตฌํ˜„๋„ AVL ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ญ์ œํ•  ๊ฐ’์„ ์ฐพ์•„๊ฐ€๊ฑฐ๋‚˜ ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๊ฐˆ ๋•Œ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ๋ถ€ํ„ฐ ๋‹จ๋ง๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ์Šคํƒ์— pushํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ด ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ถ„ํ•  ๋˜๋Š” ์‚ญ์ œ์‹œ ํ•„์š”ํ•œ ์žฌ์กฐ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

13.3. 2-3-4 ํŠธ๋ฆฌ

2-3-4 ํŠธ๋ฆฌ 2-3-4 ํŠธ๋ฆฌ: ๋ชจ๋“  ์ค‘๊ฐ„๋…ธ๋“œ๋“ค์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2, 3, 4์ด๊ณ , ๋ชจ๋“  ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ํŠธ๋ฆฌ์ด๋‹ค. S

S

L

S

M

L

empty 2-3-4 tree

TL

TR

TL < S < TR TL: 2-3-4 ํŠธ๋ฆฌ TR: 2-3-4 ํŠธ๋ฆฌ

TL

TM

TL < S < TM TM < L < TR TL, TM, TR: 2-3-4 ํŠธ๋ฆฌ

TR

TL

TML TMR

TR

TL < S < TML TML < M < TMR TMR < L < TR TL, TML, TML, TR: 2-3-4 ํŠธ๋ฆฌ

2-3-4 ํŠธ๋ฆฌ๋Š” 2-3 ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•˜์—ฌ 2-๋…ธ๋“œ, 3-๋…ธ๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ 4-๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ

- 186 -


๋ฆฌ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ 2-3 ํŠธ๋ฆฌ๋Š” ํ•œ ๋…ธ๋“œ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค ๋‹ค์–‘ํ•œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ‰์ธ๊ตฌ์กฐ๋Š” ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œ ๋…ธ๋“œ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ๊ฐ์†Œํ•œ๋‹ค. ๋˜ํ•œ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๊ฐ์†Œํ•˜๋ฉด ํ• ์ˆ˜๋ก ๊ฒ€์ƒ‰์€ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ํ•œ ๋…ธ๋“œ์—์„œ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ’๋“ค์ด ๋…ธ๋“œ์— ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋˜๋ฏ€๋กœ ๋…ธ๋“œ ๋‚ด์—์„œ ๋น„๊ต๋Š” ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜๋„ ์žˆ ๋‹ค.

2-3-4 ํŠธ๋ฆฌ์˜ ์˜ˆ 50

30

15

20

65 75 90

55

45

60

70

72

์ˆœํšŒ: 4-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

100 120 150

80

์ˆœํšŒ: 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋‹จ๋ง ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ร† 2-3 ํŠธ๋ฆฌ์™€ ๋™์ผ

inorder(left subtree) visit the small item inorder(middle left subtree) visit the middle item inorder(middle right subtree) visit the large item inorder(right subtree)

2-3-4 ํŠธ๋ฆฌ: ์‚ฝ์ž… 2-3-4 ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์€ ํ•ญ์ƒ ๋‹จ๋ง ๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋™์•ˆ 4-๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋จผ์ € ๋ถ„ํ• ํ•œ๋‹ค. insert(15) insert(20) insert(90)

insert(50) 40 10 40

40

40

80

10

80

10

50

80

10 15 20

50 80 90

insert(70)

insert(60) 40

10 15 20

80

50

40

90

10 15 20

80

50

40

60

90

10 15 20

80

50 60 70

90

2-3-4 ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์€ 2-3 ํŠธ๋ฆฌ์™€ ์œ ์‚ฌํ•˜๋‹ค. ์ฐจ์ด์ ์€ 2-3-4 ํŠธ๋ฆฌ์—์„œ๋Š” ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ ์•„๊ฐ€๋Š” ๋™์•ˆ 4-๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋จผ์ € ๋ถ„ํ• ํ•œ๋‹ค. ์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ ์ฒ˜์Œ 3๊ฐœ์˜ ๊ฐ’์ด ์‚ฝ์ž…๋˜๋ฉด ํŠธ๋ฆฌ์— ์žˆ๋Š” ์œ ์ผ ๋…ธ๋“œ๊ฐ€ 4-๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•˜๋ฉด ์ด ๋…ธ๋“œ ๊ฐ€ ๋จผ์ € ๋ถ„ํ• ๋œ๋‹ค. 4-๋…ธ๋“œ๊ฐ€ ๋ถ„ํ• ๋  ๋•Œ์—๋Š” ์ค‘๊ฐ„๊ฐ’์ด ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ์™ผ์ชฝ๊ฐ’์œผ๋กœ๋งŒ ๊ตฌ ์„ฑ๋œ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ๊ฐ’์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋…ธ๋“œ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง„๋‹ค.

- 187 -


2-3-4 ํŠธ๋ฆฌ: ์‚ฝ์ž… ์˜ˆ insert(65) 40 60 80

10 15 20

50

70

40 60 80

90

10 15 20

50

65

70

60

90

60

insert(55) 40

10 15 20

80

50

65

70

40

10 15 20

90

80

50

55

65

70

90

รš Splitํ•  ๋•Œ์—๋Š” ํ•ญ์ƒ ์ค‘๊ฐ„ ๊ฐ’์ด ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

2-3-4 ํŠธ๋ฆฌ: ์‚ญ์ œ 2-3-4 ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋Š” ๋จผ์ € ์‚ญ์ œํ•  ๊ฐ’์ด ํฌํ•จ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ทธ ๊ฐ’๊ณผ ๊ทธ๊ฒƒ์˜ ์ค‘์œ„ ์ˆœ์œ„ ์ƒ์—์„œ ๋ฐ”๋กœ ์•ž ๊ฐ’์„ ๊ตํ™˜ํ•œ๋‹ค. ์ด ๊ฐ’์€ ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์— ์žˆ๋‹ค. ์ฆ‰, ์ œ๊ฑฐ๋Š” ํ•ญ์ƒ ๋‹จ๋ง๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•œ๋‹ค. ์ด ๋•Œ ์ด ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ์ด๋ฉด ๊ฐ’์„ ์ œ๊ฑฐํ•œ ๋‹ค์Œ์— ์ข…๋ฃŒํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ด ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ์‚ญ์ œํ•  ๊ฐ’์ด ํฌํ•จ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๋ชจ๋“  2-๋…ธ๋“œ๋ฅผ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ๋กœ ๋ฐ”๊พผ๋‹ค. split์˜ ๋ฐ˜๋Œ€ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ์ œ๊ฑฐ๋Š” ํ•œ ํŒจ์Šค์— ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

2-3-4 ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋„ 2-3 ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ญ์ œํ•  ๊ฐ’์ด ํฌํ•จ๋œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์ฐพ์•„์•ผ ํ•˜ ๋ฉฐ, ์ด ๋…ธ๋“œ๊ฐ€ ์ค‘๊ฐ„๋…ธ๋“œ์ด๋”๋ผ๋„ 2-3 ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฒฐ๊ตญ์— ์‚ญ์ œ๋Š” ๋‹จ๋ง๋…ธ๋“œ์—์„œ ์ด๋ฃจ ์–ด์ง„๋‹ค. ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ์ด๋ฉด ๊ฐ’์„ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ์‚ญ์ œ๋Š” ์™„ ๋ฃŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๋ฉด ๋นˆ ๋…ธ๋“œ๊ฐ€ ๋˜๋ฏ€๋กœ 2-3 ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ ๊ฐ€์ง€๋กœ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค. ๋ณด๋‹ค ์‚ญ์ œ๋ฅผ ์ˆ˜์›”ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 2-3-4 ํŠธ๋ฆฌ์—์„œ๋Š” ์‚ฝ์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๋ชจ๋“  2-๋…ธ๋“œ๋ฅผ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ๋ฅผ ๋ฏธ ๋ฆฌ ๋ฐ”๊พผ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ญ์ œํ•  ๋‹จ๋ง๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋Š” ํ•ญ์ƒ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ๊ฐ€ ๋˜๋ฏ€๋กœ ์‚ญ์ œ์— ๋”ฐ๋ผ ์—ฐ์‡„์ ์œผ๋กœ ๋ฃจํŠธ๊นŒ์ง€ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

- 188 -


2-3-4 ํŠธ๋ฆฌ: ์‚ญ์ œ โ€“ ๊ณ„์† 2-๋…ธ๋“œ๋ฅผ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ• ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ P์ด๊ณ  ์‚ญ์ œํ•  ๊ฐ’์ด ์žˆ๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋‹ค์Œ ์ž์‹ ๋…ธ๋“œ๋ฅผ C๋ผ ํ•˜๊ณ , C์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๋ฅผ R์ด๋ผ ํ•˜์ž. P

P R

P

20

40

R R

C

40

?

C

10

20

40

R 10

?

C

?

15

20 30

40

?

20

30

R

C

15

10

30

30

C

10

2-3-4 ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋ฅผ ํ•  ๋•Œ ๋จผ์ € ๋ฃจํŠธ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ ์‚ญ์ œํ•  ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด ๋•Œ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ P๋ผ ํ•˜๊ณ  ์ฐพ์•„๊ฐˆ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” P์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ C๋ผ ํ•˜์ž. C ๋…ธ๋“œ๊ฐ€

2-๋…ธ๋“œ์ด๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ‘ํ•ฉ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๋ž€ 2-3 ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ ๊ฐœ๋…๊ณผ ๊ฐ™๋‹ค. ์ฒซ์งธ, P๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” P, C, ๊ทธ๋ฆฌ๊ณ  C์˜ ํ˜•์ œ๋…ธ๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์–ด 4-๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ๋‘˜์งธ, P๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” C๋Š” P ๋…ธ๋“œ์˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๊ณผ ํ˜•์ œ๋…ธ๋“œ๋ฅผ ํ•จ๊ป˜ ๋ณ‘ํ•ฉํ•˜์—ฌ 4๋…ธ๋“œ๊ฐ€ ๋˜๊ณ , P ๋…ธ๋“œ๋Š” 2-๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

C ๋…ธ๋“œ๊ฐ€ 2-๋…ธ๋“œ์ด๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ ๋˜๋Š” 4-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ‘ ํ•ฉ๋œ๋‹ค. ํ˜•์ œ๋…ธ๋“œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๊ฐ€ P ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ  P ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฐ’์ด C ๋…ธ๋“œ๋กœ ๋‚ด๋ ค C ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

2-3-4 ํŠธ๋ฆฌ: ์‚ญ์ œ ์˜ˆ 60

40 60 80 delete(55)

40

80 10 15 20

50

65

70

90

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. 10 15 20

50

delete(50)

55

65

70

90

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜•์ œ ๋…ธ๋“œ๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ž์‹ ์˜ ์™ผ์ชฝ ํ˜•์ œ๋ฅผ ๋งํ•˜๋ฉฐ, ๊ฐ€์žฅ ์™ผ์ชฝ ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋ฅผ ๋งํ•œ๋‹ค.

20 60 80 20 60 80

10

15

40

50

65

70

90 10

- 189 -

15

40

65

70

90


2-3-4 ํŠธ๋ฆฌ: ์‚ญ์ œ ์˜ˆ โ€“ ๊ณ„์† delete(65)

delete(60)

20 60 80

10

15

40

70

10

20 15

10

40

70

10

15

delete(90)

15 40 80

delete(40)

90

90

20 60 80

40

15

10

20

90

10

40

15

70 80 90

20

70

70

15 40 80

10

20

20

60 40

70

20

80

10 15 40

70

80 20

70

- 190 -

80

10

15

70

80

90


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.