[Java] 다형성 & 객체지향 프로그래밍

정석·2024년 2월 4일

Java

목록 보기
37/39
post-thumbnail

김영한의 자바 강의를 듣고 정리하였습니다.

1. OCP 원칙

객체 지향 설계 원칙 중 하나이다.

  • Open for extension : 새로운 기능의 추가나 변경 사항이 생겼을 때, 기존 코드는 확장할 수 있어야 함.
  • Closed for modification : 기존 코드는 수정되지 않아야 함.

쉽게 말해, 클라이언트 코드는 변경 되지 않아야 하며 기능적 수행 부분만 확장할 수 있도록 해야 한다.
이러한 코드 설계를 위해 역할구현 을 잘 분리해야 한다.

💡 간단하게 코드가 수정되는 부분 & 수정되지 않는 부분으로 나눌 수 있어야 한다.

수정되는 부분 -> 기능 = 서버
수정되지 않는 부분 -> 클라이언트 = 역할 = 인터페이스

운전자와 자동차로 비유

운전자와 그가 운전 할 수 있는 차를 구현한 코드가 있다고 생각해보자. 차를 운전하려면 운전자에게 차에 대한 코드를 제공하면 된다. 이때 새로운 차가 등장한다고해도 운전자의 코드는 바뀌지 않는다. 차의 종류 부분만 확장 할 수 있는 것이다.


2. 결제 시스템 예제

✓ 사용자에게 결제 시스템과 가격을 입력 받으면 결제 시스템 유효성을 검사하고 존재하는 결제 방법이면 값을 반환한다.

  • Pay 인터페이스
public interface Pay {
    boolean pay(int amount);
}

인터페이스를 생성하여 결제 시스템의 틀을 정해준다.


  • 첫번째 Pay 시스템 - KaKaoPay
public class KaKaoPay implements Pay {
    @Override
    public boolean pay(int amount) {
        System.out.println("카카오페이 시스템과 연결합니다.");
        System.out.println(amount + "원 결제를 시도합니다.");

        return true;
    }
}

  • 두번째 Pay 시스템 - NaverPay
public class NaverPay implements Pay {

    @Override
    public boolean pay(int amount) {
        System.out.println("네이버페이 시스템과 연결합니다.");
        System.out.println(amount + "원 결제를 시도합니다.");

        return true;
    }
}

  • 존재하지 않는 Pay 시스템시 사용될 DefaultPay
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);
        }
    }
}

0개의 댓글