인터페이스 (Interface)

김대니·2023년 1월 8일
0

Programming

목록 보기
1/2
post-thumbnail

인터페이스란?

기능에 대한 명세 집합으로써 메소드에 대한 구현은 없이 정의만 해둔 객체입니다.

왜 사용하는가?

클린 코드를 작성하기 위한 SOLID 원칙이 추구하는 방향 중 하나는 "변경에 유연한 설계" 입니다. 변경에 유연한 코드를 작성하려면 OOP 에서 자주 나오는 다형성을 적용해볼 수 있으며, 이를 위해서는 인터페이스 개념을 사용할 수 있습니다.

결국 변경에 유연한 설계를 하기 위해 인터페이스를 사용한다는 것인데 예제를 통해 알아보도록 하겠습니다.

고객 등급에 따라 할인율을 계산

고객 등급에 따라 할인율을 계산하는 UserLevelCalculator 라는 인터페이스를 생성하고, 고객 등급이 늘어남에 따라 추가될 수 있지만 현재는 브론즈, 실버, 골드 등급이 존재한다고 해봅시다.

public interface UserLevelCalculator {
    Double calculate(Double originalPrice);
    Boolean isTarget(String userLevel);
}

@Component
public class BronzeLevelCalculator implements UserLevelCalculator {
	@Overriding
    public Double calculate(Double originalPrice) {
    	return originalPrice * 0.9;
    }
    
    @Overriding
    public Boolean isTarget(String userLevel) {
    	return userLevel.equals("bronze");
    }
}

...

@Component
public class UserLevelService {
	@Autowired
	List<UserLevelCalculator> calculators;

	public Double calculate(Double originalPrice) {
		return calculators.stream()
                .filter(each -> each.isTarget(userLevel))
                .findFirst()
                .orElseThrow(() -> new RuntimeException("할인율을 계산할 수 없습니다."))
                .calculate(originalPrice);
    }
}

UserLevelCalculator 인터페이스를 구현하는 구현체로 BronzeLevelCalculator, SilverLevelCalculator, GoldLevelCalculator 구현 클래스를 작성했습니다.

만약 새로운 고객 등급이 추가되어 Platinum 등급이 추가된다고 하더라도 UserLevelService 코드는 수정할 필요가 없습니다. UserLevelCalculator 인터페이스를 상속받는 Platinum 등급에 대한 구현체를 만들어주기만 하면 됩니다.

인터페이스를 활용하지 않았다면 이런 유연성을 구현해내기가 쉽지 않습니다.

profile
?=!, 물음표를 느낌표로

0개의 댓글