Blog

[Java]17_1 기초문법 - 요리 레시피를 입력받아 레시피를 출력하는 프로그램

Author
Summary
요리 레시피를 정리하여 출력해주는 CLI 계산기
Category
Study
Tags
Java
Favorite
Memory Date
2023/08/14
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
배열과 반복문을 연습 할 수 있는 프로그램이다. 조건들을 우선 파악했다.
요리 레시피 메모장 만들기
입력값
내가 좋아하는 요리 제목을 먼저 입력합니다.
요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
출력값
입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.
보지 않고 코딩하기 연습! 이전에 알고리즘 문제를 풀 때와 기분이 같다.
처음엔 일단 단순화시켜서 입력값, 계산할 부분, 출력값을 나누어서 변수를 선언해 둔다.
기능 구현 클래스에서도 메서드를 입력부, 계산부, 출력부로 단순화 시켜서 시작했다. 이렇게 구조를 먼저 잡고 가야지 조건 등을 추가하면서 반복문들로 점점 복잡해지는 코드들의 구조를 파악하기 쉽다.
//인풋 데이터 생각 //요리제목 String inputTitle //요리별점 double inputStar //요리레시피 String String inputRecipe //레시피의 단계(배열의 크기) inputRecipeLevel //아웃풋 데이터 생각 //레시피제목 String recipeTitle //요리레시피별점 int recipeStar //요리레시피별점퍼센트 double recipeStarRatio //요리레시피순서문장 String recipeText
Java
복사
Main Class는 여전히 객체를 생성하고 이닛 메서드만 호출하고 끝난다.
public class Main { public static void main(String[] args){ Solution solution = new Solution(); solution.run(); } }
Java
복사
실질적인 본체라 볼 수 있는 Solution Class는 다음과 같이 구분된다.
변수 선언부
기본 생성자
메서드
Input메서드(시작부)
calculator메서드(계산부)
output메서드(출력부)
이와 같이 구조를 먼저 잡고 코딩을 시작한다. 최초 기본 입력값들을 파라미터로 계산부로 넘기고, 출력부로 넘기는 단순한 형태를 먼저 코딩해놓고, 세부 계산 및 반복문을 통한 유효성 검사를 추가했다.
마지막으로 프로그램 종료를 시스템이 정하는 것이 아니라, 유저가 정하도록 tryAgain() 메서드를 추가하고 마치 무한반복 프로그램처럼 구성하니 조금 프로그램 답게 변했다.
유효성 체크를 포함한 테스트 화면은 다음과 같다.
실제 기능이 구현된 Solution 클래스의 전체 코드는 다음과 같다.
package JavaPrac1week; import java.util.Arrays; import java.util.Scanner; public class Solution { //인풋 데이터 생각 //요리제목 String inputTitle //요리별점 double inputStar //요리레시피 String String inputRecipe //레시피의 단계(배열의 크기) inputRecipeLevel //아웃풋 데이터 생각 //레시피제목 String recipeTitle //요리레시피별점 int recipeStar //요리레시피별점퍼센트 double recipeStarRatio //요리레시피순서문장 String recipeText //Inputs String inputTitle; double inputStar; String inputRecipeArr[]; double starMax = 5.0; int inputRecipeLevel; //Outputs String recipeTitle; int recipeStar; double recipeStarRatio; String recipeTextArr[]; //Function Scanner sc = new Scanner(System.in); public Solution() { } void run() { input(); } void input() { System.out.println("요리의 이름을 입력해주세요."); inputTitle = sc.nextLine(); while (true) { System.out.println("레시피의 별점을 입력해주세요."); inputStar = sc.nextDouble(); if (inputStar < 1.00 || inputStar > 5.00){ System.out.println("별점은 1.00~5.00까지만 입력해주세요."); continue; } System.out.println("입력하신 값은 '"+inputStar+"'로 소수점을 제외한 정수로 변환됩니다!"); break; } while (true) { System.out.println("레시피는 총 몇단계로 구성되어 있습니까?(최대10단계)"); inputRecipeLevel = sc.nextInt(); if (inputRecipeLevel < 1 || inputRecipeLevel > 10){ System.out.println("레시피는 1~10단계로만 구성해주세요"); continue; } break; } sc.nextLine(); //초기화 int i; inputRecipeArr = new String[inputRecipeLevel]; for (i = 0; i < inputRecipeArr.length; i++) { System.out.println((i + 1) + "번째 레시피의 내용을 입력해주세요."); inputRecipeArr[i] = sc.nextLine(); } calculate(inputTitle, inputStar, inputRecipeArr, inputRecipeLevel); } void calculate(String inputTitle, double inputStar, String[] inputRecipeArr, int inputRecipeLevel) { recipeTitle = inputTitle; recipeStar = (int) Math.floor(inputStar); recipeStarRatio = (recipeStar / starMax) * 100; int i; recipeTextArr = new String[inputRecipeLevel]; for (i = 0; i < inputRecipeArr.length; i++) { int j = i; recipeTextArr[j] = inputRecipeArr[i]; } outputEnd(recipeTitle, recipeStar, recipeStarRatio, recipeTextArr); } void outputEnd(String recipeTitle, int recipeStar, double recipeStarRatio, String[] recipeTextArr) { System.out.println("==============================<< R E C I P E >>=============================="); System.out.printf("[ 백종원 %s 만들기 ]\n", recipeTitle); System.out.printf("별점 : %d (%.1f%%)\n", recipeStar, recipeStarRatio); int i; int n; for (i = 0; i < recipeTextArr.length; i++) { n = i + 1; System.out.printf("%d. %s\n", n, recipeTextArr[i]); } System.out.println("==============================<< T H A N K U >>=============================="); tryAgain(); } void tryAgain(){ System.out.println("계속해서 레시피를 작성하시겠습니까? [1] YES / [2] NO"); int tryNum; tryNum = sc.nextInt(); if(tryNum == 1){ System.out.println("새로운 레시피를 입력합니다."); run(); } else if (tryNum == 2) { System.out.println("이용해주셔서 감사합니다^^~"); System.exit(0); } } }
Java
복사
알고리즘 문제를 이처럼 구조화시켜서 다가가는 연습을 꾸준히 하다 보니까 프로그램 자체를 구성하는 일에 점점 익숙해지고 있는게 느껴졌다. 조금 더 다양한 과제들을 수행해봐야겠다. 뭔가 단순해보여도 이런 프로그램 자체를 만드는게 재밌다.