๐Ÿ“š[Java] ํ‚ค์˜ค์Šคํฌ

ํ…ํ…ยท2025๋…„ 5์›” 1์ผ

์ž๋ฐ” 2๋ฒˆ์งธ ๊ณผ์ œ๊ฐ€ ๋ฐœ์ œ ๋˜์—ˆ๋‹ค.
์ด๋ฒˆ ๊ณผ์ œ๋Š” ํ•„์ˆ˜ ๊ตฌํ˜„ 5๋‹จ๊ณ„์™€ ๋„์ „ ๊ตฌํ˜„ 2๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋‹ค.
์•ž์„  ๋‹จ๊ณ„๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ๊ณผ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ–ˆ๊ธฐ์— ๋„์ „ lv2๋ฅผ ๊ธฐ์ค€์œผ๋กœ TIL ์„ ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค.


ํด๋ž˜์Šค ์ •์˜

  • Main : ๋ฉ”์ธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค
  • Menu: MenuItem ํด๋ž˜์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค
    • ๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด์— ์—ฌ๋Ÿฌ MenuItem ์„ ํฌํ•จํ•œ๋‹ค.
  • MenuItem: ์„ธ๋ถ€ ๋ฉ”๋‰ด ์†์„ฑ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค
    • ๋ฉ”๋‰ด์˜ ์ด๋ฆ„, ๊ฐ€๊ฒฉ, ์„ค๋ช…
  • Kiosk: ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ ๋ฐ ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค
  • CustomerType: ์‚ฌ์šฉ์ž ์œ ํ˜•๋ณ„ ํ• ์ธ์œจ์„ ๊ด€๋ฆฌํ•˜๋Š” enum ํด๋ž˜์Šค

ํ•ต์‹ฌ ์š”๊ตฌ์‚ฌํ•ญ

  1. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  2. ๋žŒ๋‹ค & ์ŠคํŠธ๋ฆผ์„ ํ™œ์šฉํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    • ๋ชฉ๋ก์— ๋‹ด๊ธด ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ
    • ์ฃผ๋ฌธ๋ชฉ๋ก ์ค‘ ๋ชฉ๋ก์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ
  3. ํ• ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    • ์‚ฌ์šฉ์ž ์œ ํ˜•์˜ enum ์„ ์ •์˜ ํ•˜๊ณ  ์œ ํ˜•์— ๋”ฐ๋ฅธ ํ• ์ธ์œจ ์ ์šฉ
    • ์ฃผ๋ฌธ ์‹œ ํ• ์ธ์œจ์„ ์ ์šฉํ•œ ๊ธˆ์•ก์„ ์ถœ๋ ฅ

์˜ˆ์™ธ์ฒ˜๋ฆฌ

์ž…๋ ฅ ์ฒ˜๋ฆฌํ•  ์ผ์ด ๋งŽ์•„์ง€๊ณ  ์ฝ”๋“œ๊ฐ€ ์ ์  ๊ธธ์–ด์ง€๋ฉด์„œ try-catch ๋ฅผ ์ด์šฉํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ ์  ์–ด๋ ค์›Œ์กŒ๋‹ค.
ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ ์ „์ฒด๋ฅผ try ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹์ด ์œ ์ง€๋ณด์ˆ˜์— ๋งค์šฐ ๋ถˆํŽธํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ๋‹ค.

์ด ๊ณ ๋ฏผ์€ ์บ ํ”„๋ฅผ ํ•จ๊ป˜ ์ง„ํ–‰ ์ค‘์ธ ๋™๋ฃŒ์˜ ์กฐ์–ธ ๋•๋ถ„์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€๋Š” ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ Scanner์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹๋งŒ ์‚ฌ์šฉํ•ด์™”์ง€๋งŒ ์ž…๋ ฅ ์ „์šฉ ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋‚˜ ์กฐ๊ฑด ๊ฒ€์ฆ ๋“ฑ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

getInput()

