๐ Chapter 4: ์ค๊ณ ํ์ง๊ณผ ํธ๋ ์ด๋์คํ
- ํ๋ ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๊ฐ์ฒด๋ค ์ฌ์ด์ ์ํธ์์ฉ์ด๋ค.
- ์ฑ ์์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅํ๊ธฐ ์ํด ์ํํ๋ ํ๋์ด๋ค.
- ์ญํ ์ ๋์ฒด ๊ฐ๋ฅํ ์ฑ ์์ ์งํฉ์ด๋ค.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์๊ฒ ์ฌ๋ฐ๋ฅธ ์ฑ ์์ ํ ๋นํ๋ฉด์ ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ์ฐฝ์กฐํ๋ ํ๋์ด๋ค.
- ์ฑ ์์ ๊ฐ์ฒด์ ์ํ์์ ํ๋์ผ๋ก, ๋์๊ฐ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ฌ์ด์ ์ํธ์์ฉ์ผ๋ก ์ค๊ณ ์ค์ฌ์ ์ด๋์ํค๊ณ , ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ณ ์์ง๋๊ฐ ๋์ผ๋ฉฐ ๊ตฌํ์ ํจ๊ณผ์ ์ผ๋ก ์บก์ํํ๋ ๊ฐ์ฒด๋ค์ ์ฐฝ์กฐํ ์ ์๋ ๊ธฐ๋ฐ์ ์ ๊ณตํ๋ค.
๐ ๋ฐ์ดํฐ ์ค์ฌ์ ์ํ ์๋งค ์์คํ โ
- ๊ฐ์ฒด์ ์ํ๋ ๊ตฌํ์ ์ํ๋ค. ๊ตฌํ์ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ณํ๊ธฐ ์ฝ๋ค. ์ํ๋ฅผ ๊ฐ์ฒด ๋ถํ ์ค์ฌ์ถ์ผ๋ก ์ผ์ผ๋ฉด ๊ตฌํ์ ๊ดํ ์ธ๋ถ์ฌํญ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ์ค๋ฉฐ๋ค๊ฒ ๋์ด ์บก์ํ์ ์์น์ด ๋ฌด๋์ง๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ํ์ ๋ณ๊ฒฝ์ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ ์ด๋ํ๋ฉฐ ์ด ์ธํฐํ์ด์ค์ ์์กดํ๋ ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ๋ณ๊ฒฝ์ ์ํฅ์ด ํผ์ง๋ค. ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ด์ ์ ๋ง์ถ๋ ์ค๊ณ๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ ๋ฐ์ ์๋ค.
- ๊ทธ์ ๋นํด ๊ฐ์ฒด์ ์ฑ ์์ ์ธํฐํ์ด์ค์ ์ํ๋ค. ๊ฐ์ฒด์ ์ฑ ์์ ๋๋ฌ๋ด๋ ์์ ์ ์ธ ์ธํฐํ์ด์ค ๋ค๋ก ์ฑ ์์ ์ํํ๋ ๋ฐ ํ์ํ ์ํ๋ฅผ ์บก์ํํจ์ผ๋ก์จ ๊ตฌํ ๋ณ๊ฒฝ์ ๋ํ ํ์ฅ์ด ์ธ๋ถ๋ก ํผ์ ธ๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๐ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ์.โ
- ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ๊ฐ์ฒด๊ฐ ๋ด๋ถ์ ์ ์ฅํด์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ๊ฐ๋ฅผ ๋ฌป๋ ๊ฒ์ผ๋ก ์์ํ๋ค.
Movie
์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊ฒฐ์ ํ๋ ๊ฒ์ผ๋ก ์ค๊ณ๋ฅผ ์์ํ๋ค.
public class Movie {
private String title; // ์ ๋ชฉ
private Duration runningTime; // ์์์๊ฐ
private Money fee; // ๊ธฐ๋ณธ ์๊ธ
private List<DiscountCondition> discountConditions;
private MovieType movieType;
private Money discountAmount;
private double discountPercent;
}
- ์ฌ๊ธฐ์ ์ฑ
์ ์ค์ฌ์
Movie
ํด๋์ค์์ ์ฐจ์ด์ ์discountConditions
,discountAmount
,discountPercent
์ดMovie
์์ ํฌํจ๋์ด ์๋ค. - ํ ์ธ ์ ์ฑ
์ ์ํ๋ณ๋ก ์ค์ง ํ๋๋ง ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์
MovieType
์ผ๋ก ์ํ๋ฅผ ํ์ธํ๋ค.
public enum MovieType {
AMOUNT_DISCOUNT, // ๊ธ์ก ํ ์ธ ์ ์ฑ
PERCENT_DISCOUNT, // ๋น์จ ํ ์ธ ์ ์ฑ
NONE_DISCOUNT, // ๋ฏธ์ ์ฉ
}
- ์ด์ฒ๋ผ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์์๋ ๊ฐ์ฒด๊ฐ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์ง์คํ๋ค. (์ด ๊ฐ์ฒด๊ฐ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ๋ ๋ฌด์์ธ๊ฐ?)
- ์ด์ ์บก์ํ๋ฅผ ์ํด์ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ธ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์๋ฅผ ์ถ๊ฐํ๋ค.
public class Movie {
public MovieType getMovieType() {
return movieType;
}
public void setMovieType(MovieType movieType) {
this.movieType = movieType;
}
public Money getFee() {
return fee;
}
public List<DiscountCondition> getDiscountConditions() {
return Collections.unmodifiableList(discountConditions);
}
public void setDiscountConditions(List<DiscountCondition> discountConditions) {
this.discountConditions = discountConditions;
}
public Money getDiscountAmount() {
return discountAmount;
}
public void setDiscountAmount(Money discountAmount) {
this.discountAmount = discountAmount;
}
public double getDiscountPercent() {
return discountPercent;
}
public void setDiscountPercent(double discountPercent) {
this.discountPercent = discountPercent;
}
}
- ์ด์ ํ ์ธ ์กฐ๊ฑด์ ๊ตฌํํ๋ค. ์ํ ์๋งค ๋๋ฉ์ธ์ ์๋ฒ ์กฐ๊ฑด๊ณผ ๊ธฐ๊ฐ ์กฐ๊ฑด์ด ์๋ค.
public enum DiscountConditionType {
SEQUENCE, // ์๋ฒ ์กฐ๊ฑด
PERIOD // ๊ธฐ๊ฐ ์กฐ๊ฑด
}
- ํ ์ธ ์กฐ๊ฑด์ ๊ตฌํํ๋
DiscountCondition
์ ํ ์ธ ์กฐ๊ฑด์ ํ์ ์ ์ ์ฅํ ์ธ์คํด์ค ๋ณ์์ธtype
์ ํฌํจํ๋ค.
public class DiscountCondition {
private DiscountConditionType type;
private int sequence; // ์์ ์๋ฒ
private DayOfWeek dayOfWeek; // ์์ผ
private LocalTime startTime; // ์์ ์๊ฐ
private LocalTime endTime; // ์ข
๋ฃ ์๊ฐ
}
- ์บก์ํ๋ฅผ ํตํด ์ด ์์ฑ๋ค์ ํด๋์ค ์ธ๋ถ๋ก ๋
ธ์ถํด์๋ ์๋๊ธฐ ๋๋ฌธ์
Movie
ํด๋์ค์ฒ๋ผ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
public class DiscountCondition {
public DiscountConditionType getType() {
return type;
}
public void setType(DiscountConditionType type) {
this.type = type;
}
// ์๋ต...
}
- ์ด์ด์ Screening ํด๋์ค๋ฅผ ๊ตฌํํ๋ค. ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๊ธฐ ์ํด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
public class Screening {
private Movie movie;
private int sequence;
private LocalDateTime whenScreened;
public Movie getMovie() {
return movie;
}
public void setMovie(Movie movie) {
this.movie = movie;
}
// ์๋ต...
}
- ์ํ ์๋งค ์์คํ
์ ๋ชฉ์ ์ ์ํ๋ฅผ ์๋งคํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
Reservation
ํด๋์ค๋ ์ถ๊ฐํ๋ค.
public class Reservation {
private Customer customer;
private Screening screening;
private Money fee;
private int audienceCount;
public Reservation(Customer customer, Screening screening, Money fee, int audienceCount) {
this.customer = customer;
this.screening = screening;
this.fee = fee;
this.audienceCount = audienceCount;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
// ์๋ต...
}
- ๋ค์์
Customer
ํด๋์ค๋ก ๊ณ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ ํด๋์ค์ด๋ค.
public class Customer {
private String name;
private String id;
public Customer(String name, String id) {
this.id = id;
this.name = name;
}
}
๐ ์ํ๋ฅผ ์๋งคํ์โ
ReservationAgency
๋ ๋ฐ์ดํฐ ํด๋์ค๋ค์ ์กฐํฉํด์ ์ํ ์๋งค ์ ์ฐจ๋ฅผ ๊ตฌํํ๋ ํด๋์ค์ด๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Movie movie = screening.getMovie();
boolean discountable = false;
// DiscountCondition์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธ
for (DiscountCondition condition : movie.getDiscountConditions()) {
if (condition.getType() == DiscountConditionType.PERIOD) {
// ๊ธฐ๊ฐ ์กฐ๊ฑด
} else {
// ์๋ฒ ์กฐ๊ฑด
}
if (discountable) {
break;
}
}
Money fee;
if (discountable) { // ํ ์ธ ์ฌ๋ถ
Money discountAmount = Money.ZERO;
// ํ ์ธ ์ ์ฑ
์ ๋ฐ๋ผ ์๋งค ์๊ธ ๊ณ์ฐ
switch(movie.getMovieType()) {
case AMOUNT_DISCOUNT:
// ๊ธ์ก ํ ์ธ ์ ์ฑ
case PERCENT_DISCOUNT:
// ํ ์ธ ๋น์จ
case NONE_DISCOUNT:
// ํ ์ธ ์ ์ฑ
์ด ์ ์ฉ x
}
fee = movie.getFee().minus(discountAmount);
} else {
fee = movie.getFee();
}
return new Reservation(customer, screening, fee, audienceCount);
}
}
๐ ์ค๊ณ ํธ๋ ์ด๋์คํโ
๐ ์บก์ํโ
- ์ํ์ ํ๋์ ํ๋์ ๊ฐ์ฒด ์์ ๋ชจ์ผ๋ ์ด์ ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถ๊ธฐ ์ํด์์ด๋ค. (์ฌ๊ธฐ์ ๊ตฌํ์ด๋ ๋์ค์ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ด๋ค ๊ฒ)
- ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์ ๊ตฌํ, ์๋์ ์ผ๋ก ์์ ์ ์ธ ๋ถ๋ถ์ ์ธํฐํ์ด์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์บก์ํ๋ ์ธ๋ถ์์ ์ ํ์๊ฐ ์๋ ๋ถ๋ถ์ ๊ฐ์ถค์ผ๋ก์จ ๋์์ ๋จ์ํํ๋ ์ถ์ํ์ ํ ์ข ๋ฅ์ด๋ค. (์์ ์ ์ธ ์ธํฐํ์ด์ค ๋ค๋ก ์บก์ํ ํ๋ค.)
- ์บก์ํ๊ฐ ์ค์ํ ์ด์ ๋ ๋ถ์์ ํ ๋ถ๋ถ๊ณผ ์์ ์ ์ธ ๋ถ๋ถ์ ๋ถ๋ฆฌํด์ ๋ณ๊ฒฝ์ ์ํฅ์ ํต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์บก์ํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์ ๊ฐ์ฒด ๋ด๋ถ๋ก ์จ๊ธฐ๋ ์ถ์ํ ๊ธฐ๋ฒ์ด๋ค.
๐ ์์ง๋์ ๊ฒฐํฉ๋โ
- ์์ง๋๋ ๋ชจ๋์ ํฌํจ๋ ๋ด๋ถ ์์๋ค์ด ์ฐ๊ด๋ผ ์๋ ์ ๋๋ฅผ ๋ํ๋ธ๋ค. ๋ชจ๋ ๋ด์ ์์๋ค์ด ํ๋์ ๋ชฉ์ ์ ์ํด ๊ธด๋ฐํ๊ฒ ํ๋ ฅํ๋ค๋ฉด ๊ทธ ๋ชจ๋์ ๋์ ์์ง๋๋ฅผ ๊ฐ์ง๋ค.
- ๊ฒนํฉ๋๋ ์์กด์ฑ์ ์ ๋๋ฅผ ๋ํ๋ด๋ฉฐ ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ์ผ๋ง๋ ๋ง์ ์ง์์ ๊ฐ๊ณ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋์ด๋ค. ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ๋๋ฌด ์์ธํ๊ฒ ์๊ณ ์๋ค๋ฉด ๋์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๋ค.
- ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ์ค๊ณ๋ฅผ ์ถ๊ตฌํด์ผ ํ๋ ์ด์ ๋ ์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ณ๊ฒฝ์ ๊ด์ ์์ ์์ง๋๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ๋ชจ๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ์ ์ ๋๋ก ์ธก์ ํ ์ ์๋ค. (ํ๋์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ชจ๋ ์ ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฒฐํฉ๋๋ ๋๊ณ , ํ๋์ ๋ณ๊ฒฝ์ ํ๋์ ๋ชจ๋๋ง ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฒฐํฉ๋๋ ๋ฎ์ ๊ฒ์ด๋ค.)
- ์บก์ํ๋ฅผ ์งํค๋ฉด ๋ชจ๋ ์์ ์์ง๋๋ ๋์์ง๊ณ ๋ชจ๋ ์ฌ์ด์ ๊ฒฐํฉ๋๋ ๋ฎ์์ง๋ค.