ํด๋น ์ฝ๋์์์ ๋ฌธ์ ์ ์ ๊ธฐ๋ฅ๋ง ์ ๋๋ก ์ํํ ๋ฟ, ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ๋ณ๊ฒฝํ๋ ๊ฒ ์ญ์ ์ฝ์ง ์๋ค.
๋ณ๊ฒฝ๊ณผ ์์ฌ์ํต์ ๋ฌธ์ ๊ฐ ์๋ก ์ฎ์ฌ์๋๋ฐ, ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ด์ ๋ Theater๊ฐ ๊ด๋๊ฐ์ ๊ฐ๋ฐฉ๊ณผ ํ๋งค์์ ๋งคํ์์ ์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๊ฒ์ ๊ด๋๊ฐ๊ณผ ํ๋งค์์ด ์์ ์ ์ผ์ ์ค์ค๋ก ์ฒ๋ฆฌํด์ผํ๋ค๋ ํต์์ ์ธ ์ง๊ด๊ณผ ์ด๊ธ๋๋ค. ์ฆ ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ์์ฌ์ํต์ ํ์ง ๋ชปํ๋ฏ๋ก ์ดํดํ๊ธฐ ์ด๋ ต๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋๋ฐ, Theater๊ฐ Audience์ TicketSeller์ ๊ดํด ์ธ์ธํ ๋ถ๋ถ์ ์ ์ ์๋๋ก ํ๋ค. ์ฆ ๊ด๋๊ฐ๊ณผ ํ๋งค์์ ์ค์ ์ธ์๊ณผ ๊ฐ์ด ์์จ์ ์ธ ์กด์ฌ๋ก ๋ง๋ค๋ฉด ๋๋ค.
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);
}
}
}
public class TicketSeller {
private TicketOffice ticketOffice;
public TicketSeller(TicketOffice ticketOffice) {
this.ticketOffice = ticketOffice;
}
public void sellTo() {
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);
}
}
}
Theater์ enter ๋ฉ์๋์ ์ฝ๋๋ฅผ TicketSeller์ sellTo๋ก ์ฎ๊ฒจ์ค๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ticketOffice์ ๋ํ ์ ๊ทผ์ ์ค์ง TicketSeller๋ฅผ ํตํด์๋ง ๊ฐ๋ฅํ๋ค. ํฐ์ผ์ ๊บผ๋ด๊ฑฐ๋ ํ๋งค ์๊ธ์ ์ ๋ฆฝํ๋ ์ผ์ ์ค์ค๋ก ์ํํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ก ๋ณ๋ชจํ๋ค.
์ด๋ ๊ฒ ๊ฐ๋ ์ ์ด๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ฒด ๋ด๋ถ์ ์ธ๋ถ์ ์ธ ์ฌํญ์ ๊ฐ์ถ๋ ๊ฒ์ด ๊ฐ์ฒด ์งํฅ์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ค ํ๋์ธ ์บก์ํ์ด๋ค.
Theater์ enter ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ๋ณ๊ฒฝํ ์ ์๋ค.
public class Theater {
private TicketSeller ticketSeller;
public Theater(TicketSeller ticketSeller) {
this.ticketSeller = ticketSeller;
}
public void enter(Audience audience) {
ticketSeller.sellTo(audience);
}
}
Theater๋ ์ค์ง TicketSeller์ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋ค. TicketSeller๊ฐ ๋ด๋ถ์ TicketOffice ์ธ์คํด์ค๋ฅผ ํฌํจํ๊ณ ์๋ค๋ ๊ฒ์ ๊ตฌํ์ ์์ญ์ ์ํ๋ค. ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค์ ๊ตฌํ์ผ๋ก ๋๋๊ณ , ์ธํฐํ์ด์ค๋ง์ ๊ณต๊ฐํ๋ ๊ฒ์ด ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ณ ํ์ฅ์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค. ์ฆ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค๊ณ์์น์ด๋ผ๊ณ ํ ์ ์๋ค.
์์ ๊ฐ์ด Audience์ ์บก์ํ ์ญ์ ๊ฐ์ ๊ฐ๋ฅํ๋ค. Bag์ ์ ๊ทผํ๋ ๋ชจ๋ ๋ก์ง์ Audience ์ค์ค๋ก ํ ์ ์๋๋ก buy ๋ฉ์๋๋ฅผ Audience ๋ด๋ถ์ ์ถ๊ฐํ๊ณ , sellTo ๋ฉ์๋์์ getBag ๋ฉ์๋์ ์ ๊ทผํ๋ ๋ถ๋ถ์ buy๋ก ์ฎ๊ฒจ์ฃผ๋ฉด ๋๋ค.
์์ ๊ณผ์ ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ Audience๋ TicketSeller์ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ๋๋ผ๋ Theater๋ฅผ ํจ๊ป ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค๋ ์ฌ์ค์ด๋ค.
์์ ํ๊ธฐ ์ ์ฝ๋์์๋ Theater์ enter ๋ฉ์๋ ๋ด์์ Audience์ TicketSeller๋ก ๋ถํฐ Bag๊ณผ TicketOfiice๋ฅผ ๊ฐ์ ธ์ ๊ด๋๊ฐ์ ์ ์ฅ์ํค๋ '์ ์ฐจ'๋ฅผ ๊ตฌํํ์๋ค. Audience, TicketSeller, Bag, TicketOffice๋ ๊ด๋๊ฐ์ ์ ์ฅ์ํค๋ ๋ฐ ํ์ํ ์ ๋ณด๋ง์ ์ ๊ณตํ๊ณ , ์ฒ๋ฆฌ๋ Theater์ enter ๋ฉ์๋ ๋ด๋ถ์์๋ง ์ด๋ฃจ์ด์ง๋ค.
์ด๋ฌํ ๊ด์ ์์ Theater์ enter ๋ฉ์๋๋ ํ๋ก์ธ์ค
์ด๋ฉฐ, Audience, TicketSeller, Bag, TicketOffice๋ ๋ฐ์ดํฐ
์ด๋ค.
์ด์ฒ๋ผ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ๋ชจ๋์ ์์น์ํค๋ ๋ฐฉ์์ด ๋ฐ๋ก ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
์์์ ์ค๋ช ํ ๋ฐ์ ๊ฐ์ด, ์ผ๋ฐ์ ์ผ๋ก ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ ์ฐ๋ฆฌ์ ์ง๊ด์ ์๋ฐฐ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก(์ค์ ์ธ๊ณ์์๋) ๊ด๋๊ฐ๊ณผ ํ๋งค์์ด ์์ ์ ์ผ์ ์ค์ค๋ก ์ฒ๋ฆฌํ๊ณ , ๋ ๊ทธ๋ ๊ฒ ํ ๊ฑฐ๋ผ ์์ํ์ง๋ง ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ ์ธ๊ณ์์๋ ๋ ๊ฐ์ฒด ๋ชจ๋ ์๋์ ์ธ ์กด์ฌ์ผ ๋ฟ์ด๋ค. ๋ ํฐ ๋ฌธ์ ๋ ์ด๋ฌํ ์๋์ ์ธ ๊ฐ์ฒด(๋ฐ์ดํฐ)์ ๋ณ๊ฒฝ์ด ์ด๋ ค์ ํ์ฅ์ฑ์ด ์ ํด๋๋ค๋ ์ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก์ธ์ค๊ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ์ ์์กดํด์ผ ํ๋ค๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ฌธ์, ๋ณ๊ฒฝ์ ์ทจ์ฝํ๋ค.
์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ฒ๋ฆฌํ๋๋ก ํ๋ก์ธ์ค๋ฅผ ๊ฐ ๊ฐ์ฒด๋ณ๋ก ์ด๋์์ผ, ๋ฐ์ดํฐ์ ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ ๋์ผํ ๋ชจ๋ ๋ด๋ถ์ ์์นํ๋๋ก ํ๋ก๊ทธ๋๋ฐ ํ๋ ๋ฐฉ์์ด ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ ์ ์๋ค.
์์ฝํ์๋ฉด, ํผ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ ์บก์ํ๋ฅผ ํตํด ์์กด์ฑ์ ์ ์ ํ ๊ด๋ฆฌํ์ฌ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ด๋ค.
๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์ฌ์ด์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ ์ฑ ์์ ์ด๋์ด๋ค. ์ฑ ์์ ๊ธฐ๋ฅ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์งํฅ์ ์ฉ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
์์ ์ ์ฝ๋์์๋ ์ฑ ์์ด Theater์๋ง ์ง์ค๋์ด ์์ง๋ง, ์์ ํ์๋ Audience์ TicketSeller๋ก ๊ฐ๊ฐ ์ฑ ์์ด ์ด๋ํ์๋ค.
๊ฐ์ฒด์งํฅ์์๋ ๊ฐ ๊ฐ์ฒด๊ฐ ์์ ์ ์ค์ค๋ก ์ฑ ์์ง๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณํด์ผ ํ๋ค. ๊ฐ์ฒด ์งํฅ์ ์ค์ค๋ก ์ฑ ์์ ์ํํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๊ตฌ์ฑํ๋ฉฐ ์์ฑ๋๋ค.
์ค๊ณ๋ฅผ ์ด๋ ต๊ฒ ํ๋ ๊ฒ์ ์์กด์ฑ์ด๊ธฐ ๋๋ฌธ์, ๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํ์ฌ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ผ ํ๋ค. ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ฒด๊ฐ ๋ชฐ๋ผ๋ ๋๋ ์ธ๋ถ ์ฌํญ์ ์ฑ ์์ ๋งก์ ๊ฐ์ฒด ๋ด๋ถ๋ก ๊ฐ์ถฐ ์บก์ํ๋ฅผ ํ๋ ๊ฒ์ด๋ค. ์บก์ํ๋ฅผ ํตํด ๊ฐ์ฒด์ ์์จ ์ฑ์ ๋์ด๊ณ , ์์ง๋ ๋์ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ณต๋์ฒด๋ฅผ ์ฐฝ์กฐํ ์ ์๋๋ก ํ๋ค. ์บก์ํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ด ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋๋ฅผ ํตํด ์๋ก ํ๋ ฅํ์ฌ ์ต์ํ์ ์์กด์ฑ๋ง ๊ฐ์ง๋๋ก ํ๋ ๊ฒ์ด ํผ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ด๋ค.