public static int getInput(int firstIndex, int lastIndex) {
        while (true) {
            try {
                int input = sc.nextInt();
                if (input < firstIndex || input > lastIndex) {
                    throw new IndexOutOfBoundsException();
                }
                return input;
            } catch (InputMismatchException e) {
                System.out.println("์ˆซ์ž๋งŒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
                sc.nextLine(); //๋ฒ„ํผ๋น„์šฐ๊ธฐ ์•ˆ๋น„์šฐ๋ฉด ํฐ์ผ๋‚จ
            } catch (IndexOutOfBoundsException e) {
                System.out.println("์„ ํƒ์ง€๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”");
            }
        }
    }

์ž…๋ ฅ์„ ์ „๋‹ดํ•˜๋Š” getInput() ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ˆซ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ ์ง์ ‘ IndexOutOfBoundsException์„ ๋ฐœ์ƒ์‹œ์ผœ ์˜ˆ์™ธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ 
์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ InputMismatchException์„ ํ†ตํ•ด ์ž˜๋ชป๋œ ์ž…๋ ฅ์„ ์•ˆ๋‚ดํ•œ๋‹ค.

๊ธฐ์กด์—๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜๋ณต๋ฌธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ ์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์› ์ง€๋งŒ ์ž…๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ๋ชจ๋‘ ํ–ฅ์ƒ๋˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


์ฃผ๋ฌธ๋ชฉ๋ก ๋ฐ ๊ตฌ๋งค ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋žŒ๋‹ค์™€ ์ŠคํŠธ๋ฆผ์„ ํ™œ์šฉํ•ด์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์š”๊ตฌ์‚ฌํ•ญ์ด๋‹ค.

Consumer<List<MenuItem>> myConsumer1 = menuItemList -> {
                    IntStream.range(0, menuItemList.size()).forEach(i -> {
                        MenuItem m = menuItemList.get(i);
                        System.out.println((i + 1) + ". " + m.toString());
                    });
                };
myConsumer1.accept(chooseMenu.getMenuItemList());

menuItemList ์—์„œ item์„ ๋ฝ‘์•„ ์ถœ๋ ฅํ•˜๋Š” ๋žŒ๋‹ค์‹์ด๋‹ค.
Consumer<>๋Š” ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌ๋งŒ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ java.util.function ํŒจํ‚ค์ง€์— ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์–ด ๋ณ„๋„ ๊ตฌํ˜„ ์—†์ด import ๋งŒ์œผ๋กœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ •์˜ํ•œ ๋žŒ๋‹ค์‹์€ accept() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.
์ดˆ๊ธฐ์—๋Š” Stream.forEach()๋ฅผ ์‚ฌ์šฉํ•ด ์ถœ๋ ฅํ•˜๋ ค ํ–ˆ์ง€๋งŒ ํ•ญ๋ชฉ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์œ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” IntStream.range()๋กœ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ” ๊ตฌํ˜„ํ–ˆ๋‹ค.
๊ตฌ์กฐ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ "1. ํ•ญ๋ชฉ" ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.


BiFunction<String, List<MenuItem>, Boolean> myFunction1 = (inputString, orders) ->
                    orders.removeIf(m -> inputString.equals(m.getItemName()));
sc.nextLine();//๋‹ค์Œ์ž…๋ ฅ์ด nextLine ์ด๊ธฐ์— ๋ฒ„ํผ ๋น„์šฐ๊ธฐ
while (true) {
    System.out.println("์‚ญ์ œํ•  ๋ฉ”๋‰ด์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„)");
    if (myFunction1.apply(sc.nextLine(), order.getOrders())) {
        System.out.println("์‚ญ์ œ ์™„๋ฃŒ");
        break;
    }
    System.out.println("์ž…๋ ฅํ•œ ๋ฉ”๋‰ด๋ช…์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.");
}

์ฃผ๋ฌธ๋ชฉ๋ก์— ๋“ค์–ด์žˆ๋Š” menuItem ์„ ์‚ญ์ œํ•˜๋Š” ๋žŒ๋‹ค์‹์ด๋‹ค.
์ฒ˜์Œ์—๋Š” BiConsumer<>์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๊ณผ ์ฃผ๋ฌธ ๋ชฉ๋ก์„ ๋ฐ›์•„ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์‚ญ์ œํ–ˆ์ง€๋งŒ ์‚ญ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๋™์ž‘(๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ)์„ ์ œ์–ดํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” BiFunction์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.
BiFunction<T, U, R> ์€ ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ(T, U)์„ ๋ฐ›์•„ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ(R)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  .removeIf()๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋ฅผ ์ „๋ถ€ ์ œ๊ฑฐํ•˜๊ณ  ํ•˜๋‚˜๋ผ๋„ ์ œ๊ฑฐ๋˜๋ฉด true, ์•„๋ฌด ๊ฒƒ๋„ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
.removeIf() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด MenuItem์˜ itemName ๊ณผ ์ž…๋ ฅ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.
์ด ๋ฐ˜ํ™˜๊ฐ’์„ ํ†ตํ•ด ์‚ญ์ œ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์„ฑ๊ณต ์‹œ ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žฌ์ž…๋ ฅ์„ ์œ ๋„ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.


ํ• ์ธ ๊ธฐ๋Šฅ

public enum CustomerType {
    VETERAN(0.1), SOLDIER(0.05), STUDENT(0.03), BASIC(0);

    private double discountPercent;

    CustomerType(double discountPercent) {
        this.discountPercent = discountPercent;
    }

    public double discountPrice(double price) {
        return price - (price * discountPercent);
    }

    public static CustomerType gradeChoice(int input) {
        switch (input) {
            case 1:
                return CustomerType.VETERAN;
            case 2:
                return CustomerType.SOLDIER;
            case 3:
                return CustomerType.STUDENT;
            case 4:
                return CustomerType.BASIC;
            default:
                throw new IllegalArgumentException("์„ ํƒ์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”");
        }
    }
}

์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋”ฐ๋ผ ํ• ์ธ๋ฅ ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ enum ํด๋ž˜์Šค์ด๋‹ค.
VETERAN, SOLDIER, STUDENT, BASIC ๋„ค ๊ฐ€์ง€ ์œ ํ˜•์„ ์ƒ์ˆ˜๋กœ ์ •์˜ํ•˜๊ณ  ๊ฐ ์‚ฌ์šฉ์ž ์œ ํ˜•์€
๊ณ ์ •๋œ ํ• ์ธ ๋น„์œจ(discountPercent)์„ ๊ฐ€์ง„๋‹ค.
discountPrice() ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž ์œ ํ˜•์˜ ํ• ์ธ ๋น„์œจ์„ ์ ์šฉํ•˜์—ฌ ์ตœ์ข… ๊ฒฐ์ œ ๊ธˆ์•ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
๋˜ํ•œ gradeChoice() ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋งž๋Š” ์œ ํ˜•์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ

์•ž์„  ๊ณ„์‚ฐ๊ธฐ ํ”„๋กœ์ ํŠธ์— ๋น„ํ•ด ํ›จ์”ฌ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋“ค์–ด๊ฐ”๊ณ  ๊ทธ๋งŒํผ ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋„ ๊ฒช์—ˆ๋‹ค.
ํ‚ค์˜ค์Šคํฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๊ทธ์ € ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ๋งŒ ๊ธ‰๊ธ‰ํ–ˆ๊ณ  ๋‚ด๊ฐ€ ๊ณต๋ถ€ ์ค‘์ธ ์ž๋ฐ”์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ธ ๊ฐ์ฒด์ง€ํ–ฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊นŠ์ด ๊ณ ๋ฏผํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๊ณผ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๊ฐ€๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์‚ฌ๊ณ ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค.
๋˜ํ•œ ํ˜ผ์ž ๋™๋™๋Œ€๋ฉฐ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ธ์ง€๋„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๊ธฐ์— ๋งŽ์€ ๊ฒƒ์„ ์–ป์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.


ํ‚ค์˜ค์Šคํฌ ํ”„๋กœ์ ํŠธ

https://github.com/teopteop/Kiosk

profile
์ฐจ๊ทผ์ฐจ๊ทผ

0๊ฐœ์˜ ๋Œ“๊ธ€