๐ Chapter 1: ๊ฐ์ฒด, ์ค๊ณ
๐ ํฐ์ผ ํ๋งค ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌํํ๊ธฐโ
์กฐ๊ฑด
- ์ด๋ฒคํธ์ ๋น์ฒจ๋ ๊ด๋๊ฐ์ ์ด๋์ฅ์ ํฐ์ผ์ผ๋ก ๊ตํํ ํ ์ ์ฅ๊ฐ๋ฅ
- ๋น์ฒจ๋์ง ์์ ๊ด๋๊ฐ์ ํฐ์ผ์ ๊ตฌ๋งคํ ํ ์ ์ฅ๊ฐ๋ฅ
- ๋ค์์ ์ด๋ฒคํธ ๋น์ฒจ์์๊ฒ ๋ฐ์ก๋๋ ์ด๋์ฅ ๊ตฌํํ๋ค.
public class Invitation { // ์ด๋์ฅ
private LocalDateTime when; // ์ด๋ ์ผ์
}
Ticket
ํด๋์ค ์ถ๊ฐ
public class Ticket {
private Long fee;
public Long getFee() {
return fee;
}
}
- ์ด๋ฒคํธ ๋น์ฒจ์๋ ํฐ์ผ์ผ๋ก ๊ตํํ ์ ์๋ ์ด๋์ฅ, ์ด๋ฒคํธ์ ๋น์ฒจ๋์ง ์์ ๊ด๋๊ฐ์ ํ๊ธ์ ๋ณด์ ํ๊ณ ์์ ๊ฒ์ด๋ค. (๊ด๋๊ฐ์ด ๊ฐ์ง๊ณ ์ฌ ์ ์๋ ์์งํ์ ์ด๋์ฅ, ํ๊ธ, ํฐ์ผ์ด๋ค.)
- ๊ด๋๊ฐ์ด ์์งํ์ ๋ณด๊ดํ
Bag
ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
public class Bag {
private Long amount; // ํ๊ธ
private Invitation invitation; // ์ด๋์ฅ
private Ticket ticket; // ํฐ์ผ
public boolean hasInvitation() { // ์ด๋์ฅ ๋ณด์ ์ฌ๋ถ ํ์ธ
return invitation != null;
}
public boolean hasTicket() { // ํฐ์ผ ๋ณด์ ์ฌ๋ถ ํ์ธ
return ticket != null;
}
public void setTicket(Ticket ticket) { // ์ด๋์ฅ์ ํฐ์ผ์ผ๋ก ๊ตํ
this.ticket = ticket;
}
public void minusAmount(Long amount) { // ํ๊ธ ๊ฐ์
this.amount -= amount;
}
public void plusAmount(Long amount) { // ํ๊ธ ์ฆ๊ฐ
this.amount += amount;
}
}
- ์ด๋ฒคํธ์ ๋น์ฒจ๋ ๊ด๋๊ฐ์ ํ๊ธ๊ณผ ์ด๋์ฅ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ด๋ฒคํธ์ ๋น์ฒจ๋์ง ์์ ๊ด๋๊ฐ์ ์ด๋์ฅ์ด ์๋ค.
- ๋ฐ๋ผ์
Bag
์ธ์คํด์ค์ ์ํ๋ ํ๊ธ๊ณผ ์ด๋์ฅ์ ํจ๊ผ ๋ณด๊ดํ๊ฑฐ๋, ํ๊ธ๋ง ๋ณด๊ดํ๋ ๋ ๊ฐ์ง ์ค ํ๋์ด๋ค.Bag
์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์์ ์ ์ด ์ ์ฝ์ ๊ฐ์ ํ ์ ์๋๋ก ์์ฑ์๋ฅผ ์ถ๊ฐ.
public class Bag {
public Bag (long amount) {// ํ๊ธ๋ง
this(null, amount);
}
public Bag(Invitation invitation, long amount) { // ์ด๋์ฅ๊ณผ ํ๊ธ
this.invitation = invitation;
this.amount = amount;
}
}
- ๋ค์์ ๊ด๋๊ฐ์ด๋ผ๋ ๊ฐ๋
์ ๊ตฌํํ๋
Audience
ํด๋์ค๋ฅผ ๊ตฌํํ๋ค.
public class Audience {
private Bag bag;
public Audience(Bag bag) {
this.bag = bag;
}
public Bag getBag() { // ๊ด๋๊ฐ์ ๊ฐ๋ฐฉ์ ์์งํ ์ ์๋ค.
return bag;
}
}
- ๋งคํ์์๋ ๊ด๋๊ฐ์๊ฒ ํ๋งคํ ํฐ์ผ๊ณผ ํฐ์ผ์ ํ๋งค ๊ธ์ก์ด ๋ณด๊ด๋ผ ์์ด์ผ ํ๋ค.
- ๋งคํ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํด
TicketOffice
ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
public class TicketOffice {
private Long amount; // ํ๋งค ๊ธ์ก
private List<Ticket> tickets = new ArrayList<>(); // ํฐ์ผ์ ๋ชฉ๋ก
public TicketOffice(Long amount, Ticket, ...tickets) {
this.amount = amount;
this.tickets.addAll(Arrays.asList(tickets));
}
public Ticket getTicket() {
return tickets.remove(0); // ํธ์๋ฅผ ์ํด tickets ์ปฌ๋ ์
์ ๋งจ ์ฒซ ๋ฒ์งธ ์์น์ ์ ์ฅ๋ ํฐ์ผ์ ๋ฐํ
}
public void minusAmount(Long amount) { // ํ๋งค ๊ธ์ก์ ๋ํ๋ค.
this.amount -= amount;
}
public void plusAmount(Long amount) { // ํ๋งค ๊ธ์ก์ ์ฐจ๊ฐ
this.amount += amount;
}
}
- ํ๋งค์์ ๋งคํ์์์ ์ด๋์ฅ์ ํฐ์ผ์ผ๋ก ๊ตํํด ์ฃผ๊ฑฐ๋ ํฐ์ผ์ ํ๋งคํ๋ ์ญํ ์ ํ๋ค.
- ํ๋งค์์ ๊ตฌํํ
TicketSeller
ํด๋์ค๋ ์์ ์ด ์ผํ๋ ๋งคํ์(ticketOffice
)๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค.
public class TicketSeller {
private TicketOffice ticketOffice;
public TicketSeller(TicketOffice ticketOffice) {
this.ticketOffice = ticketOffice;
}
public TicketOffice getTicketOffice() {
return ticketOffice;
}
}
- ๋ง์ง๋ง์ผ๋ก ์๊ทน์ฅ์ ๊ตฌํํ๋
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); // ํฐ์ผ์ ์ค๋ค.
}
}
}
- ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
๐ ๋ฌด์์ด ๋ฌธ์ ์ธ๊ฐโ
๐ ์์์ ๋น๋๊ฐ๋ ์ฝ๋โ
- ๊ด๋๊ฐ๊ณผ ํ๋งค์์ด ์๊ทน์ฅ์ ํต์ ๋ฅผ ๋ฐ๋ ์๋์ ์ธ ์กด์ฌ๋ผ๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. (์๊ทน์ฅ์ ๊ด๋๊ฐ์ ๊ฐ๋ฐฉ์ ์ด์ด ์ด๋์ฅ์ด ์๋ ์ง ํ์ธํ๋ค.)
- ์ดํด ๊ฐ๋ฅํ ์ฝ๋๋ ๊ทธ ๋์์ด ์ผ์์์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๋ ์ฝ๋์ด์ง๋ง ์์ ์์ ๋ ์์์ ๋ฒ์ด๋๋ค.
- ์ ์์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ๊ฐ์ง ์ธ๋ถ์ ์ธ ๋ด์ฉ๋ค์ ํ๊บผ๋ฒ์ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ค. (
Theater
์enter
๋ฉ์๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋Audience
๊ฐBag
์ ๊ฐ์ง๊ณ ์๊ณ ,Bag
์์ ํ๊ธ๊ณผ ํฐ์ผ,TicketSeller
๊ฐTicketOffice
์์ ํฐ์ผ์ ํ๋งคํ๋ ๋ฑ..) ํ๋์ ํด๋์ค๋ ๋ฉ์๋์์ ๋๋ฌด ๋ง์ ์ธ๋ถ์ฌํญ์ ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํด์ผ ํ๋ ์ฌ๋์๊ฒ ํฐ ๋ถ๋ด์ด ๋๋ค. - ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ๋
Audience
์TicketSeller
๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐTheater
๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์ ์ด๋ค.