5. 새롭게 추가된 요구사항
만약 해당 프로그램에 다음과 같은 새로운 기능 요구사항이 추가되었을 경우?
- 다양한 결제 방식 지원(카드 / 포인트 / 현금 등)
- 사용자는 음식 주문 후 결제 수단을 선택할 수 있음
- 시스템은 사용자가 선택한 방식에 따라 다른 결제 로직을 수행해야 함
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