์์ ์๊ทน์ฅ์ ๊ฒฝ์ํ๊ณ ์๋ค๊ณ ์๊ฐํด๋ณด์.
์ด๊ธฐ์ ์ฝ๋๋ 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)์ ์ํํธ์จ์ด ๋ชจ๋์ด ๊ฐ์ ธ์ผ ํ๋ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ดํด ์ค๋ช ํ๋ค.
์ ์ฝ๋๋ ํ์ํ ๊ธฐ๋ฅ์ ์ค๋ฅ ์์ด ์ ํํ๊ฒ ์ํํ๊ณ ์๋ค. ์ ๋๋ก ๋์ํด์ผ ํ๋ค๋ ์ ์ฝ ๋ํ ๋ง์กฑํ๋ค.
๊ทธ๋ฌ๋ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด๊ฐ?
์๋๋ค.
์ฝ๋์ ๋ฌธ์ ์
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)๊ฐ ๋๋ค๊ณ ๋งํ๋ค. ๋ฐ๋๋ก ๊ฐ์ฒด๋ค์ด ํฉ๋ฆฌ์ ์ธ ์์ค์ผ๋ก ์์กดํ ๊ฒฝ์ฐ์๋ ๊ฒฐํฉ๋๊ฐ ๋ฎ๋ค๊ณ ๋งํ๋ค.
๊ฒฐํฉ๋๋ ์์กด์ฑ๊ณผ ๊ด๋ จ๋ผ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋ ์ญ์ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ์ด ์๋ค. ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ๋ณ๊ฒฝ์ด ์ฉ์ดํ ์ค๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค.
์ฐ๋ฆฌ๋ ๋ณ๊ฒฝ๊ณผ ์์ฌ์ํต์ด๋ผ๋ ๋ฌธ์ ๊ฐ ์๋ก ์ฎ์ฌ ์์์ ์ฃผ๋ชฉํด์ผ ํ๋ค.
์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ด์ ๋ 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