diff --git a/.idea/misc.xml b/.idea/misc.xml
index e0844bc..9f4ed58 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/ch1/cvMax/_01/Audience.java b/src/ch1/cvMax/_01/Audience.java
index 73d3f1e..f0758b1 100644
--- a/src/ch1/cvMax/_01/Audience.java
+++ b/src/ch1/cvMax/_01/Audience.java
@@ -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;
diff --git a/src/ch1/hyungjun/Bag.java b/src/ch1/hyungjun/Bag.java
deleted file mode 100644
index 837a449..0000000
--- a/src/ch1/hyungjun/Bag.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package ch1.hyungjun;
-
-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;
- }
-
- 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){};를 생성자로
-// 만들어 준것은 이해가 갔는데 그러면 이것을 어떤 상황에 어떤방식으로 활용하게 되는지가 궁금합니다.
-
-
diff --git a/src/ch1/hyungjun/TicketOffice.java b/src/ch1/hyungjun/TicketOffice.java
deleted file mode 100644
index 22b0504..0000000
--- a/src/ch1/hyungjun/TicketOffice.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package ch1.hyungjun;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
-
-public class TicketOffice {
-
- private Long amount;
- private List tickets = new ArrayList<>();
-
- public TicketOffice(Long amount, Ticket ... tickets) { // 여기서 ... 전개연산자의 역할로 쓰인것 맞나요??
- this.amount = amount;
- this.tickets.addAll(Arrays.asList(tickets)); // tickets 라는 ArrayList에 모두 넣어준다??
- }
-
- public Ticket getTicket() {
- return tickets.remove(0); // 배열의 첫번째 인덱스 (첫번째 순서의 티켓)을 제거한다. 반환되는 값이 무엇일까???
- }
-
- public void minusAmount(Long amount) { // 이 함수들은 이미 Audience 클래스에 있는데 중복해서 써야할 필요가 있을까???
- // 가져다 쓸수 있는방법은 무엇일까???
- this.amount -= amount;
- }
-
- public void plusAmount(Long amount) {
- this.amount += amount;
- }
-}
diff --git a/src/ch1/hyungjun/Audience.java b/src/ch1/hyungjun/_01/Audience.java
similarity index 71%
rename from src/ch1/hyungjun/Audience.java
rename to src/ch1/hyungjun/_01/Audience.java
index 4535daa..6eafa59 100644
--- a/src/ch1/hyungjun/Audience.java
+++ b/src/ch1/hyungjun/_01/Audience.java
@@ -1,4 +1,4 @@
-package ch1.hyungjun;
+package ch1.hyungjun._01;
public class Audience { // 관람객
private Bag bag;
@@ -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);
}
}
diff --git a/src/ch1/hyungjun/_01/Bag.java b/src/ch1/hyungjun/_01/Bag.java
new file mode 100644
index 0000000..40077b5
--- /dev/null
+++ b/src/ch1/hyungjun/_01/Bag.java
@@ -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){};를 생성자로
+// 만들어 준것은 이해가 갔는데 그러면 이것을 어떤 상황에 어떤방식으로 활용하게 되는지가 궁금합니다.
+
+
diff --git a/src/ch1/hyungjun/Invitation.java b/src/ch1/hyungjun/_01/Invitation.java
similarity index 85%
rename from src/ch1/hyungjun/Invitation.java
rename to src/ch1/hyungjun/_01/Invitation.java
index 9a75fa1..c7b279c 100644
--- a/src/ch1/hyungjun/Invitation.java
+++ b/src/ch1/hyungjun/_01/Invitation.java
@@ -1,4 +1,4 @@
-package ch1.hyungjun;
+package ch1.hyungjun._01;
import java.time.LocalDateTime;
public class Invitation {
diff --git a/src/ch1/hyungjun/Theater.java b/src/ch1/hyungjun/_01/Theater.java
similarity index 99%
rename from src/ch1/hyungjun/Theater.java
rename to src/ch1/hyungjun/_01/Theater.java
index 962757f..73423f7 100644
--- a/src/ch1/hyungjun/Theater.java
+++ b/src/ch1/hyungjun/_01/Theater.java
@@ -1,4 +1,4 @@
-package ch1.hyungjun;
+package ch1.hyungjun._01;
public class Theater {
diff --git a/src/ch1/hyungjun/Ticket.java b/src/ch1/hyungjun/_01/Ticket.java
similarity index 85%
rename from src/ch1/hyungjun/Ticket.java
rename to src/ch1/hyungjun/_01/Ticket.java
index 51e7e1b..9c6c773 100644
--- a/src/ch1/hyungjun/Ticket.java
+++ b/src/ch1/hyungjun/_01/Ticket.java
@@ -1,4 +1,4 @@
-package ch1.hyungjun;
+package ch1.hyungjun._01;
public class Ticket {
private Long fee; //long이 아니라 Long 인 이유 알기!!!!
diff --git a/src/ch1/hyungjun/_01/TicketOffice.java b/src/ch1/hyungjun/_01/TicketOffice.java
new file mode 100644
index 0000000..d412eca
--- /dev/null
+++ b/src/ch1/hyungjun/_01/TicketOffice.java
@@ -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 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;
+ }
+}
diff --git a/src/ch1/hyungjun/TicketSeller.java b/src/ch1/hyungjun/_01/TicketSeller.java
similarity index 91%
rename from src/ch1/hyungjun/TicketSeller.java
rename to src/ch1/hyungjun/_01/TicketSeller.java
index 9e66a92..39221d7 100644
--- a/src/ch1/hyungjun/TicketSeller.java
+++ b/src/ch1/hyungjun/_01/TicketSeller.java
@@ -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의 예시는???
@@ -24,7 +27,7 @@ public void sellTo(Audience audience) {
// audience.getBag().setTicket(ticket);
// }
- ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
+ ticketOffice.sellTicketTo(audience);
}
}
diff --git a/src/ch2/hyungjun/_02/AmountDiscountPolicy.java b/src/ch2/hyungjun/_02/AmountDiscountPolicy.java
new file mode 100644
index 0000000..fa82735
--- /dev/null
+++ b/src/ch2/hyungjun/_02/AmountDiscountPolicy.java
@@ -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;
+ }
+}
diff --git a/src/ch2/hyungjun/_02/Customer.java b/src/ch2/hyungjun/_02/Customer.java
new file mode 100644
index 0000000..b778175
--- /dev/null
+++ b/src/ch2/hyungjun/_02/Customer.java
@@ -0,0 +1,4 @@
+package ch2.hyungjun._02;
+
+public class Customer {
+}
diff --git a/src/ch2/hyungjun/_02/DefaultDiscountPolicy.java b/src/ch2/hyungjun/_02/DefaultDiscountPolicy.java
new file mode 100644
index 0000000..ae46164
--- /dev/null
+++ b/src/ch2/hyungjun/_02/DefaultDiscountPolicy.java
@@ -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 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);
+}
diff --git a/src/ch2/hyungjun/_02/DiscountCondition.java b/src/ch2/hyungjun/_02/DiscountCondition.java
new file mode 100644
index 0000000..0aaa516
--- /dev/null
+++ b/src/ch2/hyungjun/_02/DiscountCondition.java
@@ -0,0 +1,5 @@
+package ch2.hyungjun._02;
+
+public interface DiscountCondition {
+ boolean isSatisfiedBy(Screening screening);
+}
\ No newline at end of file
diff --git a/src/ch2/hyungjun/_02/DiscountPolicy.java b/src/ch2/hyungjun/_02/DiscountPolicy.java
new file mode 100644
index 0000000..b960dfe
--- /dev/null
+++ b/src/ch2/hyungjun/_02/DiscountPolicy.java
@@ -0,0 +1,5 @@
+package ch2.hyungjun._02;
+
+public interface DiscountPolicy {
+ Money calculateDiscountAmount(Screening screening);
+}
diff --git a/src/ch2/hyungjun/_02/Money.java b/src/ch2/hyungjun/_02/Money.java
new file mode 100644
index 0000000..a0d6c4e
--- /dev/null
+++ b/src/ch2/hyungjun/_02/Money.java
@@ -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;
+ }
+}
diff --git a/src/ch2/hyungjun/_02/Movie.java b/src/ch2/hyungjun/_02/Movie.java
new file mode 100644
index 0000000..1e0e667
--- /dev/null
+++ b/src/ch2/hyungjun/_02/Movie.java
@@ -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));
+ }
+
+}
diff --git a/src/ch2/hyungjun/_02/NoneDiscountPolicy.java b/src/ch2/hyungjun/_02/NoneDiscountPolicy.java
new file mode 100644
index 0000000..87692af
--- /dev/null
+++ b/src/ch2/hyungjun/_02/NoneDiscountPolicy.java
@@ -0,0 +1,8 @@
+package ch2.hyungjun._02;
+
+public class NoneDiscountPolicy implements DiscountPolicy {
+ @Override
+ public Money calculateDiscountAmount(Screening screening){
+ return Money.ZERO;
+ }
+}
diff --git a/src/ch2/hyungjun/_02/PercentDiscountPolicy.java b/src/ch2/hyungjun/_02/PercentDiscountPolicy.java
new file mode 100644
index 0000000..18f8878
--- /dev/null
+++ b/src/ch2/hyungjun/_02/PercentDiscountPolicy.java
@@ -0,0 +1,15 @@
+package ch2.hyungjun._02;
+
+public class PercentDiscountPolicy extends DefaultDiscountPolicy {
+ private double percent;
+
+ public PercentDiscountPolicy(double percent, DiscountCondition... conditions) {
+ super(conditions);
+ this.percent = percent;
+ }
+
+ @Override
+ protected Money getDiscountAmount(Screening screening) {
+ return screening.getMovieFee().times(percent);
+ }
+}
diff --git a/src/ch2/hyungjun/_02/PeriodCondition.java b/src/ch2/hyungjun/_02/PeriodCondition.java
new file mode 100644
index 0000000..baa2767
--- /dev/null
+++ b/src/ch2/hyungjun/_02/PeriodCondition.java
@@ -0,0 +1,22 @@
+package ch2.hyungjun._02;
+
+import java.time.DayOfWeek;
+import java.time.LocalTime;
+public class PeriodCondition implements DiscountCondition {
+ private DayOfWeek dayOfWeek;
+ private LocalTime startTime;
+ private LocalTime endTime;
+
+ public PeriodCondition(DayOfWeek dayOfWeek, LocalTime startTime, LocalTime endTime){
+ this.dayOfWeek = dayOfWeek;
+ this.startTime = startTime;
+ this.endTime = endTime;
+ }
+
+ @Override
+ public boolean isSatisfiedBy(Screening screening) {
+ return screening.getStartTime().getDayOfWeek().equals(dayOfWeek) &&
+ startTime.compareTo(screening.getStartTime().toLocalTime()) <= 0 &&
+ endTime.compareTo(screening.getStartTime().toLocalTime()) >= 0;
+ }
+}
diff --git a/src/ch2/hyungjun/_02/Reservation.java b/src/ch2/hyungjun/_02/Reservation.java
new file mode 100644
index 0000000..57f6118
--- /dev/null
+++ b/src/ch2/hyungjun/_02/Reservation.java
@@ -0,0 +1,23 @@
+package ch2.hyungjun._02;
+
+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;
+ }
+}
+
+// 협력(Collaboration) : 시스템의 어떤 기능을 구현하기 위해 객체들 사이에 이뤄지는 상호작용
+
+// 객체의 상호 작용 : 1. 메세지 전송 2. 메세지 수신
+// 수신된 메세지를 처리하기위한 자신만의 방법 => 메서드
+
+// 메시지와 메서드를 구분하는 것은 매우 중요!! 메세지는 (다른 객체로부터) 메서드는 (나만의 고유의 것)
+//메세지와 메서드의 구분에서부터 다형성의 개념이 출발
diff --git a/src/ch2/hyungjun/_02/Screening.java b/src/ch2/hyungjun/_02/Screening.java
new file mode 100644
index 0000000..42d6a00
--- /dev/null
+++ b/src/ch2/hyungjun/_02/Screening.java
@@ -0,0 +1,119 @@
+package ch2.hyungjun._02;
+
+import java.time.LocalDateTime;
+
+public class Screening {
+ private Movie movie; // instanc 변수의 가시성은 private, 메서드의 가시성은 public ==> 캡슐화를 통해 객체의 자율성 확보
+ private int sequence; // 경계의 명확성이 객체의 자율성을 보장한다. ==> 프로그래머에게 구현의 자유를 제공한다.
+ private LocalDateTime whenScreened;
+
+ public Screening(Movie movie, int sequence, LocalDateTime whenScreened) {
+ this.movie = movie;
+ this.sequence = sequence;
+ this.whenScreened = whenScreened;
+ }
+
+ public LocalDateTime getStartTime() { //상영 시작시간
+ return whenScreened;
+ }
+
+ public boolean isSequence(int sequence) { // 순서
+ return this.sequence == sequence;
+ }
+
+ public Money getMovieFee() { //영화값
+ return movie.getFee();
+ }
+
+ private Money calculateFee(int audienceCount) {
+ return movie.calculateMovieFee(this).times(audienceCount);
+ }
+ public Reservation reserve(Customer customer, int audienceCount) { // 예매하면 정보 반환
+ return new Reservation(customer, this, calculateFee(audienceCount), audienceCount);
+ }
+}
+
+
+// 요구사항
+
+// 1. 하나의 영화는 하루 중 다양한 시간대에 걸쳐 한 번 이상 사용될 수 있다.
+// 2. 특정한 규칙을 만족하는 예매자는 요금을 할인 받을 수 있다.
+// 3. 영화별로 하나의 할인 정책만 할당할 수 있다. (minus 할인 or percent 할인 중에 무조건 하나만 가능)
+// 4. 할인 정책을 지정하지 않는것도 가능 (할인 적용 x -> 기본요금 지불)
+// 5. 할인 조건은 다수의 할인 조건 함께 지정가능, 순서,기간 조건 섞기 가능 (다양한 할인 조건중에 최소 1개의 할인조건만 만족해도 할인 가능)
+// 6. 할인 조건 여러개를 만족해도 조건 하나당 중복으로 할인이 적용되지는 않는것 같음.
+// 7. 할인 적용은 1인에 해당 (n명이면 (1인 할인액 * n) 이 총 할인액)
+
+// ---------------
+// 8. 예매 완료 후 예매 정보 생성 (제목, 상영정보, 인원, 정가, 결제금액)
+
+// 조건의 종류 : 1. 할인 조건 (할인을 받을수 있는지 없는지) / 2. 할인 정책 (할인의 방식 선정)
+
+// 할인 조건 : 1. 순서 조건 (n번째 상영되는 영화) / 2. 기간 조건 (특정 요일, 시작시간 ~ 종료시간 안에 조건을 만족하는지)
+// 할인 정책 : 1. 금액 할인 정책 ( minus ) 2. 비율 할인 정책 ( percentage )
+
+//-----------------
+
+// 진정한 객체 지향에 다가가는법
+
+// 1. 클래스 기반의 언어를 다루더라도 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하자.
+
+// 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화 한것이다.
+// => 이 말을 해석해보면 클래스를 내에 다양한 객체들이 존재하게 되는데 결국 클래스는 이 객체들간의 협력을 통해 만들어내고자 하는 행위나 의도를 하나의 의미 단위로
+// 표현해 주는 것이기 때문에 클래스를 고민하고 객체를 고민하는것이 아니라 객체를 먼저 고민하고 클래스의 윤곽(표현하고자하는 의미단위) 를 결정해라. 예를 들어보자면
+// 새로운 요리를 창작하려고하는데 요리 이름을 지어놓고 재료선정을 하는게 맞냐? 재료들을 먼저 준비하고 만들고 나서 요리이름을 정하는 것이 맞냐? 이런 느낌으로
+// 받아 들였다. 미리 재료(객체)들을 어떻게 조합할지 생각하면 만들어보고자 하는 요리이름(클래스)를 더 효과적이고 효율적으로 지을 수 있을 것!
+
+// 2. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야한다.
+
+// 객체의 의존도를 낮추고 자율성을 높여주는 것을 지향해야한다는 사실에 매몰되어 객체가 아예 독립적이어야 좋다고는 생각하지 말자. 이것 역시 요리로 예를 들면
+// 요리를 할때, 이상적인 맛을 내려면 각 재료(객체)마다 들어가야하는 양과 정도의 차이가 존재한다. 어떤 재료는 어떤재료와 어울리게끔 조화로움를 고려해서
+// 음식 맛의 밸런스를 설계하는 것 처럼 객체 역시 각 재료의 본연의 맛이나 식감이 살아나고 돋보이면 좋은 부분과 다른재료와 조화를 이뤘을때 맛이 좋아지는게 재료의
+// 상태나 특성에 따라 다르다. 이것처럼 객체 역시 어느정도 자율성을 가져야 할 부분은 자율성을 높여주고 협력을 해야할 부분은 협력을 시켜주어 상황에 따라 유연한
+// 좋은 밸런스를 가진 클래스를 만들수 있게 해줘야 한다.
+
+// 도메인(domain) 이란?
+
+// 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야 (사실상 실제 상황에서 문제 해결을 위한 요구 사항 로직)
+
+// 객체지향이 강력한 이유가 도메인과 프로그램을 객체라는 관점에서 동일하게 볼수 있기 때문! 결국 객체를 구현하는 과정이 도메인내의 요구사항을 해결하는 과정과
+// 일맥상통한다.
+// ==> 클래스의 구조는 도메인의 구조와 유사한 형태를 띄어야 한다.
+
+//-----------------------
+
+// 객체는 상태(state)와 행동(behavior)을 함께 가지는 복합적인 존재다.
+// 객체는 사실 스스로 판단하고 행동하는 자율적인 존재다. (사물이어도 의인화)
+
+// 캡슐화 ==> 데이터와 기능을 객체 내부로 함께 묶는 것 ==> 나아가 접근 수정자(access modifier)를 이용해 접근제어(access control)를 한다.
+// 우리가 지금까지 본것은 데이터를 숨기고 기능만 접근이 가능하게 한다.
+// ==> 객체 스스로 상태 관리, 판단, 행동하는 자율적인 객체를 지향 => 이런 객체들의 공동체를 지향 ==> 객체지향의 핵심
+// ==> 다른 객체가 요청을 할 수 있는 권한만 준다. 내가 자율적 이라는 의미 => 상대방이 나에 비해 상대적으로 수동적인 입장으로 변한다는 의미 => 다른 객체는
+// 한 객체에 접근해서 요청을 하고 그 객체의 판단과 행동을 기다리는 수동적인 존재가 된다.
+
+// 캡슐화와 접근제어는 객체를 두 부분으로 나눈다.
+
+// 1. 인터페이스(public interface)
+// 외부에서 접근이 가능한 부분
+
+// 2. 구현(implementation)
+// 외부에서 접근 불가능하고 오직 내부에서만 접근 가능한 부분
+
+// ==> 인터페이스와 구현의 분리 원칙 => 좋은 객체지향을 위한 핵심 원칙
+
+
+// 구현 은닉(implementation hiding)
+
+// 프로그래머의 역할 : 1. 클래스 작성자 / 2. 클라이언트 프로그래머
+
+// 클래스 작성자는 새로운 데이터 타입을 프로그램에 추가 / 클라이언트 프로그래머는 클래스 작성자가 추가한 데이터 타입 사용
+// 클라이언트 프로그래머스는 예를 들면 밀키트 레시피만 사용하는 역할 / 클래스 작성자는 레시피를 생각해서 밀키트의 재료를 구성하는 사람
+
+
+
+
+
+
+
+
+
diff --git a/src/ch2/hyungjun/_02/SequenceCondition.java b/src/ch2/hyungjun/_02/SequenceCondition.java
new file mode 100644
index 0000000..9c87fae
--- /dev/null
+++ b/src/ch2/hyungjun/_02/SequenceCondition.java
@@ -0,0 +1,15 @@
+package ch2.hyungjun._02;
+
+public class SequenceCondition implements DiscountCondition {
+ private int squence;
+
+ public SequenceCondition(int sequence){
+ this.squence = sequence;
+ }
+
+
+ @Override
+ public boolean isSatisfiedBy(Screening screening) {
+ return screening.isSequence(squence);
+ }
+}