본문 바로가기
Backend/JAVA

[JAVA] Store 프로젝트

by 그적 2020. 10. 23.

물품과 판매 데이터의 관리 프로그램
- 물품 : 판매 물품 기본 정보(물품 코드 / 이름 / 가격)
- 사용자 : 사용자 기본 정보(주문 아이디 / 사용자 / 주문 아이템 리스트)
- 주문 : 사용자가 판매 물품 여러 개를 개수 지정하여 선택
  (+주문 아이템 : 물품 * 개수)
    // 내부 클래스로 물품 여러개를 가지는 arraylist로 구현 후, 주문할 수 있도록 한다.

 

store 패키지
  - Store 클래스
  - User 클래스
  - Item 클래스
  - Order 클래스 >> (내부) OrderItem 클래스

mgr 패키지

  - Manager 클래스

  - Manageable 클래스

  - Factory 클래스

 

items.txt 입력 값 예시) F3286 델리투명자 1140

users.txt 입력 값 예시) lee lll 0

order.txt 입력 값 예시) 1 lee 20201010 O F3286 3 0

 

1. store 패키지의 Store 클래스

  // 메인 클래스이며, run() 함수를 통해 프로그램이 시작된다.

package store;

import mgr.*;

public class Store extends Manager{

    static Manager itemMgr = new Manager();
    static Manager userMgr = new Manager();
    static Manager orderMgr = new Manager();
	
	void run() {
		itemMgr.readAll("items.txt", new Factory() {
			public Manageable create() {
				return new Item();
			}
		});
		
		userMgr.readAll("users.txt", new Factory() {
			public Manageable create() {
				return new User();
			}
		});
		
		orderMgr.readAll("order.txt", new Factory() {
			public Manageable create() {
				return new Order();
			}
		});

		
		System.out.println("================= 판매 상품 리스트 =================");
		itemMgr.printAll();
		
		System.out.println("================= 전체 주문 리스트 =================");
		orderMgr.printAll();
		
		System.out.println("=============== 사용자별 주문 리스트 =================");
		userMgr.printAll();

	}

	   public static void main(String[] args) {
		// TODO Auto-generated method stub
		   
		Store store = new Store();
		store.run();
	}
}

 

2. mgr 패키지의 Manageable 인터페이스

  // Item, User, Order 클래스에서 공통 기능을 예상하여 추출해낸다.

package mgr;

import java.util.Scanner;

public interface Manageable {
    void read(Scanner scan);
    void print();
    void print(boolean b);
    boolean matches(String kwd);
}

 

3. mgr 패키지의 Manager 클래스

  // Item, User, Order 클래스의 상위 인터페이스(Manageable)를 관리할 클래스이다.

package mgr;

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;

public class Manager {
	public ArrayList<Manageable> mList = new ArrayList<>();
    
	public Manageable find(String kwd) {
	    for (Manageable m: mList)
	    	if (m.matches(kwd))
	    		return m;
	    return null;
	}
	public void readAll(String filename, Factory fac) {
		Scanner filein = openFile(filename);
		Manageable m = null;
		
		while (filein.hasNext()) {
			m = fac.create();
			m.read(filein);
			mList.add(m);
		}
		filein.close();
	}

	public void printAll() {
		for (Manageable m : mList) {
			m.print();
		}
	}
	public void search(Scanner keyScanner) {
		String kwd = null;
		while (true) {
			System.out.print(">> ");
			kwd = keyScanner.next();
			if (kwd.equals("end"))
				break;
			for (Manageable m : mList) {
				if (m.matches(kwd))
					m.print();
			}
		}
	}
	public Scanner openFile(String filename) {
		Scanner filein = null;
		try {
			filein = new Scanner(new File(filename));
		} catch (Exception e) {
			System.out.println(filename + ": ?????? ??????");
			System.exit(0);
		}
		return filein;
	}
}

 

4. store 패키지의 Item 클래스

  // @Override할 함수를 작성하고, Manageable을 implements 한다. 

package store;

import java.util.Scanner;

import mgr.Manageable;

public class Item implements Manageable{

    String itemName;
    String code;
    int price;

    @Override
    public void read(Scanner s){
        code = s.next();
        itemName = s.next();
        price = s.nextInt();
    }

	@Override
	public void print() {
		System.out.format("[%s] %s (%d원)", code, itemName, price);
		System.out.println();
	}
	
	@Override
	public void print(boolean b) {
		System.out.format("[%s] %d원 ", itemName, price);
	}

