Language/JAVA

JAVA 간단한 프로그램 - 상품 관리 프로그램 (평가)

print(blue) 2024. 4. 29. 11:33

https://print-blue.tistory.com/170

class Main Item
field   - id : int
- itemName : String
- price : Integer
- quantity : int
method + main(args: String[])
: void
+ Item (id : int, itemName : String,
            price : Integer, quantity : int)
+ showInfo() : void
설명 - 사용자에게 메뉴 1 ~7의 정수 중 1개를 입력 받음
- 정수 7를 입력하지 않은 한, 계속 반본적으로 실행

- 생성자

 

class ItemBusinessRule ItemView
field - store : Item[100] {read only}
- sequence : int
+ INPUT : scanner {read only}
method + save() : void
- findById(itemId : int) : item
+ find() : void
+ updata() : void
+ delete() void
+ findAll() : void
+ clearStore() : void
+ showMenu() : void
설명 - save
: 상품명, 가격, 개수를 입력 받아서 store 에 Item 객체를 저장
: Item 객체의 id field 는 1씩 증가
(한번 사용된 id 는 다시 사용하지 않음)

- findById
: id 에 해당하는 Item 객체 리턴

- find
: id 에 해당하는 정보 출력 - findById 호출

- updata
: id 에 해당하는 상품의 가격과 개수 수정 - findById 호출

- delete
: id 에 해당하는 상품 삭제 - findById 호출

- findAll
: 저장된 전체 상품 출력

- clearStore
: 저장된 모든 상품 삭제
- 아래 문구 출력
<< 상품 관리 >>
1. 상품 저장
2. 상품 조회
3. 상품 수정
4. 상품 삭제
5. 상품 전체 조회
6. 상품 전체 삭제
7. 프로그램 종료


원하는 기능을 선택하세요 ...

 

 

[문항 1]
아래 그림과 같이 패키지와 파일을 추가하시오. [5점]
[문항 2]
Main.java 파일에 코드를 작성하시오. [5점]
[문항 3]
1. Item.java 파일 코드를 작성하시오. [10점]
2. field를 선언하시오. [5점]
3. showInfo() method를 정의하시오. [5점]
[문항 4]
ItemBusinessRule.java 파일에 코드를 작성하시오. [75점]
1. store field를 선언하시오. [5점]
2. sequence field를 선언하시오. [5점]
3. save method를 정의하시오. [10점]
4. findById method를 정의하시오. [10점]
5. find method를 정의하시오. [10점]
6. update method를 정의하시오. [10점]
7. delete method를 정의하시오. [10점]
8. findAll method를 정의하시오. [10점]
9. clearStore method를 정의하시오. [5점]
[문항 5]
1. INPUT field를 선언하시오. [2점]
2. showMenu method를 정의하시오. [3점]

 

 

 


문항 1번은 전체 파일을 업로드 하는 거니 패스하고

 

[문항 2]
Main.java 파일에 코드를 작성하시오. [5점]

 

Main 클래스에 main () 메소드에서 작업이 이루어지면 된다.

사용자에게 메뉴 1 ~ 7의 정수 중 1개를 입력 받고, 정수 7를 입력하지 않는 한, 계속 반복적으로 실행되면 된다.

 

여기서 나는 입력받는 타입을 int 가 아닌 String 으로 할 건데

그 이유는 만약 잘못 입력해서 문자를 입력했을 때 타입 에러가 떠서 실행이 종료가 되는데

이를 방지하고자 입력 받는 건 숫자로, 받아들일 땐 문자열로 처리해서 받을 것이다.

 

이미 문제에서 어떤 파일에 필드와 메소드를 구현하라고 제시했기때문에

구현하지 않은 상태에서 Main 클래스를 정의할 것이다

 

import item.ItemBusinessRule;
import item.ItemView;

 

 

일단 같은 패키지에 있는 것이 아니여서 item 패키지에 있는 ItemBusinessRule 클래스와 ItemView 클래스를 import 하였다.

 

import item.ItemBusinessRule;
import item.ItemView;

