Composite Pattern

Lee Gayoungยท2022๋…„ 10์›” 7์ผ
0

UMC 3๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
10/10

๐ŸŒŸ Composite Pattern?

์ปดํฌ์ง€ํŠธ ํŒจํ„ด์€ ๊ตฌ์กฐ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณตํ•ฉ ๊ฐ์ฒด(group of object) ๋‚˜ ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค. ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ถ€๋ถ„-์ „์ฒด(whole-part) ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

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

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

๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด, ์ปดํฌ์ง€ํŠธ ํŒจํ„ด์€ ์ž‘์€ ๊ฐ์ฒด๋“ค์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ ํ˜•ํƒœ๋กœ ์—ฎ์–ด์„œ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ด๋‹ค.

  • Component : ๋ชจ๋“  component ๋“ค์„ ์œ„ํ•œ ์ถ”์ƒํ™”๋œ ๊ฐœ๋…์œผ๋กœ์จ, Leaf ํด๋ž˜์Šค์™€ Composite ํด๋ž˜์Šค์— ๊ณตํ†ต์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋˜ํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผ, ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธํ•œ๋‹ค.

  • Leaf : Composite ๊ฐ์ฒด์˜ ๋ถ€ํ’ˆ์œผ๋กœ ์„ค์ •๋œ๋‹ค. Leaf์—๋Š” ์ž์‹์ด ์—†๊ณ  ์ปดํฌ์ง€์…˜์˜ ๊ฐ์ฒด ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋“ค์„ ์Œ“์•„์„œ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ๋ฌผ์„ ๋งŒ๋“ ๋‹ค.

  • Composite : ๋ณต์ˆ˜ ๊ฐœ์˜ Component๋ฅผ ๊ฐ–๋„๋ก ์ •์˜๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ณต์ˆ˜ ๊ฐœ์˜ Leaf, ์‹ฌ์ง€์–ด ๋ณต์ˆ˜ ๊ฐœ์˜ Composite ๊ฐ์ฒด๋ฅผ ๋ถ€๋ถ„์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ž์‹์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘ ์ •์˜ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ž์‹ ๊ด€๋ จ ์ž‘์—… ๊ตฌํ˜„ํ•œ๋‹ค. ์ฆ‰, Composite ํด๋ž˜์Šค๋Š” Component ๊ฐ์ฒด ์ž์‹๋“ค์„ ์œ ์ง€ํ•˜๋ฉฐ operation() ๊ณผ ๊ฐ™์€ ์š”์ฒญ์„ ํ†ตํ•ดย ์ž์‹๋“ค์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž : ์ปดํฌ๋„ŒํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ปดํฌ์ง€์…˜์˜ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค.
    โ€‹

โœจ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ ์˜ˆ์‹œ โœจ


์‚ฌ์šฉ์ž๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ์ตœ์ƒ๋‹จ์— ์กด์žฌํ•˜๋Š” "Composite1"์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด "Component" ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋“ค์€ย ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ† ๋Œ€๋กœ ์œ„์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋ชจ๋“  ์ž์‹ ์š”์†Œ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋Ÿฐํƒ€์ž„์—์„œ ์ผ์–ด๋‚˜๋Š” ํ–‰์œ„๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

โ€‹

๐ŸŒŸ Composite Pattern์˜ ์‚ฌ์šฉ

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

  • ์ปดํฌ์ง€ํŠธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ 
    1. ๊ฐ์ฒด ์ˆ˜๊ฐ€ ์ ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„๊ณ  OutOfMemoryError ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•จ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

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

โœ… ํƒ€์ž… ์‹œ์Šคํ…œ
ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์˜ โ€˜์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘โ€™์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฃผ์„์ด๋‚˜ ๋ณ€์ˆ˜๋ช…๊ณผ ๋‹ค๋ฅด๊ฒŒ ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ค์ œ ๋™์ž‘๊ณผ ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ์œผ๋กœ ๋™๋–จ์–ด์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค. ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ํƒ€์ž…์„ ์ด์šฉํ•ด ๊ธฐ์ˆ ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์—ฌ๋Ÿฌ ์˜๋„๊ฐ€ ๋ง์ด ๋˜๋Š”์ง€, ์„œ๋กœ ๋ชจ์ˆœ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ(type check)๋ฅผ ํ•˜๋Š” ๊ฒ€์‚ฌ์›์ด๋‹ค.
ex) TypeError: "x" is not a function

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

โ€‹

๐ŸŒฑ ์ฐธ๊ณ  ์ž๋ฃŒ

  1. ๋””์ž์ธ ํŒจํ„ด - ์ปดํผ์ง€ํŠธ ํŒจํ„ด (Composite Pattern)
  2. ์ปดํฌ์ง€ํŠธ ํŒจํ„ด(Composite pattern)์ด๋ž€?
  3. ์ปดํฌ์ง€ํŠธ ํŒจํ„ด(Composite Pattern) :: ๋งˆ์ด๊ตฌ๋ฏธ
  4. ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ : ์—ฐ์žฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ
  5. ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ณด๋‹ค๋Š” ์ปดํŒŒ์ผ์ด๋‚˜ ๋งํฌ ํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋‚ซ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€