From 5a92ec36bfc52fcbc3e8fc59ec10a44181d8148a Mon Sep 17 00:00:00 2001 From: Jong Ha Date: Tue, 1 Apr 2025 16:29:39 +0900 Subject: [PATCH 1/5] control logic --- src/main/java/mission/control/Printer.java | 62 +++++++++++++++ .../mission/control/PrinterController.java | 35 +++++++++ src/main/java/mission/view/PrinterView.java | 75 +++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 src/main/java/mission/control/Printer.java create mode 100644 src/main/java/mission/control/PrinterController.java create mode 100644 src/main/java/mission/view/PrinterView.java diff --git a/src/main/java/mission/control/Printer.java b/src/main/java/mission/control/Printer.java new file mode 100644 index 0000000..90d524f --- /dev/null +++ b/src/main/java/mission/control/Printer.java @@ -0,0 +1,62 @@ +package mission.control; + +import mission.utils.AsciiGenerator; +import mission.view.PrinterView; + +import java.util.List; + +public class Printer { + private static final int MAX_INK = 1000; + private int ink = MAX_INK; + private final AsciiGenerator asciiGenerator; + private final PrinterView view; + + public Printer(AsciiGenerator asciiGenerator, PrinterView view) { + this.asciiGenerator = asciiGenerator; + this.view = view; + } + + public void print() { + String input = view.getUserInput("출력할 문자를 입력해주세요."); + int paperSize = Integer.parseInt(view.getUserInput("용지 크기를 입력해주세요.")); + + if (!canPrint(input.length(), paperSize)) { + view.displayInkLow(); + return; + } + + printAscii(input, paperSize); + view.displayInkStatus(ink, MAX_INK); + } + + public void checkInk() { + view.displayInkStatus(ink, MAX_INK); + } + + public void replaceInk() { + ink = MAX_INK; + view.displayInkReplaced(); + } + + private boolean canPrint(int inputLength, int paperSize) { + int requiredInk = inputLength * paperSize * 5; + if (ink < requiredInk) return false; + ink -= requiredInk; + return true; + } + + private void printAscii(String input, int paperSize) { + StringBuilder output = new StringBuilder(); + int numRows = asciiGenerator.getNumberAsciiDesign(0).size(); + + for (int row = 0; row < numRows; row++) { + for (char c : input.toCharArray()) { + int digit = Character.getNumericValue(c); + List asciiLines = asciiGenerator.getNumberAsciiDesign(digit); + output.append(asciiLines.get(row)).append(" "); + } + output.append(System.lineSeparator()); + } + view.displayAscii(output.toString()); + } +} diff --git a/src/main/java/mission/control/PrinterController.java b/src/main/java/mission/control/PrinterController.java new file mode 100644 index 0000000..0c82c8f --- /dev/null +++ b/src/main/java/mission/control/PrinterController.java @@ -0,0 +1,35 @@ +package mission.control; + +import mission.utils.AsciiGenerator; +import mission.view.PrinterView; + +public class PrinterController { + private final Printer printer; + private final PrinterView view; + + public PrinterController(Printer printer, PrinterView view) { + this.printer = printer; + this.view = view; + } + + public void start() { + view.displayMessage("프린터를 실행합니다."); + while (true) { + String input = view.getUserInput("사용할 기능을 입력해주세요. 1) 출력, 2) 잉크 잔량 확인, 3) 잉크 교체, 4) 프로그램 종료"); + + if (input.equals("1")) { + printer.print(); + } + if (input.equals("2")) { + printer.checkInk(); + } + if (input.equals("3")) { + printer.replaceInk(); + } + if (input.equals("4")) { + view.displayMessage("프로그램을 종료합니다."); + break; + } + } + } +} diff --git a/src/main/java/mission/view/PrinterView.java b/src/main/java/mission/view/PrinterView.java new file mode 100644 index 0000000..3acdb3b --- /dev/null +++ b/src/main/java/mission/view/PrinterView.java @@ -0,0 +1,75 @@ +package mission.view; + +import mission.utils.AsciiGenerator; +import java.util.List; +import java.util.Scanner; + +public class PrintView { + private final Scanner scanner = new Scanner(System.in); + + public int showMenu() { + System.out.println("사용할 기능을 입력해주세요. 1) 출력, 2) 잉크 잔량 확인, 3) 잉크 교체, 4) 프로그램 종료"); + System.out.print(">> "); + return Integer.parseInt(scanner.nextLine()); + } + + public String getInputText() { + System.out.println("출력할 문자를 입력해주세요."); + System.out.print(">> "); + return scanner.nextLine(); + } + + public int getPaperSize() { + System.out.println("용지 크기를 입력해주세요."); + System.out.print(">> "); + return Integer.parseInt(scanner.nextLine()); + } + + public void displayAscii(String input, AsciiGenerator generator, int size) { + StringBuilder output = new StringBuilder(); + String lineSeparator = System.lineSeparator(); + + for (int row = 0; row < 5; row++) { // 기본 아스키 아트는 5줄 + for (int i = 0; i < size; i++) { // 세로 크기 확장 + for (char ch : input.toCharArray()) { + int num = Character.getNumericValue(ch); + if (num < 0 || num > 9) { + System.out.println("[ERROR] 유효하지 않은 문자: " + ch); + return; + } + List ascii = generator.getNumberAsciiDesign(num); + String scaledLine = scaleLine(ascii.get(row), size); + output.append(scaledLine).append(" "); + } + output.append(lineSeparator); + } + } + + output.append(lineSeparator).append("출력이 완료되었습니다.").append(lineSeparator); + System.out.println(output.toString()); + } + + /** + * 가로 크기를 확장하는 메서드 + */ + private String scaleLine(String line, int size) { + StringBuilder scaled = new StringBuilder(); + for (char ch : line.toCharArray()) { + scaled.append(String.valueOf(ch).repeat(size)); // 가로 크기 확장 + } + return scaled.toString(); + } + + + public void displayInk(int inkLevel) { + System.out.println("잉크 잔량 : " + inkLevel + "/1000"); + } + + public void displayInkLow() { + System.out.println("\n잉크가 부족해 출력이 중단되었습니다.\n"); + } + + public void displayInkRefilled() { + System.out.println("잉크를 교체하였습니다.\n"); + } +} From 9ed82869a4c4a531ac1b6d408fc31ff8814d0f2b Mon Sep 17 00:00:00 2001 From: Jong Ha Date: Tue, 1 Apr 2025 16:30:11 +0900 Subject: [PATCH 2/5] ascii update --- .../java/mission/utils/AsciiGenerator.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/mission/utils/AsciiGenerator.java b/src/main/java/mission/utils/AsciiGenerator.java index 2498d7e..ea03a32 100644 --- a/src/main/java/mission/utils/AsciiGenerator.java +++ b/src/main/java/mission/utils/AsciiGenerator.java @@ -13,29 +13,33 @@ public class AsciiGenerator { private final List> data; static private final List fileNames = List.of( - "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" + "zero", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine" ); public AsciiGenerator() { data = new ArrayList<>(); - fileNames.forEach(fileName -> { - try { - Path path = Paths.get(Objects.requireNonNull( - getClass().getClassLoader().getResource("numberAsciiDesign/" + fileName + ".txt") - ).toURI()); - String content = Files.readString(path); - data.add(List.of(content.split("\n"))); - } catch (URISyntaxException | IOException e) { - throw new IllegalStateException("[ERROR] 아스키아트를 로드하지 못했습니다."); - } - }); + fileNames.forEach(this::loadAsciiFile); } - public List getNumberAsciiDesign(int number) { + private void loadAsciiFile(String fileName) { try { - return data.get(number); - } catch (IndexOutOfBoundsException e) { - throw new IllegalStateException("[ERROR] 범위를 초과했습니다. "); + Path path = Paths.get(Objects.requireNonNull( + getClass().getClassLoader().getResource("numberAsciiDesign/" + fileName + ".txt") + ).toURI()); + String content = Files.readString(path); + + List lines = List.of(content.split("\\R")); // 모든 개행 문자 처리 + data.add(lines); + } catch (URISyntaxException | IOException e) { + throw new IllegalStateException("[ERROR] 아스키 아트를 로드하지 못했습니다."); + } + } + + public List getNumberAsciiDesign(int number) { + if (number < 0 || number >= data.size()) { + throw new IllegalStateException("[ERROR] 범위를 초과했습니다."); } + return data.get(number); } } From 41371cc0e55ea7605f998e82a060138cfff1fdd0 Mon Sep 17 00:00:00 2001 From: Jong Ha Date: Tue, 1 Apr 2025 16:30:38 +0900 Subject: [PATCH 3/5] view logic --- src/main/java/mission/view/PrinterView.java | 69 ++++----------------- 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/src/main/java/mission/view/PrinterView.java b/src/main/java/mission/view/PrinterView.java index 3acdb3b..0b32041 100644 --- a/src/main/java/mission/view/PrinterView.java +++ b/src/main/java/mission/view/PrinterView.java @@ -1,75 +1,32 @@ package mission.view; -import mission.utils.AsciiGenerator; -import java.util.List; import java.util.Scanner; -public class PrintView { +public class PrinterView { private final Scanner scanner = new Scanner(System.in); - public int showMenu() { - System.out.println("사용할 기능을 입력해주세요. 1) 출력, 2) 잉크 잔량 확인, 3) 잉크 교체, 4) 프로그램 종료"); - System.out.print(">> "); - return Integer.parseInt(scanner.nextLine()); + public String getUserInput(String message) { + System.out.println(message); + return scanner.nextLine().trim(); } - public String getInputText() { - System.out.println("출력할 문자를 입력해주세요."); - System.out.print(">> "); - return scanner.nextLine(); + public void displayMessage(String message) { + System.out.println(message); } - public int getPaperSize() { - System.out.println("용지 크기를 입력해주세요."); - System.out.print(">> "); - return Integer.parseInt(scanner.nextLine()); + public void displayInkStatus(int ink, int maxInk) { + System.out.println("잉크 잔량: " + ink + "/" + maxInk); } - public void displayAscii(String input, AsciiGenerator generator, int size) { - StringBuilder output = new StringBuilder(); - String lineSeparator = System.lineSeparator(); - - for (int row = 0; row < 5; row++) { // 기본 아스키 아트는 5줄 - for (int i = 0; i < size; i++) { // 세로 크기 확장 - for (char ch : input.toCharArray()) { - int num = Character.getNumericValue(ch); - if (num < 0 || num > 9) { - System.out.println("[ERROR] 유효하지 않은 문자: " + ch); - return; - } - List ascii = generator.getNumberAsciiDesign(num); - String scaledLine = scaleLine(ascii.get(row), size); - output.append(scaledLine).append(" "); - } - output.append(lineSeparator); - } - } - - output.append(lineSeparator).append("출력이 완료되었습니다.").append(lineSeparator); - System.out.println(output.toString()); - } - - /** - * 가로 크기를 확장하는 메서드 - */ - private String scaleLine(String line, int size) { - StringBuilder scaled = new StringBuilder(); - for (char ch : line.toCharArray()) { - scaled.append(String.valueOf(ch).repeat(size)); // 가로 크기 확장 - } - return scaled.toString(); - } - - - public void displayInk(int inkLevel) { - System.out.println("잉크 잔량 : " + inkLevel + "/1000"); + public void displayInkReplaced() { + System.out.println("잉크를 교체하였습니다."); } public void displayInkLow() { - System.out.println("\n잉크가 부족해 출력이 중단되었습니다.\n"); + System.out.println("[ERROR] 잉크가 부족합니다. 인쇄할 수 없습니다."); } - public void displayInkRefilled() { - System.out.println("잉크를 교체하였습니다.\n"); + public void displayAscii(String ascii) { + System.out.println(ascii); } } From d112414905493c4715bfc913516dd46898b87cdf Mon Sep 17 00:00:00 2001 From: Jong Ha Date: Tue, 6 May 2025 21:41:10 +0900 Subject: [PATCH 4/5] refactoring --- .idea/gradle.xml | 1 + .idea/misc.xml | 2 +- README.md | 27 ++++++++ src/main/java/mission/Application.java | 14 ++++- src/main/java/mission/control/Printer.java | 62 ------------------- .../mission/control/PrinterController.java | 50 +++++++++++---- src/main/java/mission/model/Print.java | 55 ++++++++++++++++ .../java/mission/utils/AsciiGenerator.java | 4 +- src/main/java/mission/view/PrinterView.java | 18 +----- 9 files changed, 138 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/mission/control/Printer.java create mode 100644 src/main/java/mission/model/Print.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index ce1c62c..666faea 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,6 +5,7 @@