๐Ÿ“• [Object] 1์žฅ. ๊ฐ์ฒด, ์„ค๊ณ„

๋ฐ•์ƒ๋ฏผยท2024๋…„ 2์›” 21์ผ

Book

๋ชฉ๋ก ๋ณด๊ธฐ
7/22
post-thumbnail

๐Ÿ“Œ 1. ํ‹ฐ์ผ“ ํŒ๋งค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž‘์€ ์†Œ๊ทน์žฅ์„ ๊ฒฝ์˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

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

ํ˜„์žฌ์˜ ํ‹ฐ์ผ“ ํŒ๋งค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ด๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค.

๊ตฌํ˜„ํ•  ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ


์šฐ์„  ์ ˆ์ฐจ ์ง€ํ–ฅ ๋ฐฉ์‹์˜ Theater๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public class Theater {
    private TicketSeller ticketSeller;

    public Theater(TicketSeller ticketSeller) {
        this.ticketSeller = ticketSeller;
    }

    public void enter(Audience audience) {
        if (audience.getBag().hasInvitation()) {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket(); // ํŒ๋งค์›, ๊ด€๊ฐ ๊ฐ์ฒด์˜ ์ž์œจ์„ฑ ๋‚ฎ์Œ
            audience.getBag().setTicket(ticket);
        } else {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket(); 
            audience.getBag().minusAmount(ticket.getFee());

                        ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
            audience.getBag().setTicket(ticket);
        }
    }
}

ํ•œ ๋ˆˆ์— ๋ด๋„ ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ์ด๋‹ค.

์ด ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โœ”๏ธŽ ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ?

๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด(Robert Martin)์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์ด ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๊ด€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

  1. ๋ชจ๋“ˆ์€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
    2. ๋ณ€๊ฒฝ์— ์šฉ์ดํ•ด์•ผ ํ•œ๋‹ค.
  2. ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค.

์œ„ ์ฝ”๋“œ๋Š” ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์˜ค๋ฅ˜ ์—†์ด ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ์ œ๋Œ€๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ ๋˜ํ•œ ๋งŒ์กฑํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด๊ฐ€?
์•„๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

  • ์˜ˆ์ƒ์„ ๋น—๋‚˜๊ฐ„๋‹ค.
  • ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋‹ค.

Theater ํด๋ž˜์Šค์˜ enter ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ์„ ๋ง๋กœ ํ’€์–ด๋ณด์ž.

์†Œ๊ทน์žฅ์€ ๊ด€๋žŒ๊ฐ์˜ ๊ฐ€๋ฐฉ์„ ์—ด์–ด ๊ทธ ์•ˆ์— ์ดˆ๋Œ€์žฅ์ด ๋“ค์–ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. ๊ฐ€๋ฐฉ ์•ˆ์— ์ดˆ๋Œ€์žฅ์ด ๋“ค์–ด ์žˆ์œผ๋ฉด ํŒ๋งค์›์€ ๋งคํ‘œ์†Œ์— ๋ณด๊ด€๋ผ ์žˆ๋Š” ํ‹ฐ์ผ“์„ ๊ด€๋žŒ๊ฐ์˜ ๊ฐ€๋ฐฉ ์•ˆ์œผ๋กœ ์˜ฎ๊ธด๋‹ค. ๊ฐ€๋ฐฉ ์•ˆ์— ์ดˆ๋Œ€์žฅ์ด ๋“ค์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ด€๋žŒ๊ฐ์˜ ๊ฐ€๋ฐฉ์—์„œ ํ‹ฐ์ผ“ ๊ธˆ์•ก๋งŒํผ์˜ ํ˜„๊ธˆ์„ ๊บผ๋‚ด ๋งคํ‘œ์†Œ์— ์ ๋ฆฝํ•œ ํ›„์— ใ…๋งคํ‘œ์†Œ์— ๋ณด๊ด€๋ผ ์žˆ๋Š” ํ‹ฐ์ผ“์„ ๊ด€๋žŒ๊ฐ์˜ ๊ฐ€๋ฐฉ ์•ˆ์œผ๋กœ ์˜ฎ๊ธด๋‹ค.

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ?
๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ๊ด€๋žŒ๊ฐ๊ณผ ํŒ๋งค์›์ด ์†Œ๊ทน์žฅ์˜ ํ†ต์ œ๋ฅผ ๋ฐ›๋Š” ์ˆ˜๋™์ ์ธ ์กด์žฌ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ๋“ค์„ ํ•œ ๋ฒˆ์— ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์•ž์œผ๋กœ ๋Œ์•„๊ฐ€ Theater์˜ enter ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์ž.

