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); + } +}