public class Main {

	private static ItemBusinessRule manager = new ItemBusinessRule();
	
	public static void main(String[] args) {
    	...
	}
}

 

ItemBusinessRule 클래스의 메소드를 호출하기 위해 static 필드로 설정하였다.

 

import item.ItemBusinessRule;
import item.ItemView;

public class Main {

	private static ItemBusinessRule manager = new ItemBusinessRule();
	
	public static void main(String[] args) {

		String userValue;
		
		menu:
		while (true) {
			ItemView.showMenu();
			
			userValue = ItemView.INPUT.next();
            ...
		}
		ItemView.INPUT.close();
	}
}

 

그리고 ItemView 클래스에서 Scanner 객체를 생성하는 필드를 정의 했고, 하나만 사용할 예정이라

이 또한 static final 필드로 정의 해줬다. (문제에서 정의해줌)

 

Main 클래스를 정의하기 전에 

[문항 5]
1. INPUT field를 선언하시오. [2점]
2. showMenu method를 정의하시오. [3점]

 

먼저 해결하는 것이 코드의 이해를 더할 것 같아 미리 작성 !

 

package item;

import java.util.Scanner;

public class ItemView {

	// field
	public static final Scanner INPUT = new Scanner(System.in);

	public static void showMenu() {
		System.out.println("\n<< 상품 관리 >>"
				+ "1. 상품 저장"
				+ "2. 상품 조회"
				+ "3. 상품 수정"
				+ "4. 상품 삭제"
				+ "5. 상품 전체 조회"
				+ "6. 상품 전체 삭제"
				+ "7. 프로그램 종료"
				+ "\n원하는 기능을 선택하세요 ... ");
	}
}

 

iteam 패키지에 ItemView 클래스에는 Scanner 객체를 만드는 필드와 메뉴 문구 출력하는 메소드를 정의하면 된다.

static final 필드는 상수이기 때문에 대문자로 INPUT 라 변수명 쓰면 된다.

이렇게 정의하면 IteamView 클래스는 끝 !

 

다시 Main 클래스로 돌아가자

아까 앞서 말했듯 사용자에게 받는 정수는 String 타입으로 받는다 이야기 했다.

import item.ItemBusinessRule;
import item.ItemView;

public class Main {

	private static ItemBusinessRule manager = new ItemBusinessRule();
	
    public static void main(String[] args) {

        String userValue;

        menu:
        while (true) {
            ItemView.showMenu();

            userValue = ItemView.INPUT.next();
            switch(userValue) {
            case "1":
                manager.save();
                break;
            case "2": 
                manager.find();
                break;	
            case "3": 
                manager.update();
                break;
            case "4": 
                manager.delete();
                break;
            case "5": 
                manager.findAll();
                break;
            case "6": 
                manager.clearStore();
                break;
            case "7": 
                System.out.println("프로그램이 종료되었습니다.");
                break menu;
            }
        }
        ItemView.INPUT.close();
    }
}

 

Scanner 객체 사용 후 메모리 해지 하는 부분은 잊지 말도록 !!

그럼 이제  Main 클래스 정의도 끝 !

 

 

[문항 3]
1. Item.java 파일 코드를 작성하시오. [10점]
2. field를 선언하시오. [5점]
3. showInfo() method를 정의하시오. [5점]

 

이제 item 패키지에 있는 Item 클래스를 정의하도록 하자

문제에 나와있듯 필드와 showInfo() 를 해주자

package item;

public class Item {
	private int id;
	private String itemName;
	private Integer price;
	private int quantity;

	public Item(int id, String itemName, Integer price, int quantity) {
		this.id = id;
		this.itemName = itemName;
		this.price = price;
		this.quantity = quantity;
	}

	public void showInfo() {
		System.out.printf("%d\t%s\t\t%d\t%d\n", this.id, this.itemName, this.price, this.quantity);
	}
}

 

일단 문제에서 요구했던 부분까지 구현하도록 했다 .

