상품 할인 시스템
📋 문제 설명
추상 클래스 Product를 정의하고, Electronics와 Clothing 자식 클래스에서 서로 다른 할인율을 적용하세요.
추상 클래스와 추상 메소드를 활용한 템플릿 메소드 패턴을 학습합니다.
🎯 클래스 계층 구조
Java
Product (추상 클래스)
├── Electronics (전자제품 - 10% 할인)
└── Clothing (의류 - 5% 할인)
💻 코드 구조
Product 클래스 (추상 부모 클래스)
Java
public abstract class Product {
protected String productId;
protected String name;
protected double price;
// 디폴트 생성자
public Product() {
}
// 매개변수가 있는 생성자
public Product(String productId, String name, double price) {
this.productId = productId;
this.name = name;
this.price = price;
}
// 상품 정보를 출력하는 추상 메서드
public abstract void displayInfo();
// 할인된 가격을 계산하는 추상 메서드
public abstract double calculateDiscountedPrice();
}
필드
protected String productId- 상품 IDprotected String name- 상품 이름protected double price- 상품 가격
추상 메서드 (자식 클래스에서 반드시 구현해야 함)
displayInfo()- 상품 정보 출력calculateDiscountedPrice()- 할인 가격 계산
⚠️ 추상 클래스는 객체를 직접 생성할 수 없습니다! (new Product() 불가)
Electronics 클래스 (전자제품)
Java
public class Electronics extends Product {
private String brand; // 브랜드명
private int warrantyPeriod; // 무상 보증 기간 (개월 단위)
// 디폴트 생성자
public Electronics() {
}
// 매개변수가 있는 생성자
public Electronics(String productId, String name, double price,
String brand, int warrantyPeriod) {
super(productId, name, price);
this.brand = brand;
this.warrantyPeriod = warrantyPeriod;
}
@Override
public void displayInfo() {
// 다음 정보를 순서대로 출력:
// 1. "상품 ID: [productId]"
// 2. "상품 이름: [name]"
// 3. "가격: [price]원"
// 4. "브랜드: [brand]"
// 5. "보증 기간: [warrantyPeriod]개월"
// 6. "할인된 가격: [calculateDiscountedPrice()]원"
// 7. 빈 줄 출력
}
@Override
public double calculateDiscountedPrice() {
// price에서 10% 할인된 가격을 계산하여 리턴
// 계산식: price * 0.9
}
}
추가 필드
private String brand- 브랜드명private int warrantyPeriod- 보증 기간 (개월)
할인율: 10% (전자제품 할인)
Clothing 클래스 (의류)
Java
public class Clothing extends Product {
private String size; // 사이즈 (S, M, L, XL 등)
private String material; // 소재 (면, 폴리에스테르 등)
// 디폴트 생성자
public Clothing() {
}
// 매개변수가 있는 생성자
public Clothing(String productId, String name, double price,
String size, String material) {
super(productId, name, price);
this.size = size;
this.material = material;
}
@Override
public void displayInfo() {
// 다음 정보를 순서대로 출력:
// 1. "상품 ID: [productId]"
// 2. "상품 이름: [name]"
// 3. "가격: [price]원"
// 4. "사이즈: [size]"
// 5. "소재: [material]"
// 6. "할인된 가격: [calculateDiscountedPrice()]원"
// 7. 빈 줄 출력
}
@Override
public double calculateDiscountedPrice() {
// price에서 5% 할인된 가격을 계산하여 리턴
// 계산식: price * 0.95
}
}
추가 필드
private String size- 사이즈private String material- 소재
할인율: 5% (의류 할인)
📝 Main 클래스 테스트
Java
public class Main {
public static void main(String[] args) {
// Electronics 객체 생성 (디폴트 생성자)
Electronics electronicProduct = new Electronics();
// Clothing 객체 생성 (디폴트 생성자)
Clothing clothingProduct = new Clothing();
// 각 객체의 displayInfo() 메서드 호출
electronicProduct.displayInfo();
clothingProduct.displayInfo();
System.out.println("=== 실제 상품 정보 입력 ===\n");
// 매개변수가 있는 생성자를 사용하여 Electronics 객체 생성
Electronics tv = new Electronics(
"E001", // productId
"Smart TV", // name
1200000, // price
"삼성전자", // brand
24 // warrantyPeriod (24개월)
);
tv.displayInfo();
// 매개변수가 있는 생성자를 사용하여 Clothing 객체 생성
Clothing tshirt = new Clothing(
"C001", // productId
"T-Shirt", // name
20000, // price
"L", // size
"폴리에스테르" // material
);
tshirt.displayInfo();
}
}
예상 출력:
Java
상품 ID: E001
상품 이름: Smart TV
가격: 1200000원
브랜드: 삼성전자
보증 기간: 24개월
할인된 가격: 1080000원
상품 ID: C001
상품 이름: T-Shirt
가격: 20000원
사이즈: L
소재: 폴리에스테르
할인된 가격: 19000원
💡 학습 포인트
1. 추상 클래스 (Abstract Class)
abstract키워드로 선언- 객체를 직접 생성할 수 없음
- 공통 기능은 구현하고, 세부 기능은 자식에게 위임
2. 추상 메서드 (Abstract Method)
- 선언만 하고 구현은 하지 않음 (메서드 body 없음)
- 자식 클래스에서 반드시 구현해야 함 (
@Override필수)
3. 템플릿 메소드 패턴
- 공통 구조는 부모가 정의
- 세부 구현은 자식이 담당
- 각 상품 타입마다 다른 할인율 적용 가능
4. 다형성 활용
- 모든 상품을
Product타입으로 처리 가능 - 실제 할인율은 각 클래스의 구현에 따라 자동 결정