Java/Java 예제

Java 추상화 예제 - 상품 정보, 할인 금액 출력

ssury94 2024. 12. 16. 13:03
 
 
 
package entity;

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

 

package entity;

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]"
        System.out.println("상품 ID: "+productId);
        // 2. "상품 이름: [name]"
        System.out.println("상품 이름: "+name);
        // 3. "가격: [price]원"
        System.out.println("가격: "+price);
        // 4. "브랜드: [brand]"
        System.out.println("브랜드: "+brand);
        // 5. "보증 기간: [warrantyPeriod]개월"
        System.out.println("보증 기간: "+warrantyPeriod+" 개월");
        // 6. "할인된 가격: [calculateDiscountedPrice()]원"
        double discountPrice = calculateDiscountedPrice();
        System.out.println("할인된 가격: "+discountPrice+" 원");
        // 7. 빈 줄 출력
        System.out.println();
    }

    @Override
    public double calculateDiscountedPrice() {
        // price에서 10% 할인된 가격을 계산하여 리턴하시오.
        return price*0.9;
    }

    public String getBrand() {
        return brand;
    }

}

 

package entity;

public class Clothing extends Product{
    private String size;
    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]"
        System.out.println("상품 ID: "+productId);
        // 2. "상품 이름: [name]"
        System.out.println("상품 이름: "+name);
        // 3. "가격: [price]원"
        System.out.println("가격: "+price+" 원");
        // 4. "사이즈: [size]"
        System.out.println("사이즈: "+size);
        // 5. "소재: [material]"
        System.out.println("소재: "+material);
        // 6. "할인된 가격: [calculateDiscountedPrice()]원"
        double discountPrice = calculateDiscountedPrice();
        System.out.println("할인된 가격: "+discountPrice+" 원");
        // 7. 빈 줄 출력
        System.out.println();

    }

    @Override
    public double calculateDiscountedPrice() {
        // price에서 5% 할인된 가격을 계산하여 리턴하시오.
        return price*0.95;
    }

}

 

첨삭의 시간

Check 1.

public double calculateDiscountedPrice() {
    // price에서 10% 할인된 가격을 계산하여 리턴하시오.
    this.price = price * 0.9;
    return this.price;

 

public double calculateDiscountedPrice() {
    // price에서 10% 할인된 가격을 계산하여 리턴하시오.
    return price*0.9;

 

아래쪽이 옳은 작성방법임

 

불변성(Immutability) 유지:
첫 번째 방법은 객체의 상태(this.price)를 변경하고 있습니다. 
이는 객체의 불변성을 해치며, 예상치 못한 부작용을 일으킬 수 있습니다.
두 번째 방법은 객체의 상태를 변경하지 않고 단순히 계산 결과만 반환합니다.

메소드의 순수성(Purity):
두 번째 방법은 순수 함수(pure function)의 특성을 가집니다. 
즉, 동일한 입력에 대해 항상 동일한 출력을 반환하며, 부작용이 없습니다.

예측 가능성:
두 번째 방법은 메소드의 동작을 더 예측 가능하게 만듭니다. 
호출자는 원본 가격이 변경되지 않을 것이라고 예상할 수 있습니다.

재사용성:
두 번째 방법은 원본 가격을 유지하므로, 다른 계산이나 비교에 재사용할 수 있습니다.

명확성:
두 번째 방법은 메소드의 목적(할인된 가격 계산)을 더 명확하게 표현합니다.

 

Check 2.

@Override
public void displayInfo() {
    // 다음 정보를 순서대로 출력:
    // 1. "상품 ID: [productId]"
    System.out.println("상품 ID: "+productId);
    // 2. "상품 이름: [name]"
    System.out.println("상품 이름: "+name);
    // 3. "가격: [price]원"
    System.out.println("가격: "+price+" 원");
    // 4. "사이즈: [size]"
    System.out.println("사이즈: "+size);
    // 5. "소재: [material]"
    System.out.println("소재: "+material);
    // 6. "할인된 가격: [calculateDiscountedPrice()]원";
    System.out.println("할인된 가격: "+calculateDiscountedPrice()+" 원");
    // 7. 빈 줄 출력
    System.out.println();

}

 

@Override
public void displayInfo() {
    // 다음 정보를 순서대로 출력:
    // 1. "상품 ID: [productId]"
    System.out.println("상품 ID: "+productId);
    // 2. "상품 이름: [name]"
    System.out.println("상품 이름: "+name);
    // 3. "가격: [price]원"
    System.out.println("가격: "+price+" 원");
    // 4. "사이즈: [size]"
    System.out.println("사이즈: "+size);
    // 5. "소재: [material]"
    System.out.println("소재: "+material);
    // 6. "할인된 가격: [calculateDiscountedPrice()]원"
    double discountPrice = calculateDiscountedPrice();
    System.out.println("할인된 가격: "+discountPrice+" 원");
    // 7. 빈 줄 출력
    System.out.println();

}

 

아래쪽 방법이 더 좋은 코드

코드의 가독성이 향상
변수에 의미 있는 이름을 부여하여 코드의 자체 문서화 효과가 있다.
할인된 가격을 여러 번 사용해야 할 경우 메소드를 반복해서 호출하지 않아도 OK.
디버깅이 더 쉬워진다.