public void enter(Audience audience) {
        if (audience.getBag().hasInvitation()) {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket(); // ํŒ๋งค์›, ๊ด€๊ฐ ๊ฐ์ฒด์˜ ์ž์œจ์„ฑ ๋‚ฎ์Œ
            audience.getBag().setTicket(ticket);
        } else {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket(); 
            audience.getBag().minusAmount(ticket.getFee());

                        ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
            audience.getBag().setTicket(ticket);
        }
    }

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Audience๊ฐ€ Bag๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , Bag ์•ˆ์—๋Š” ํ˜„๊ธˆ๊ณผ ํ‹ฐ์ผ“์ด ๋“ค์–ด ์žˆ์œผ๋ฉฐ TicketSeller๊ฐ€ TicekOffice์—์„œ ํ‹ฐ์ผ“์„ ํŒ๋งคํ•˜๊ณ , TicketOffice ์•ˆ์— ๋ˆ๊ณผ ํ‹ฐ์ผ“์ด ๋ณด๊ด€๋ผ ์žˆ๋‹ค๋Š” ๋ชจ๋“  ์‚ฌ์‹ค์„ ๋™์‹œ์— ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค or ๋ฉ”์„œ๋“œ์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋ฅด ์ฝ๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ ๋ชจ๋‘์—๊ฒŒ ํฐ ๋ถ€๋‹ด์„ ์ค€๋‹ค.

ํ•˜์ง€๋งŒ ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค
Audience์™€ TicketSeller๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ Theater๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

โœ”๏ธŽ ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ์ฝ”๋“œ

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

Audience ํด๋ž˜์Šค์—์„œ Bag์„ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Audience์˜ Bag์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” Theater์˜ enter ๋ฉ”์„œ๋“œ ์—ญ์‹œ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋‹ค๋ฅธ Class๊ฐ€ Audience์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•˜์—ฌ ๋” ๋งŽ์ด ์•Œ๋ฉด ์•Œ์ˆ˜๋ก Audience์˜ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ ์ง„๋‹ค.

์ด๊ฒƒ์ด ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ(dependency)์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ด๋‹ค.
์˜์กด์„ฑ์ด๋ผ๋Š” ๋ง ๋‚ด๋ถ€์—๋Š” ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๊ทธ ๊ฐ์ฒด์—๊ฒŒ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋‚ดํฌ๋˜์–ด ์žˆ๋‹ค.

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

๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๊ณผํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋ฆฌ์ผœ ๊ฒฐํ•ฉ๋„(coupling)๊ฐ€ ๋†’๋‹ค๊ณ  ๋งํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฐ์ฒด๋“ค์ด ํ•ฉ๋ฆฌ์ ์ธ ์ˆ˜์ค€์œผ๋กœ ์˜์กดํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

๊ฒฐํ•ฉ๋„๋Š” ์˜์กด์„ฑ๊ณผ ๊ด€๋ จ๋ผ ์žˆ๊ธฐ ๋Œ€๋ฌธ์— ๊ฒฐํ•ฉ๋„ ์—ญ์‹œ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•œ ์„ค๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ“Œ 2. ์„ค๊ณ„ ๊ฐœ์„ ํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ๋ณ€๊ฒฝ๊ณผ ์˜์‚ฌ์†Œํ†ต์ด๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ์„œ๋กœ ์—ฎ์—ฌ ์žˆ์Œ์— ์ฃผ๋ชฉํ•ด์•ผ ํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ ๋Š” Theater๊ฐ€ ๊ด€๋žŒ๊ฐ์˜ ๊ฐ€๋ฐฉ๊ณผ ํŒ๋งค์›์˜ ๋งคํ‘œ์†Œ์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Theater๊ฐ€ Audience์™€ TicketSeller์— ๊ฒฐํ•ฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ณผ์—ฐ Theater๊ฐ€ ๊ด€๋žŒ๊ฐ์ด ๊ฐ€๋ฐฉ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ, ํŒ๋งค์›์ด ๋งคํ‘œ์†Œ์—์„œ ํ‹ฐ์ผ“์„ ํŒ๋งคํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฐ€?

์ „ํ˜€ ์•„๋‹ˆ๋‹ค.

๊ด€๋žŒ๊ฐ์ด ์Šค์Šค๋กœ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•˜๊ณ , ํŒ๋งค์›์ด ์Šค์Šค๋กœ ํ‹ฐ์ผ“์„ ํŒ๋งคํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.
๊ด€๋žŒ๊ฐ๊ณผ ํŒ๋งค์›์„ ์ž์œจ์ ์ธ ์กด์žฌ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1. Thear์˜ enter ๋ฉ”์„œ๋“œ์—์„œ TicketOffice์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ TicketSeller ๋‚ด๋ถ€๋กœ ์ˆจ๊ธฐ์ž. TicketSeller์— sellTo ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Theater์— ์žˆ๋˜ ๋กœ์ง์„ ์ด ๋ฉ”์„œ๋“œ๋กœ ์˜ฎ๊ธฐ์ž.

