물품과 판매 데이터의 관리 프로그램
- 물품 : 판매 물품 기본 정보(물품 코드 / 이름 / 가격)
- 사용자 : 사용자 기본 정보(주문 아이디 / 사용자 / 주문 아이템 리스트)
- 주문 : 사용자가 판매 물품 여러 개를 개수 지정하여 선택
(+주문 아이템 : 물품 * 개수)
// 내부 클래스로 물품 여러개를 가지는 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();
}
'Backend > JAVA' 카테고리의 다른 글
[JAVA] split 함수 .(점) 동작 안될때 (java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 에러) (0) | 2022.04.21 |
---|---|
[JAVA] 이차원 문자열 배열 정렬 (2) | 2021.02.06 |
[JAVA] 학과 프로그램 #5 - 강의 수강 기능 추가(+파일) (0) | 2020.10.03 |
[JAVA] 학과 프로그램 #4 - 점수 기능 추가하기(+파일) (0) | 2020.09.20 |
[JAVA] 학과 프로그램 #3 - 검색 기능 추가하기 (0) | 2020.09.20 |
댓글