JAVA만 사용한 할인정책
package hello.core.discount;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.
import hello.core.member.Member;
// 'Member' 클래스를 import합니다. 이 클래스는 동일 프로젝트의 다른 패키지에 정의되어 있으며, 'DiscountPolicy' 인터페이스에서 사용됩니다.
public interface DiscountPolicy {
// 'DiscountPolicy'라는 이름의 public 인터페이스를 선언합니다. 인터페이스는 메서드의 시그니처만을 정의하며, 구현은 이 인터페이스를 구현하는 클래스에서 이루어집니다.
/*
* @return 할인 대상금액
* */
// 이 주석은 'discount' 메서드가 반환할 값에 대한 설명을 제공합니다. 여기서는 할인 대상 금액을 반환한다고 설명하고 있습니다.
int discount(Member member, int price);
// 'discount' 메서드를 선언합니다. 이 메서드는 'Member' 객체와 정가를 의미하는 'int price'를 매개변수로 받습니다.
// 메서드는 할인 금액을 정수형으로 반환해야 합니다. 실제 할인 로직은 이 인터페이스를 구현하는 클래스에서 정의됩니다.
}
이 클래스는 DiscountPolicy 인터페이스를 구현하여 VIP 회원에게 고정된 할인 금액을 제공하는 할인 정책을 정의합니다.
package hello.core.discount;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.
import hello.core.member.Grade;
import hello.core.member.Member;
// 'Grade' 열거형과 'Member' 클래스를 import합니다. 이들은 회원의 등급과 회원 정보를 나타내는 클래스입니다.
public class FixDiscountPolicy implements DiscountPolicy {
// 'FixDiscountPolicy'라는 클래스를 선언하며, 'DiscountPolicy' 인터페이스를 구현합니다. 이 클래스는 인터페이스에서 정의된 'discount' 메서드를 구현하여 할인 로직을 제공합니다.
private int discountFixAmount = 1000; // 1000원 정액 할인
// 'discountFixAmount'라는 private 변수를 선언하고 1000으로 초기화합니다. 이 변수는 고정 할인 금액을 저장하며, VIP 회원에게 적용됩니다.
@Override
public int discount(Member member, int price) {
// 'discount' 메서드를 오버라이드합니다. 이 메서드는 'Member' 객체와 상품의 가격을 매개변수로 받습니다.
if (member.getGrade() == Grade.VIP) {
// 회원의 등급이 VIP인지 확인합니다.
return discountFixAmount;
// 등급이 VIP일 경우, 고정 할인 금액 'discountFixAmount'를 반환합니다.
} else {
return 0;
// VIP가 아닐 경우, 할인 금액으로 0을 반환합니다.
}
}
}
VIP 회원에게만 1000원의 고정 할인을 제공하는 간단한 할인 정책을 구현합니다. 회원 등급에 따라 할인 여부를 결정하며, 할인 정책을 변경하고자 할 때 다른 클래스로 쉽게 대체 가능하도록 인터페이스를 사용합니다.
JAVA만 사용한 주문
package hello.core.order;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.
public class Order {
// 'Order'라는 public 클래스를 선언합니다. 이 클래스는 주문 정보를 관리합니다.
private Long memberId;
// Long 타입의 private 변수 'memberId'를 선언합니다. 이 변수는 회원의 ID를 저장합니다.
private String itemName;
// String 타입의 private 변수 'itemName'을 선언합니다. 이 변수는 주문한 상품의 이름을 저장합니다.
private int itemPrice;
// int 타입의 private 변수 'itemPrice'를 선언합니다. 이 변수는 상품의 가격을 저장합니다.
private int discountPrice;
// int 타입의 private 변수 'discountPrice'를 선언합니다. 이 변수는 할인된 가격을 저장합니다.
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
// 'Order' 클래스의 생성자를 선언합니다. 이 생성자는 주문을 생성할 때 회원 ID, 상품 이름, 상품 가격, 할인 가격을 매개변수로 받습니다.
this.memberId = memberId;
// 'this.memberId'는 클래스의 인스턴스 변수 'memberId'를 가리키며, 생성자의 매개변수로 받은 'memberId' 값을 할당합니다.
this.itemName = itemName;
// 'this.itemName'은 클래스의 인스턴스 변수 'itemName'을 가리키며, 생성자의 매개변수로 받은 'itemName' 값을 할당합니다.
this.itemPrice = itemPrice;
// 'this.itemPrice'는 클래스의 인스턴스 변수 'itemPrice'를 가리키며, 생성자의 매개변수로 받은 'itemPrice' 값을 할당합니다.
this.discountPrice = discountPrice;
// 'this.discountPrice'는 클래스의 인스턴스 변수 'discountPrice'를 가리키며, 생성자의 매개변수로 받은 'discountPrice' 값을 할당합니다.
}
public int calculatePrice() {
// 'calculatePrice' 메서드를 선언합니다. 이 메서드는 실제 결제 금액을 계산하여 반환합니다.
return itemPrice - discountPrice;
// 상품 가격에서 할인 가격을 빼서 최종 결제 금액을 계산하고 반환합니다.
}
public Long getMemberId() {
// 'memberId' 값을 반환하는 getter 메서드를 선언합니다.
return memberId;
// 'memberId' 인스턴스 변수의 값을 반환합니다.
}
public void setMemberId(Long memberId) {
// 'memberId' 값을 설정하는 setter 메서드를 선언합니다.
this.memberId = memberId;
// 'memberId' 인스턴스 변수에 매개변수로 받은 'memberId' 값을 할당합니다.
}
public String getItemName() {
// 'itemName' 값을 반환하는 getter 메서드를 선언합니다.
return itemName;
// 'itemName' 인스턴스 변수의 값을 반환합니다.
}
public void setItemName(String itemName) {
// 'itemName' 값을 설정하는 setter 메서드를 선언합니다.
this.itemName = itemName;
// 'itemName' 인스턴스 변수에 매개변수로 받은 'itemName' 값을 할당합니다.
}
public int getItemPrice() {
// 'itemPrice' 값을 반환하는 getter 메서드를 선언합니다.
return itemPrice;
// 'itemPrice' 인스턴스 변수의 값을 반환합니다.
}
public void setItemPrice(int itemPrice) {
// 'itemPrice' 값을 설정하는 setter 메서드를 선언합니다.
this.itemPrice = itemPrice;
// 'itemPrice' 인스턴스 변수에 매개변수로 받은 'itemPrice' 값을 할당합니다.
}
public int getDiscountPrice() {
// 'discountPrice' 값을 반환하는 getter 메서드를 선언합니다.
return discountPrice;
// 'discountPrice' 인스턴스 변수의 값을 반환합니다.
}
public void setDiscountPrice(int discountPrice) {
// 'discountPrice' 값을 설정하는 setter 메서드를 선언합니다.
this.discountPrice = discountPrice;
// 'discountPrice' 인스턴스 변수에 매개변수로 받은 'discountPrice' 값을 할당합니다.
}
@Override
public String toString() {
// 'toString' 메서드를 오버라이드합니다. 이 메서드는 객체의 상태를 문자열로 반환하는 데 사용됩니다.
return "Order{" +
"memberId=" + memberId +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
// 객체의 각 속성을 문자열 형태로 구성하여 반환합니다. 이는 객체의 정보를 쉽게 확인할 수 있게 해줍니다.
}
}
package hello.core.order;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.
public interface OrderService {
// 'OrderService'라는 이름의 public 인터페이스를 선언합니다. 인터페이스는 클래스가 구현해야 하는 메서드를 정의하며, 여기서 선언된 모든 메서드는 public이고 추상적입니다.
Order createOrder(Long memberId, String itemName, int itemPrice);
// 'createOrder' 메서드를 선언합니다. 이 메서드는 주문을 생성하기 위해 필요한 회원 ID, 상품 이름, 상품 가격을 매개변수로 받습니다.
// 메서드는 생성된 'Order' 객체를 반환해야 합니다. 실제 주문 생성 로직은 이 인터페이스를 구현하는 클래스에서 정의됩니다.
}
public class OrderServiceImpl implements OrderService {
// 'OrderServiceImpl'라는 클래스를 선언하고, 'OrderService' 인터페이스를 구현합니다. 이 클래스는 인터페이스에서 정의된 메서드를 구현해야 합니다.
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 'MemberRepository' 인터페이스의 구현체인 'MemoryMemberRepository'의 인스턴스를 'memberRepository'라는 final 변수로 선언하고 초기화합니다. final 키워드는 변수가 초기화된 후 변경될 수 없음을 의미합니다.
private final DiscountPolicy discountPolicy= new FixDiscountPolicy();
// 'DiscountPolicy' 인터페이스의 구현체인 'FixDiscountPolicy'의 인스턴스를 'discountPolicy'라는 final 변수로 선언하고 초기화합니다. 이 변수는 할인 정책을 정의하며, 할인 금액 계산에 사용됩니다.
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
// 'createOrder' 메서드를 오버라이드합니다. 이 메서드는 주문을 생성하기 위한 정보(회원 ID, 상품 이름, 상품 가격)를 매개변수로 받습니다.
Member member = memberRepository.findById(memberId);
// 'memberRepository'에서 'findById' 메서드를 사용하여 매개변수로 받은 'memberId'에 해당하는 'Member' 객체를 조회합니다.
int discountPrice = discountPolicy.discount(member, itemPrice);
// 'discountPolicy'의 'discount' 메서드를 호출하여, 조회한 'member'와 상품 가격 'itemPrice'를 기반으로 할인 금액을 계산합니다.
return new Order(memberId, itemName, itemPrice, discountPrice);
// 생성자를 통해 'Order' 객체를 생성하고 반환합니다. 이 객체는 주문 ID, 상품 이름, 상품 가격 및 할인 금액 정보를 포함합니다.
}
}
'SPRING > Spring' 카테고리의 다른 글
[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해2 - 객체 지향 원리 적용]새로운 할인 정책 개발 (0) | 2024.05.06 |
---|---|
[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기]주문과 할인 도메인 실행과 테스트 (1) | 2024.05.02 |
[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기] 주문과 할인 도메인 설계 (0) | 2024.05.02 |
[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기]회원 도메인 실행과 테스트 (0) | 2024.05.02 |
[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기] 도메인 개발 (0) | 2024.05.02 |