java

실습) 객체 지향 프로그래밍 원칙을 활용한 주문 관리 시스템

dalc3154 2025. 3. 6. 15:59


SOLID 원칙
SRP: 단일 책임 원칙
OCP: 개방 폐쇄 원칙
LSP: 리스코프 치환 원칙 - 자식 클래스가 부모 클래스를 대체가능
ISP: 인터페이스 분리 원칙
DIP: 의존 역전 원칙 - 클래스 간의 결합을 낮추고, 추상화에 의존

// SOLID 원칙을 활용한 주문 관리 시스템

// SRP - Order클래스는 주문 정보를 저장하는 역할만 담당
class Order {
	private String orderId;// 각 주문의 식별번호
	private int amount; // 주문 금액
	
	public Order(String orderId, int amount) {
		this.orderId = orderId;
		this.amount = amount;
	}
	
	public String getOrderId() {return orderId;}
	public int getAmount() {return amount;}		
}

// OCP, DIP - 결제 프로세스를 추상화한 인터페이스 생성
interface PaymentProcessor{
	void processPayment(Order oreder);// 주문 객체를 받아 결제를 처리하는 메소드
}

class CreditCardPaymentProcessor implements PaymentProcessor{
	@Override
	public void processPayment(Order order) {
		System.out.println("신용카드로 결제합니다:" + order.getOrderId());
	}
}
class SamSungPaymentProcessor implements PaymentProcessor{
	@Override
	public void processPayment(Order order) {
		System.out.println("삼성페이로 결제합니다:" + order.getOrderId());
	}
}

// ISP - 주문 보고서 생성을 위한 별도의 인터페이스
interface GenerateReport{
	void generateReport(Order order);
}

class PdfRefortGenerator implements GenerateReport{
	@Override
	public void generateReport(Order order) {
		System.out.println("주문 정보 보고서를 PDF 파일로 생성: " + order.getOrderId());
	}
}

// DIP - OrderService 클래스는 결제 및 보고서 생성 인터페이스에 의존

class OrderService {
	private final PaymentProcessor paymentProcessor;
	private final GenerateReport generateReport;
	
	// 생성자에서 결제 처리기 & 보고서 생성기 객체를 주입(인터페이스와의 의존을 주입)
	public OrderService(PaymentProcessor paymentProcessor, GenerateReport generateReport) {
		this.paymentProcessor = paymentProcessor;
		this.generateReport = generateReport;
	}
	
	void placeOrder(Order order) {
		paymentProcessor.processPayment(order);
		generateReport.generateReport(order);
		System.out.println("주문 완료");
	}
}


public class C_OOP_Prac {
	public static void main(String[] args) {
		
		PaymentProcessor CreditCardPaymentProcessor = new CreditCardPaymentProcessor();
		PaymentProcessor SamSungPayProcessor = new SamSungPaymentProcessor();
		GenerateReport generateReport = new PdfRefortGenerator();
		
		OrderService orderService1 = new OrderService(CreditCardPaymentProcessor, generateReport);
		OrderService orderService2 = new OrderService(SamSungPayProcessor, generateReport);
		
		// 여러개의 주문 객체 생성
		Order order1 = new Order("1", 18000);
		Order order2 = new Order("2", 22000);
		Order order3 = new Order("3", 15000);
		Order order4 = new Order("4", 11000);
		
		// 주문 처리 실행
		orderService1.placeOrder(order1);
		orderService1.placeOrder(order2);
		orderService2.placeOrder(order3);
		orderService2.placeOrder(order4);
	}
}

'java' 카테고리의 다른 글

40. 객체 지향 프로그래밍(OOP)  (0) 2025.03.06
실습) 재고 관리 시스템 만들기  (1) 2025.03.06
실습) 도서 관리 시스템  (0) 2025.03.06
39. 컬렉션 프레임워크-Map  (0) 2025.03.06
38. 컬렉션 프레임워크-Set  (1) 2025.03.06