Skip to Content
Suffering builds character
아카이브10.Java특징프로그래밍 패러다임5. 새롭게 추가된 요구사항

5. 새롭게 추가된 요구사항

만약 해당 프로그램에 다음과 같은 새로운 기능 요구사항이 추가되었을 경우?

  1. 다양한 결제 방식 지원(카드 / 포인트 / 현금 등)
  2. 사용자는 음식 주문 후 결제 수단을 선택할 수 있음
  3. 시스템은 사용자가 선택한 방식에 따라 다른 결제 로직을 수행해야 함

1. C언어로 구현한 코드 예시

C언어로 해당 요구사항을 구현한다면 다음과 같음

17 ~ 24 라인에서 if-else를 통한 분기문을 통해 결제 방식을 구분하여 처리

main.c
#include <stdio.h> int menuSelection() { int menu; printf("메뉴를 선택하세요 (1. 김밥 - 3000원, 2. 라면 - 4000원): "); scanf("%d", &menu); return menu; } int calculatePrice(int menu) { if (menu == 1) return 3000; else if (menu == 2) return 4000; else return 0; } void processPayment(int method, int amount) { if (method == 1) { printf("현금 %d원을 받았습니다.\n", amount); } else if (method == 2) { printf("카드로 %d원을 결제했습니다.\n", amount); } else if (method == 3) { printf("포인트로 %d원을 차감했습니다.\n", amount); } else { printf("잘못된 결제 방식입니다.\n"); } } int main() { int menu = menuSelection(); int price = calculatePrice(menu); if (price == 0) { printf("잘못된 메뉴입니다.\n"); return 0; } printf("주문 완료. 금액: %d\n", price); int method; printf("결제 방식을 선택하세요 (1: 현금, 2: 카드, 3: 포인트): "); scanf("%d", &method); processPayment(method, price); return 0; }

2. Java로 구현한 코드 예시

결제 방식을 다양화할 수 있는 인터페이스(Payment)를 통해 확장에 용이한 구조로 구현 가능

Main.java
// 결제 인터페이스 interface Payment { void pay(int amount); } // 구체 클래스: 현금 결제 -> 각 결제 방식들은 자신의 방식만 책임지고 처리 class CashPayment implements Payment { public void pay(int amount) { System.out.println("현금 " + amount + "원을 받았습니다."); } } // 구체 클래스: 카드 결제 class CardPayment implements Payment { public void pay(int amount) { System.out.println("카드로 " + amount + "원을 결제했습니다."); } } // 구체 클래스: 포인트 결제 class PointPayment implements Payment { public void pay(int amount) { System.out.println("포인트로 " + amount + "원을 차감했습니다."); } } // 주문 클래스 class Order { private int menuNumber; private int price; public void selectMenu(int menuNumber) { this.menuNumber = menuNumber; if (menuNumber == 1) price = 3000; else if (menuNumber == 2) price = 4000; else price = 0; } public int getPrice() { return price; } public boolean isValid() { return price > 0; } } // 결제 처리기 class PaymentProcessor { private Payment payment; public PaymentProcessor(Payment payment) { this.payment = payment; } public void process(int amount) { // 결제 방식이 바뀌어도 동일한 인터페이스로 호출, 확장성 용이 payment.pay(amount); } } // 실행 클래스 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Order order = new Order(); System.out.print("메뉴를 선택하세요 (1. 김밥 - 3000원, 2. 라면 - 4000원): "); int menu = scanner.nextInt(); order.selectMenu(menu); if (!order.isValid()) { System.out.println("잘못된 메뉴입니다."); return; } System.out.println("주문 완료. 금액: " + order.getPrice() + "원"); System.out.print("결제 방식을 선택하세요 (1: 현금, 2: 카드, 3: 포인트): "); int payMethod = scanner.nextInt(); Payment payment; switch (payMethod) { case 1: payment = new CashPayment(); break; case 2: payment = new CardPayment(); break; case 3: payment = new PointPayment(); break; default: System.out.println("잘못된 결제 방식입니다."); return; } PaymentProcessor processor = new PaymentProcessor(payment); processor.process(order.getPrice()); } }

3. 언어 별 비교

언어 별 차이를 요약하면 다음과 같음

요소Java (OOP)C (절차지향)
확장성결제 방식 추가 시 클래스만 추가하면 됨 (기존 코드의 수정이 거의 없음)if / switch 조건을 추가해야 함
책임 분리Order, PaymentMethod, PaymentProcessor로 역할 분산모든 로직이 main 또는 전역 함수에 있음
다형성(Polymorphism)인터페이스를 통해 동적으로 결제 방식 처리조건문으로 처리
재사용성결제 방식을 독립적으로 재사용 가능로직이 고정되어 있음
유지보수구조적이고 변경에 강함변경 시 유지보수가 어려움
Last updated on