Search

์ธํ„ฐํ”„๋ฆฌํ„ฐ ํŒจํ„ด

์ธํ„ฐํ”„๋ฆฌํ„ฐ ํŒจํ„ด (Interpreter Pattern)

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

์ฃผ์š” ๋ชฉ์ 

โ€ข
ํŠน์ • ์–ธ์–ด๋‚˜ ํ‘œํ˜„์‹์˜ ๋ฌธ๋ฒ•์„ ์ •์˜ํ•˜๊ณ  ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต
โ€ข
๋ฌธ๋ฒ• ๊ทœ์น™์„ ํด๋ž˜์Šค ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
โ€ข
๋ณต์žกํ•œ ํ•ด์„ ๋กœ์ง์„ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ

ํŠน์ง•

โ€ข
๊ฐ ๋ฌธ๋ฒ• ๊ทœ์น™์ด ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋จ
โ€ข
์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• ๊ทœ์น™ ์ถ”๊ฐ€๊ฐ€ ์šฉ์ดํ•จ
โ€ข
๋ฌธ๋ฒ•์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ํด๋ž˜์Šค ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์Œ
โ€ข
์ฃผ๋กœ ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ• ํ•ด์„์— ์ ํ•ฉ

์˜ˆ์‹œ ์ฝ”๋“œ

// Abstract Expression interface Expression { int interpret(); } // Terminal Expression class NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } public int interpret() { return number; } } // Non-terminal Expression class AddExpression implements Expression { private Expression left; private Expression right; public AddExpression(Expression left, Expression right) { this.left = left; this.right = right; } public int interpret() { return left.interpret() + right.interpret(); } }
Java
๋ณต์‚ฌ

ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹

๊ธฐ๋ณธ์ ์ธ ํ‘œํ˜„์‹์œผ๋กœ, ๋” ์ด์ƒ ํ•ด์„ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฐ’์ด๋‚˜ ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋น„ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹

๋‹ค๋ฅธ ํ‘œํ˜„์‹์„ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ‘œํ˜„์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
โ€ข
ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹ (NumberExpression): ์‹ค์ œ ๊ฐ’(์ˆซ์ž)์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์„์ด ๋๋‚œ ์ƒํƒœ์—์„œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋„Œํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹ (AddExpression): ๋‹ค๋ฅธ ํ‘œํ˜„์‹๋“ค์„ ๋ฐ›์•„์„œ ๊ทธ๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ณตํ•ฉ์ ์ธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. AddExpression์€ ๋‘ ๊ฐœ์˜ ํ‘œํ˜„์‹์ด๋ฏ€๋กœ, ์ด๋“ค์„ ํ•ด์„ํ•˜์—ฌ ๊ทธ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํ•œ ์ˆ˜์‹ ํ•ด์„๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
โ€ข
Expression ์ธํ„ฐํŽ˜์ด์Šค: ๋ชจ๋“  ํ‘œํ˜„์‹์ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. interpret() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
NumberExpression ํด๋ž˜์Šค: ์ˆซ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ €์žฅ๋œ ์ˆซ์ž๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
AddExpression ํด๋ž˜์Šค: ๋ง์…ˆ ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋น„ํ„ฐ๋ฏธ๋„ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์ขŒํ•ญ๊ณผ ์šฐํ•ญ์˜ interpret() ๊ฒฐ๊ณผ๋ฅผ ๋”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด "3 + 4"์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ˆ˜์‹์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Expression three = new NumberExpression(3); Expression four = new NumberExpression(4); Expression add = new AddExpression(three, four); System.out.println(add.interpret()); // ์ถœ๋ ฅ: 7
Java
๋ณต์‚ฌ