본문 바로가기
반응형
오브젝트

추상 클래스란(What), 사용하는 이유(Why), 사용법(How)

by brightGarden02 2022. 12. 6.

추상 클래스란(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장 객체지향 프로그래밍

 

 

댓글


반응형
반응형