ItemBusinessRule 클래스를 구현하면서 수정될 수 있으니 일단 보류 !

 

먼저 ItemBusinessRule 클래스로 와보자

[문항 4]
ItemBusinessRule.java 파일에 코드를 작성하시오. [75점]
1. store field를 선언하시오. [5점]
2. sequence field를 선언하시오. [5점]
3. save method를 정의하시오. [10점]
4. findById method를 정의하시오. [10점]
5. find method를 정의하시오. [10점]
6. update method를 정의하시오. [10점]
7. delete method를 정의하시오. [10점]
8. findAll method를 정의하시오. [10점]
9. clearStore method를 정의하시오. [5점]

 

 

일단 문제에서 요구했던 메소드를 전체적으로 구현했다. (기능 구현은 아직)

package item;

public class ItemBusinessRule {

	private static final Item[] store = new Item[100];
	private static int sequence = 0;

	// 상품 아이디 찾기 ============================================
	private Item findById(int itemId) {
	}
	// [1] 상품 저장 ===============================================
	public void save() {
	}

	// [2] 상품 조회 ===============================================
	public void find() {
	}

	// [3] 상품 수정 ===============================================
	public void update() {
	}

	// [4] 상품 삭제 ===============================================
	public void delete() {
	}
	// [5] 상품 전체 조회 ==========================================
	public void findAll() {
		}
	}
	// [6] 상품 전체 삭제 ==========================================
	public void clearStore() {
	}
}

 

 

이제 차례대로 시작 !

 

첫번째로 1번 상품 저장 !

일단 기능을 구현하기 전에 전체적인 흐름부터 생각한 다음 기능 구현하는 것이 좋다.

store 의 배열은 100으로 한정 지어났다. 

만약 상품 101개 입력 받았을 때 배열의 길이가 초과하여 에러가 발생한다 .

추후의 문제를 위해 수량을 체크하는 sequence 가 100 이상일 경우 더 이상 저장할 수 없다는 문구를 출력해주자.

 

sequence 는 0 으로 초기화 했으니 후증가로 Item 객체가 생성할 때 1씩 증가하도록 하고, 

id 도 객체가 생성할 때 후증가하여  1씩 증가하도록 했다.

 

프로그램 실행 후 상품 1개를 입력했을 때 아래 표처럼 될 것이다 !

store 배열 index 0 1 2 ... 99
배열의 요소값 상품 1번 null null null null
public void save() {
    if (sequence >= 100) {
        System.out.println("더 이상 저장할 수 없습니다.\n");
        return;
    }

    System.out.print("상품명, 가격, 수량을 순서대로 입력하세요 ... ");
    String name = ItemView.INPUT.next();
    Integer price = ItemView.INPUT.nextInt();
    int quantity = ItemView.INPUT.nextInt();

    store[sequence++] = new Item(id++, name, price, quantity);
    System.out.println("상품 정보가 저장되었습니다.");
}

 

 

그럼 이제 2번 상품 조회 !

상품 조회 / 수정 / 삭제는 findById () 메소드를 활용하라 하였다 

 

사용자가 찾고자 하는 상품의 id 값을 입력하면 저장되어있는 store 의 배열을 순회하면서 해당 객체의 정보를 받아오는

메소드이다 !

 

코드로 구현해보자

// 상품 아이디 찾기 ============================================
private Item findById(int itemId) {
    for (int i=0; i<sequence; i++) {
        ...
    }
    return null;
}

 

일단 저장된 상품의 수를 저장하기 위해 sequence 를 사용했다 

그래서 sequence 만큼 돌면서 store 인덱스에 접근해 저장된 객체의 id 를 가져올 것이다 

근데 getId 는 구현 안했다 !

 

구현하게 Item 클래스로 이동 !

package item;

public class Item {
    private int id;
    private String itemName;
    private Integer price;
    private int quantity;

    public Item() {}

    public Item(int id, String itemName, Integer price, int quantity) {
        this.id = id;
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }

    ...

    public int getId() { // 추가 !
        return this.id;
    }

