Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions src/ch1/cvMax/_01/Audience.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
public class Audience {
private Bag bag; // 관람객의 소지품을 보관하고 있는 Bag 타입을 인스턴스 변수로 구현

public Audience(Bag bag) {
this.bag = bag;
}
// public Audience(Bag bag) {
// this.bag = bag;
// }

// public Bag getBag() { // 다른 클래스에서 변경하지 못하게 코드를 제거한다.
// return bag;
Expand Down
44 changes: 0 additions & 44 deletions src/ch1/hyungjun/Bag.java

This file was deleted.

28 changes: 0 additions & 28 deletions src/ch1/hyungjun/TicketOffice.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch1.hyungjun;
package ch1.hyungjun._01;

public class Audience { // 관람객
private Bag bag;
Expand All @@ -10,16 +10,8 @@ public Audience(Bag bag) { //관람객이 소지품을 보관할 수 있는
// public Bag getBag() { // 이 Audience 클래스 안의 getBag() 함수를 이용해서 관람객의 가방에 접근한다고 받아들이면 되나요???
// return bag;
// }

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

Expand Down
56 changes: 56 additions & 0 deletions src/ch1/hyungjun/_01/Bag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package ch1.hyungjun._01;

public class Bag {
private Long amount; //소지금
private Invitation invitation; // 초대장
private Ticket ticket; // 티켓

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


private boolean hasInvitation() {
return invitation != null;
//초대권을 가지고 있는지 여부 판별
}

// public boolean hasTicket() {
// return ticket != null;
// // 티켓을 가지고 있는지 여부 판별
// }

private void setTicket(Ticket ticket) { // (이게 왜 초대장을 티켓으로 변경해주는 내용인가???)
this.ticket = ticket;
}

private void minusAmount(Long amount) { // 소지금 감소
this.amount -= amount;
}
}
// public void plusAmount(Long amount) { // 소지금 증가
// this.amount += amount;
// }

// public Bag(long amount) {
// this(null, amount); // 소지금만 들고있는 고객의 가방 상태 그런데 이 코드 왜 이렇게 표현???
// }

// public Bag(Invitation invitation, long amount) { // 소지금과 초대권을 들고있는 고객의 가방 상태
// this.invitation = invitation;
// this.amount = amount;
// }
//}

// Bag의 인스턴스를 생성하는 시점에 이 제약을 강제할 수 있도록 생성자를 생성하자 라고 되어있는데
// public Bag(long amount) {}; 과 public Bag(Invitation invitation, long amount){};를 생성자로
// 만들어 준것은 이해가 갔는데 그러면 이것을 어떤 상황에 어떤방식으로 활용하게 되는지가 궁금합니다.


Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch1.hyungjun;
package ch1.hyungjun._01;
import java.time.LocalDateTime;

public class Invitation {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch1.hyungjun;
package ch1.hyungjun._01;

public class Theater {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch1.hyungjun;
package ch1.hyungjun._01;

public class Ticket {
private Long fee; //long이 아니라 Long 인 이유 알기!!!!
Expand Down
34 changes: 34 additions & 0 deletions src/ch1/hyungjun/_01/TicketOffice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ch1.hyungjun._01;
import ch1.hyungjun._01.Ticket;

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

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)); // tickets 라는 ArrayList에 모두 넣어준다??
// }

public void sellTicketTo(Audience audience){
plusAmount(audience.buy(getTicket()));
}

private Ticket getTicket() {
return tickets.remove(0); // 배열의 첫번째 인덱스 (첫번째 순서의 티켓)을 제거한다. 반환되는 값이 무엇일까???
}

// public void minusAmount(Long amount) { // 이 함수들은 이미 Audience 클래스에 있는데 중복해서 써야할 필요가 있을까???
// // 가져다 쓸수 있는방법은 무엇일까???
// this.amount -= amount;
// }

private void plusAmount(Long amount) {
this.amount += amount;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package ch1.hyungjun;
package ch1.hyungjun._01;

import ch1.hyungjun._01.Audience;
import ch1.hyungjun._01.TicketOffice;

public class TicketSeller {
private TicketOffice ticketOffice; // ticket office의 가시성이 private 이고 접근 가능한 public 메서드
public TicketOffice ticketOffice; // ticket office의 가시성이 private 이고 접근 가능한 public 메서드
// 가 더이상 없어서 ticketOffice에 대한 접근은 이제 TicketSeller만 가능하다.
// 여기서 접근 가능한 public method의 예시는???

Expand All @@ -24,7 +27,7 @@ public void sellTo(Audience audience) {
// audience.getBag().setTicket(ticket);
// }

ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
ticketOffice.sellTicketTo(audience);
}
}

Expand Down
15 changes: 15 additions & 0 deletions src/ch2/hyungjun/_02/AmountDiscountPolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ch2.hyungjun._02;

public class AmountDiscountPolicy extends DefaultDiscountPolicy {
private Money discountAmount;

public AmountDiscountPolicy(Money discountAmount, DiscountCondition... conditions) {
super(conditions);
this.discountAmount = discountAmount;
}

@Override
protected Money getDiscountAmount(Screening screening) {
return discountAmount;
}
}
4 changes: 4 additions & 0 deletions src/ch2/hyungjun/_02/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ch2.hyungjun._02;

public class Customer {
}
26 changes: 26 additions & 0 deletions src/ch2/hyungjun/_02/DefaultDiscountPolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ch2.hyungjun._02;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public abstract class DefaultDiscountPolicy {
private List<DiscountCondition> conditions = new ArrayList<>();

public DefaultDiscountPolicy(DiscountCondition... conditions) {
this.conditions = Arrays.asList(conditions);
}

public Money calculateDiscountAmount(Screening screening) {
for (DiscountCondition each : conditions) {

// 인터페이스 메소드 호출
if (each.isSatisfiedBy(screening)) {
return getDiscountAmount(screening);
}
}

return Money.ZERO;
}

abstract protected Money getDiscountAmount(Screening Screening);
}
5 changes: 5 additions & 0 deletions src/ch2/hyungjun/_02/DiscountCondition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ch2.hyungjun._02;

public interface DiscountCondition {
boolean isSatisfiedBy(Screening screening);
}
5 changes: 5 additions & 0 deletions src/ch2/hyungjun/_02/DiscountPolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ch2.hyungjun._02;

public interface DiscountPolicy {
Money calculateDiscountAmount(Screening screening);
}
43 changes: 43 additions & 0 deletions src/ch2/hyungjun/_02/Money.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ch2.hyungjun._02;

import java.math.BigDecimal;

public class Money { // 금액을 구현하기 위해 1장과 다르게 Long이 아닌 Money를 썼다. 객체지향의 장점 객체를 이용해 도메인의 의미를 풍부하게 표현 가능
public static final Money ZERO = Money.wons(0); // 개념이 하나의 인스턴스 변수만을 포함하더라도 개념을 명시적으로 표현하는것이 좋다.

private final BigDecimal amount; // static의 의미??

public static Money wons(long amount) {
return new Money(BigDecimal.valueOf(amount));
}

public static Money wons(double amount) {
return new Money(BigDecimal.valueOf(amount)); // .valueOf??? / 자료 타입 double 쓰는 이유??
}

Money(BigDecimal amount) {
this.amount = amount;
}

public Money plus(Money amount) { //더하기
return new Money(this.amount.add(amount.amount));
}

public Money minus(Money amount) { // 빼기
return new Money(this.amount.subtract(amount.amount));
}

public Money times(double percent) { // 곱해주기 (퍼센트)
return new Money(this.amount.multiply(
BigDecimal.valueOf(percent)
));
}

public boolean isLessThan(Money other) { // 값 비교
return amount.compareTo(other.amount) < 0;
}

public boolean isGreaterThanOrEqual(Money other) { // 값 비교 크거나 같으면
return amount.compareTo(other.amount) >= 0;
}
}
25 changes: 25 additions & 0 deletions src/ch2/hyungjun/_02/Movie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ch2.hyungjun._02;

import java.time.Duration;
public class Movie {
private String title;
private Duration runningTime;
private Money fee;
private DiscountPolicy discountPolicy;

public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
this.title = title;
this.runningTime = runningTime;
this.fee = fee;
this.discountPolicy = discountPolicy;
}

public Money getFee() {
return fee;
}

public Money calculateMovieFee(Screening screening) {
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}

}
8 changes: 8 additions & 0 deletions src/ch2/hyungjun/_02/NoneDiscountPolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ch2.hyungjun._02;

public class NoneDiscountPolicy implements DiscountPolicy {
@Override
public Money calculateDiscountAmount(Screening screening){
return Money.ZERO;
}
}
Loading