김영한의 자바 강의를 듣고 정리하였습니다.
객체 지향 설계 원칙 중 하나이다.
쉽게 말해, 클라이언트 코드는 변경 되지 않아야 하며 기능적 수행 부분만 확장할 수 있도록 해야 한다.
이러한 코드 설계를 위해 역할 과 구현 을 잘 분리해야 한다.
💡 간단하게 코드가 수정되는 부분 & 수정되지 않는 부분으로 나눌 수 있어야 한다.
수정되는 부분 -> 기능 = 서버
수정되지 않는 부분 -> 클라이언트 = 역할 = 인터페이스
운전자와 그가 운전 할 수 있는 차를 구현한 코드가 있다고 생각해보자. 차를 운전하려면 운전자에게 차에 대한 코드를 제공하면 된다. 이때 새로운 차가 등장한다고해도 운전자의 코드는 바뀌지 않는다. 차의 종류 부분만 확장 할 수 있는 것이다.
✓ 사용자에게 결제 시스템과 가격을 입력 받으면 결제 시스템 유효성을 검사하고 존재하는 결제 방법이면 값을 반환한다.
public interface Pay {
boolean pay(int amount);
}
인터페이스를 생성하여 결제 시스템의 틀을 정해준다.
public class KaKaoPay implements Pay {
@Override
public boolean pay(int amount) {
System.out.println("카카오페이 시스템과 연결합니다.");
System.out.println(amount + "원 결제를 시도합니다.");
return true;
}
}
public class NaverPay implements Pay {
@Override
public boolean pay(int amount) {
System.out.println("네이버페이 시스템과 연결합니다.");
System.out.println(amount + "원 결제를 시도합니다.");
return true;
}
}
public class DefaultPay implements Pay {
@Override
public boolean pay(int amount) {
System.out.println("결제 수단이 없습니다.");
return false;
}
}
Pay 시스템을 찾는 코드에서 Null 값에 대한 return 을 없애기 위해 생성했다.
public abstract class PayStore {
public static Pay findPay(String option) {
Pay pay;
//결제 옵션 선택 / 결제
switch (option) {
case "kakao":
return new KaKaoPay();
case "naver":
return new NaverPay();
case "cashPay":
return new CashPay();
default:
return new DefaultPay();
}
}
}
public class PayService {
public void processPay(String option, int amount) {
//결제 시작
System.out.println("결제를 시작합니다 : option= "+ option + ", amount = " + amount);
//결제 수단 찾기
Pay pay = PayStore.findPay(option);
boolean result = pay.pay(amount);
if(result) {
System.out.println("결제가 성공했습니다");
} else {
System.out.println("결제가 실패했습니다");
}
}
}
public class PayMain2 {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
PayService payService = new PayService();
while (true) {
System.out.print("결제 수단을 입력하세요 : ");
String payOption = input.readLine();
if (payOption.equals("exit")) {
System.out.println("프로그램을 종료합니다.");
return;
}
System.out.print("결제 금액을 입력하세요 : ");
int amount = Integer.parseInt(input.readLine());
payService.processPay(payOption, amount);
}
}
}