고급추상 클래스

상품 할인 시스템

추상 클래스 Product를 정의하고, Electronics와 Clothing 자식 클래스에서 할인율을 다르게 적용합니다. 추상 클래스와 추상 메소드를 학습합니다.

추상 클래스추상 메소드다형성

상품 할인 시스템

📋 문제 설명

추상 클래스 Product를 정의하고, ElectronicsClothing 자식 클래스에서 서로 다른 할인율을 적용하세요.

추상 클래스와 추상 메소드를 활용한 템플릿 메소드 패턴을 학습합니다.


🎯 클래스 계층 구조

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 - 상품 ID
  • protected 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 타입으로 처리 가능
  • 실제 할인율은 각 클래스의 구현에 따라 자동 결정