public class Theater {
    private TicketSeller ticketSeller;

    public Theater(TicketSeller ticketSeller) {
        this.ticketSeller = ticketSeller;
    }

        // ticketSeller์—๊ฒŒ ํ‹ฐ์ผ“ ํŒ๋งค ์ฑ…์ž„์„ ์œ„์ž„
    public void enter(Audience audience) {
        ticketSeller.sellTo(audience);
    }
}
public class TicketSeller {
        // ...

        // ๊ด€๊ฐ์˜ ๊ตฌ๋งค ์ฑ…์ž„์€ Audience ์—๊ฒŒ ์œ„์ž„, ํŒ๋งค์†Œ ์žฌ์‚ฐ ๊ด€๋ฆฌ ์ฑ…์ž„์€ ํŒ๋งค์†Œ์—๊ฒŒ ์œ„์ž„
    public void sellTo(Audience audience) {
        ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
    }
}

์ด์ œ TicketOffice์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์˜ค์ง TicketSeller ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ด๋ฅผ ์บก์Аํ™”๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์บก์Аํ™”๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

์ด์ œ Theater์˜ enter ๋ฉ”์„œ๋“œ๋Š” sellTo ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ๋ฐ”๋€๋‹ค.

Theater๋Š” ์˜ค์ง TicketSeller์˜ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•œ๋‹ค. TicketSeller๊ฐ€ ๋‚ด๋ถ€์— TickerOffice ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๊ตฌํ˜„์˜ ์˜์—ญ์— ์†ํ•œ๋‹ค.

1. Audience๋ฅผ ์บก์Аํ™” ํ•˜์ž. TicketSeller๋Š” Audience๋Š” getBag ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ Audience ๋‚ด๋ถ€์˜ Bag ์ธ์Šคํ„ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค.

์บก์Аํ™” ํ•˜๋Š” ๋ฐฉ์‹์€ ์ด์ „๊ณผ ๊ฐ™๋‹ค.

public class Audience {
        // ...

    public Long buy(Ticket ticket) {
        if (bag.hasInvitation()) {
            bag.setTicket(ticket);
            return 0L;
        } else {
            bag.setTicket(ticket);
            bag.minusAmount(ticket.getFee());
            return ticket.getFee();
        }
    }
}

๋ณ€๊ฒฝ ๋œ ์ฝ”๋“œ์—์„œ๋Š” Audience๊ฐ€ ์ž์‹ ์˜ ๊ฐ€๋ฐฉ์•ˆ์— ์ดˆ๋Œ€์žฅ์ด ๋“ค์–ด์žˆ๋Š”์ง€ ์Šค์Šค๋กœ ํ™•์ธํ•œ๋‹ค.
Audience๊ฐ€ ๊ฐ€๋ฐฉ์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ ๋•œ๋ฌธ์— ์™ธ๋ถ€์— ๋”์ด์ƒ getter๋ฅผ ๋…ธ์ถœ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค.
getBag()์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ Bag์˜ ์กด์žฌ๋ฅผ ๋‚ด๋ถ€๋กœ ์บก์Аํ™” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

Audience์™€ TicketSeller๋ฅผ ์ž์œจ์ ์ธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

โญ๏ธ ์บก์Аํ™”์™€ ์‘์ง‘๋„

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

๊ฐ์ฒด์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด ์Šค์Šค๋กœ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ…์ž„์ ธ์•ผ ํ•œ๋‹ค.

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

๋ฆฌํŒฉํ† ๋ง ์ด์ „์—๋Š” ์ž‘์—… ํ๋ฆ„์ด ์ฃผ๋กœ Theater์— ์˜ํ•ด ์ œ์–ด๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋””๋ฏธํ„ฐ ๋ฒ•์น™
๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์–ด๋– ํ•œ ์ž๋ฃŒ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค. (์—ฌ๋Ÿฌ ๊ฐœ์˜ . ๋„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ)
๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ "๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?"๊ฐ€ ์•„๋‹ˆ๋ผ, "๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๊ฐ€?" ์ด๋‹ค.
์ถœ์ฒ˜: https://mangkyu.tistory.com/147


์ถœ์ฒ˜
์˜ค๋ธŒ์ ํŠธ - ์ฝ”๋“œ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„
https://github.com/eternity-oop/object

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