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.
디버깅이 더 쉬워진다.