    public void showInfo() {
        System.out.printf("%d\t%s\t\t%d\t%d\n", this.id, this.itemName, this.price, this.quantity);
    }
}

 

자 이제 id 를 가져와보자

// 상품 아이디 찾기 ============================================
private Item findById(int itemId) {
    for (int i=0; i<sequence; i++) {
        if (store[i].getId() == itemId) {
            return store[i];
        }
    }
    return null;
}

 

문제에서 요구했듯 반환형은 Item 이다 그럼 return 으로 찾고자 하는 id 를 가진 객체를 return 해주면 된다

만약 없으면 null 로 return !

그럼 findById () 메소드는 구현 완료 !

 

그럼 상품 조회하는 메소드를 정의하자

1. 사용자에게 원하는 상품 id 를 받는다

2. findById () 메소드를 활용하여 해당 객체를 반환 받는다

3. 반환된 값이 null 이 아닌 경우 즉, 잘 찾았으면 값이 있으니까 ! 값이 있으면 객체의 showInfo () 메소드를 호출

4. 만약 반환된 값이 null 인 경우 찾는 객체가 없으니 찾고자 하는 상품 id 가 없다고 문구 출력 !

 

코드로 구현해보자

// [2] 상품 조회 ===============================================
public void find() {
    System.out.print("조회를 원하는 아이디를 입력하세요 ... ");
    int itemId = ItemView.INPUT.nextInt();
    Item searchInfo = findById(itemId);

    if (searchInfo != null) {
        searchInfo.showInfo();
        System.out.println();
    } else {
        System.out.printf("아이디 %s인 상품이 없습니다.", itemId);
        return;
    }
}

 

 

3번째 상품 수정 !!

수정하고자 하는 상품 id 를 사용자에게 받아 

가격과 수량을 입력 받고, 해당 상품에 적용하면 된다 !

 

// [3] 상품 수정 ===============================================
public void update() {
    System.out.print("수정하기 원하는 아이디 입력하세요 ... ");
    int itemId = ItemView.INPUT.nextInt();
    Item searchInfo = findById(itemId);

    if (searchInfo != null) {
        System.out.print("가격, 수량을 입력하세요 ... ");
        Integer price = ItemView.INPUT.nextInt();
        int quantity = ItemView.INPUT.nextInt();

        // 이 부분에 수정하는 코드 집어 넣기
        
        System.out.println("상품 수정이 완료되었습니다.");
        return;
    } 
    System.out.printf("아이디 %s인 상품이 없습니다.\n", itemId);
}

 

근데 Item 에서 가격과 수량 즉, 매개변수 2개를 받는 생성자가 없다 

그렇담 정의해주면 되지 !

package item;

public class Item {
	private int id;
	private String itemName;
	private Integer price;
	private int quantity;

	public Item() {}
	
	public Item(int id, String itemName, Integer price, int quantity) {
		this.id = id;
		this.itemName = itemName;
		this.price = price;
		this.quantity = quantity;
	}

	// 가격과 수량 수정하는 생성자 정의 !
	public void setPrQu(Integer price, int quantity) {
		this.price = price;
		this.quantity = quantity;
	}

	public int getId() {
		return this.id;
	}

	public void showInfo() {
		System.out.printf("%d\t%s\t\t%d\t%d\n", this.id, this.itemName, this.price, this.quantity);
	}
}

 

 

그럼 코드는

// [3] 상품 수정 ===============================================
public void update() {
    System.out.print("수정하기 원하는 아이디 입력하세요 ... ");
    int itemId = ItemView.INPUT.nextInt();
    Item searchInfo = findById(itemId);

    if (searchInfo != null) {
        System.out.print("가격, 수량을 입력하세요 ... ");
        Integer price = ItemView.INPUT.nextInt();
        int quantity = ItemView.INPUT.nextInt();

        searchInfo.setPrQu(price, quantity);
        System.out.println("상품 수정이 완료되었습니다.");
        return;
    } 
    System.out.printf("아이디 %s인 상품이 없습니다.\n", itemId);
}