추상 클래스란(What):
하나 이상의 추상 메소드를 포함하는 클래스이다.
추상 클래스를 사용하는 이유(Why):
모든 객체를 클래스로 만들기 보다는, 추상적으로 큰틀의 클래스를 구현하고 싶을 때 사용한다.
코드를 재사용하기 위해 사용한다.
클래스를 추가하고 싶은데 기존의 클래스와 비슷할 경우 사용한다.
기존의 클래스에서 가져와서 새로운 클래스에 추가 및 수정할 경우 사용한다.
-> 코드 중복을 제거할 수 있음
-> 기존의 클래스를 전혀 수정하지 않아도 됨
-> 자식 클래스에서 부모클래스의 코드를 사용할 수 있음
추상 클래스 사용법(How):
abstract class로 만든다(실제 어플리케이션에서 인스턴스를 생성하지 않아도 되기 때문)
extends를 통한 상속을 사용한다.
자식 클래스에서는 부모 클래스에 있는 abstract 메소드를 구현해야한다.
자식 클래스에서 부모 클래스 메서드를 수정 및 구현하고자 할 때는 해당 메소드 위에 @Override 적는다.
부모 클래스
public abstract class DiscountPolicy {
private List<DiscountCondition> conditions = new ArrayList<>();
public DiscountPolicy(DiscountCondition ... conditions) {
this.conditions = Arrays.asList(conditions);
}
public Money calculateDiscountAmount(Dish dish) {
for (DiscountCondition each : conditions) {
if(each.isSatisfiedBy(dish)) {
return getDiscountAmount(dish);
}
}
return Money.ZERO;
}
abstract protected Money getDiscountAmount(Dish dish);
}
자식 클래스
public class AmountDiscountPolicy extends DiscountPolicy {
private Money discountAmount;
public AmountDiscountPolicy(Money discountAmount, DiscountCondition ... conditions) {
super(conditions);
this.discountAmount = discountAmount;
}
@Override
protected Money getDiscountAmount(Dish dish) {
return discountAmount;
}
}
자식 클래스
public class PercentDiscountPolicy extends DiscountPolicy {
private double percent;
public PercentDiscountPolicy(double percent, DiscountCondition ... conditions) {
super(conditions);
this.percent = percent;
}
@Override
protected Money getDiscountAmount(Dish dish) {
return dish.getDishFee();
}
}
참고: 오브젝트책
2장 객체지향 프로그래밍
'오브젝트' 카테고리의 다른 글
Java 객체지향 프로그래밍(Object Oriented Programming)이란 (0) | 2022.12.10 |
---|---|
6. 메시지와 인터페이스 - 2 (0) | 2022.10.14 |
6. 메시지와 인터페이스 - 1 (0) | 2022.10.14 |
5. 책임 할당하기 - 5 (0) | 2022.10.14 |
5. 책임 할당하기 - 4 (0) | 2022.10.14 |
댓글