개발/자바

쇼핑몰 주문 정보를 추상 클래스를 이용한 구현 예제

피터JK 2025. 2. 19. 19:52
728x90

쇼핑몰 주문 시스템을 파일과 패키지로 구조화하면 유지보수와 확장성이 좋아집니다. 다음과 같은 패키지 구조를 추천합니다.


📂 패키지 구조

com.shoppingmall
 ├── order
 │    ├── Order.java                 # 주문 추상 클래스
 │    ├── RegularOrder.java           # 일반 주문 클래스
 │    ├── PreOrder.java               # 예약 주문 클래스
 │    ├── SubscriptionOrder.java      # 정기 구독 주문 클래스
 ├── service
 │    ├── OrderService.java           # 주문 서비스 (추후 주문 관리 기능 추가)
 ├── main
 │    ├── ShoppingMallOrderSystem.java # 메인 실행 클래스

📌 1. com.shoppingmall.order 패키지

Order.java (추상 클래스)

package com.shoppingmall.order;

public abstract class Order {
    protected String orderId;
    protected String customerName;
    protected String orderDate;
    protected double totalAmount;

    public Order(String orderId, String customerName, String orderDate, double totalAmount) {
        this.orderId = orderId;
        this.customerName = customerName;
        this.orderDate = orderDate;
        this.totalAmount = totalAmount;
    }

    public void printOrderDetails() {
        System.out.println("주문 ID: " + orderId);
        System.out.println("고객명: " + customerName);
        System.out.println("주문일: " + orderDate);
        System.out.println("총 금액: " + totalAmount);
    }

    public abstract void processPayment();
    public abstract void updateOrderStatus();
}

RegularOrder.java

package com.shoppingmall.order;

public class RegularOrder extends Order {
    public RegularOrder(String orderId, String customerName, String orderDate, double totalAmount) {
        super(orderId, customerName, orderDate, totalAmount);
    }

    @Override
    public void processPayment() {
        System.out.println("일반 주문 - 카드 결제 완료");
    }

    @Override
    public void updateOrderStatus() {
        System.out.println("일반 주문 - 배송 준비 중");
    }
}

PreOrder.java

package com.shoppingmall.order;

public class PreOrder extends Order {
    private String expectedDeliveryDate;

    public PreOrder(String orderId, String customerName, String orderDate, double totalAmount, String expectedDeliveryDate) {
        super(orderId, customerName, orderDate, totalAmount);
        this.expectedDeliveryDate = expectedDeliveryDate;
    }

    @Override
    public void processPayment() {
        System.out.println("예약 주문 - 부분 결제 완료");
    }

    @Override
    public void updateOrderStatus() {
        System.out.println("예약 주문 - 상품 준비 중 (예상 배송일: " + expectedDeliveryDate + ")");
    }
}

SubscriptionOrder.java

package com.shoppingmall.order;

public class SubscriptionOrder extends Order {
    private int subscriptionPeriod;

    public SubscriptionOrder(String orderId, String customerName, String orderDate, double totalAmount, int subscriptionPeriod) {
        super(orderId, customerName, orderDate, totalAmount);
        this.subscriptionPeriod = subscriptionPeriod;
    }

    @Override
    public void processPayment() {
        System.out.println("정기 구독 - 매월 자동 결제");
    }

    @Override
    public void updateOrderStatus() {
        System.out.println("정기 구독 - 활성 상태 (" + subscriptionPeriod + "개월)");
    }
}

📌 2. com.shoppingmall.service 패키지

OrderService.java (주문 관리 서비스)

package com.shoppingmall.service;

import com.shoppingmall.order.Order;

import java.util.ArrayList;
import java.util.List;

public class OrderService {
    private List<Order> orderList = new ArrayList<>();

    public void addOrder(Order order) {
        orderList.add(order);
        System.out.println("주문이 추가되었습니다: " + order.orderId);
    }

    public void processAllOrders() {
        for (Order order : orderList) {
            order.processPayment();
            order.updateOrderStatus();
        }
    }
}

📌 3. com.shoppingmall.main 패키지

ShoppingMallOrderSystem.java (메인 실행 클래스)

package com.shoppingmall.main;

import com.shoppingmall.order.*;
import com.shoppingmall.service.OrderService;

public class ShoppingMallOrderSystem {
    public static void main(String[] args) {
        Order regularOrder = new RegularOrder("ORD001", "김철수", "2025-02-19", 50000);
        Order preOrder = new PreOrder("ORD002", "이영희", "2025-02-19", 70000, "2025-03-10");
        Order subscriptionOrder = new SubscriptionOrder("ORD003", "박민수", "2025-02-19", 20000, 6);

        OrderService orderService = new OrderService();
        orderService.addOrder(regularOrder);
        orderService.addOrder(preOrder);
        orderService.addOrder(subscriptionOrder);

        System.out.println("\n=== 모든 주문 처리 시작 ===");
        orderService.processAllOrders();
    }
}

✅ 정리

이렇게 패키지를 분리하면 코드의 역할이 명확해지고 유지보수가 쉬워집니다.

  • order 패키지: 주문 관련 클래스
  • service 패키지: 주문 관리 서비스
  • main 패키지: 실행 클래스

이제 추가적인 기능(예: 데이터베이스 연결, REST API)을 구현할 때도 패키지를 확장하여 관리할 수 있습니다. 

728x90