	@Override
	public boolean matches(String kwd) {
		if(code.contentEquals(kwd)) return true;
		if(itemName.contentEquals(kwd)) return true;
		if((price+"").contentEquals(kwd)) return true;
		return false;
	}
}

 

5. store 패키지의 User 클래스

  // Manageable을 implements한다. @Override할 메소드들을 작성하고, 추가 주문 기능을 addOrder로 작성하는데, 이때 매개변수로 Order 클래스에서 order를 받아온다.

package store;

import java.util.Scanner;
import mgr.Manageable;
import java.util.ArrayList;

public class User implements Manageable{
    String id;
    String pwd;
    int point;
    int waitPoint = 0;
    ArrayList<Order> orderList = new ArrayList<>();
    
    @Override
    public void read(Scanner s){
        id = s.next();
        pwd = s.next();
        point = s.nextInt();
    }

	@Override
	public void print() {
		print(true);
		for(Order ord: orderList) {
			ord.print();
		}
	}
	
	@Override
	public void print(boolean b) {
		System.out.format("[%s] (%d점) ", id, point);
		if(waitPoint != 0) System.out.format("결제대기 : %d점", waitPoint);
		System.out.println();
			
	}

	@Override
	public boolean matches(String kwd) {
		if(id.contentEquals(kwd)) return true;
		if(pwd.contentEquals(kwd)) return true;
		if((point+"").contentEquals(kwd)) return true;
		return false;
	}
	
	void addOrder(Order order){
		orderList.add(order);
		if(!order.payed)
			waitPoint = waitPoint + order.point;
		this.point = this.point + order.point;
	}
}

 

6. store 패키지의 Order 클래스

  // Manageable을 implements한다. @Override할 메소드들을 작성하고, 내부 클래스에 OrderedItem을 넣어 여러 개의 아이템을 입력받을 수 있다.

package store;

import java.util.Scanner;
import mgr.Manageable;
import java.util.ArrayList;

public class Order implements Manageable{
    int orderId;
    User user;
    String date;
    boolean payed;
    int point;
    ArrayList<Order.OrderedItem> orderedItemList = new ArrayList<>();
    
    @Override
    public void read(Scanner s){
        orderId = s.nextInt();
        
        String tmpUser = s.next();
        user = (User)Store.userMgr.find(tmpUser);
        

        date = s.next();
        String tmpPayed = s.next();
        if(tmpPayed.contentEquals("O"))
        	payed = true;
        else 
        	payed = false;
        
        
        while(true) {
        	String code = s.next();
        	if(code.contentEquals("0"))
        		break;
        	Item item = (Item)Store.itemMgr.find(code);
        	if(item == null) {
        		System.out.println("해당 코드 상품 없음 : "+code);
        		continue;
        	}
        	orderedItemList.add(new OrderedItem(item, s));
        }

    	for(OrderedItem ord : orderedItemList) {
    		point = point + ord.subtotal()/1000;
    	}
    	user.addOrder(this);
    }

	@Override
	public void print() {
		System.out.format("[주문아이디:%d] 사용자 :%s - 포인트 : %d점 ", orderId, user.id, point);
		if(!payed) System.out.print("(결제 대기)");
		System.out.println();
		for(OrderedItem od : orderedItemList) {
			System.out.print("\t");
			od.print();
		}
	}
	
	@Override
	public void print(boolean b) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean matches(String kwd) {
		if((orderId+"").contentEquals(kwd)) return true;
		
		if(date.contentEquals(kwd)) return true;
		return false;
	}

    public class OrderedItem {
    	Item item;
    	int howMany;
    	
    	public OrderedItem(Item item2, Scanner s) {
    		item = item2;
    		howMany = s.nextInt();		
    	}

    	public void print() {
    		item.print(true);
    		System.out.format(" x %d = %d원", howMany, subtotal());
    		System.out.println();
    	}
    	
    	int subtotal() {
    		int result = howMany*item.price;
    		return result;
    	}
    }
}

 

7. mgr 패키지의 Factory 클래스

  // 각각의 Item, User, Order 클래스들은 Manageable 인터페이스를 상속한다. 이전에 Manager 클래스는 Item, User, Order 클래스들을 관리할 것이라고 했는데, 이 각각을 관리할 itemMgr, userMgr, orderMgr 이름의 Manager 객체들을 생성해내서 관리하도록 한다. 여기까지 이해가 되었다면 itemMgr과 item 클래스를 매칭 할 클래스가 필요한데 그 역할 바로 "Factory 클래스"가 하는 것이다.

 

package mgr;

public interface Factory {
	public Manageable create();
}

 

댓글