코딩/JAVA

충격과 공포와 반전의 과제용 COOKING RECIPE

Funold 2023. 10. 14. 01:21

 

 

231014CW

 

https://funold16.tistory.com/7

 

Cooking Recipe.

231012-C, 13-W 이번에 JAVA기초문법을 시작하면서 과제로 나온 요리 레시피 메모장을 만들어 보기로 했다. String 변수를 선언해주고 변수에 요리 레시피를 입력, 그대로 출력 해보는 게 기초 요구사

funold16.tistory.com

바로 어제 과제용으로 요리 레시피를 출력해주는 JAVA문을 작성했었다. 그런데 오늘 강의 자료를 찾아 돌아다니다 해당 과제 설명에 대해 보게 되었는데, 충격적이게도 과제는 내가 작성한 JAVA문과 완전히 다른 결과물을 원하고 있다는 걸 알게 되었다.

 

내가 작업했던건 레시피 3개를 각 번호와 함께 String 변수로 주고, Scanner로 번호를 받아서 해당 번호에 해당하는 레시피를 출력해주는 코드문이었는데, 과제 설명을 보니 한 줄, 한 줄 씩 쭈욱 입력하면, 각 줄에 몇가지 변경점을 주어 출력하게 작성해야 하는 것이었다. OMG 세상마상에.

 

이럴 때 찾으라고 주님이 계시나보다.

 

그런데 주님도 불금엔 쉬셔야지. 막 어려운 것도 아니고, 바로 작업 들어갔다. (사실 참고도 좀 했다.)

 

public class Main1_HW1_Cooking_recipe1_2 {

    public static void main(String[] args) {

		}
}

일단 드가자…

 

우선 예시를 보니 입력할 문장들의 종류와 순서가 있다.

  1. 레시피 제목
  2. 평점
  3. 레시피 순서 좌르륵

 

Scanner sc = new Scanner(System.in);

스캐너부터 박아준다.

 

String title = sc.nextLine(); // 레시피 제목용
float rate = sc.nextFloat(); // 평점용(소수점 들어올 경우를 예상하고 float실수형으로 간다.)
String input1 = sc.nextLine(); // 여기서 부터 좌르륵 레시피 내용 작성
String input2 = sc.nextLine(); // 각 줄당 레시피 한 순서가 들어간다.
String input3 = sc.nextLine(); 
String input4 = sc.nextLine(); 
...

input4 까지 밖에 안적었지만 내 사랑스런 베이컨 에그 스크램블 레시피는 14줄 까지 있다.

이제 입력받을 문장은 다 썼으니 다음 작업으로 넘어간다.

 

String title = "♡" + title + "♡"
System.out.println(title);

String 변수 선언과 출력라인 바로 이어서 작성.

역시 베이컨 요리인 건 변함 없으며, 그에 대한 내 애정도 변함이 없다.

 

int intRate = (int)rate;
double percent = intRate * 100 / 5; // 5점 만점일 때 입력 평점의 백분율
System.out.println("평점 : " + intRate + "(" + percent + "%)")

평점 입력은 소수점 포함이더라도 출력할 땐 정수로 하라고 하더라. 입벌려 형변환 드간다.

5점 만점 기준으로 백분율도 표시해달라기에 double percent도 선언. (백분율식 까먹어서 검색했다.)

 

				System.out.println("1." + input1);
        System.out.println("2." + input2);
        System.out.println("3." + input3);
        System.out.println("4." + input4);
				...

받은 레시피 내용들 앞에 순서대로 번호를 붙여게 출력문 작성. 마찬가지로 14번 까지 써준다.

 

 

다시금 완성 된 ♡베이컨 에그 스크램블 레시피♡ 메모장이다.

import java.util.Scanner;

public class Main1_HW1_Cooking_recipe1_2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rate = sc.nextFloat();
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();
        String input3 = sc.nextLine();
        String input4 = sc.nextLine();
        String input5 = sc.nextLine();
        String input6 = sc.nextLine();
        String input7 = sc.nextLine();
        String input8 = sc.nextLine();
        String input9 = sc.nextLine();
        String input10 = sc.nextLine();
        String input11 = sc.nextLine();
        String input12 = sc.nextLine();
        String input13 = sc.nextLine();
        String input14 = sc.nextLine();

        title = "♡" + title + "♡";

        int intRate = (int)rate;
        float percent = intRate * 100 / 5;
        System.out.println(title);
        System.out.println("별점 : " + intRate + " (" + percent + "%)");
        System.out.println("1." + input1);
        System.out.println("2." + input2);
        System.out.println("3." + input3);
        System.out.println("4." + input4);
        System.out.println("5." + input5);
        System.out.println("6." + input6);
        System.out.println("7." + input7);
        System.out.println("8." + input8);
        System.out.println("9." + input9);
        System.out.println("10." + input10);
        System.out.println("11." + input11);
        System.out.println("12." + input12);
        System.out.println("13." + input13);
        System.out.println("14." + input14);

    }
}

 

두근두근, 이제 터미널에 입력해보자.

한 줄만 ㄷ..

..어억?

 

14번 째 줄까지 쳐야 하는데, 13번 째 줄을 치자마자 출력값이 나와 버렸다.

보아하니 1. 에 들어가야 할 재료 문장부터 한 줄 씩 밀려 정작 14번 째 줄이 안 들어갔다.

 

 

30분 째 보고 있는데 뭐가 문젠지 모르겠다.

근데 너무 졸린다. 일단 자고 일어나보자…

다음 날 튜터님 찬스를 사용했다.

 

https://devlog-wjdrbs96.tistory.com/80

 

[JAVA] next(), nextLine() 의 차이

나는 지금까지 next()와 nextLine()의 차이는 단순히 한 줄을 전부 입력받고 싶을 때(한 문장을 입력한다던지)는 nextLine()을 사용하고 한 단어씩 입력하고자 할 때는 next()를 사용한다 정도의 가볍게

devlog-wjdrbs96.tistory.com

해결법과 도움되는 링크 안내도 받았는데,

내 코드문의 문제 원인은 바로 next()와 nextLine()간의 차이점 이었다.

 

ㄴ인용)" next()는 개행문자를 무시하고 입력을 받고 nextLine은 한줄 단위로 입력을 받기 때문에 개행문자로 포함한다.

좀 더 직관적으로 설명하자면 위 처럼 5를 입력하고 Enter를 쳤다면 버퍼에 5\n이 존재한다. 이 때 nextInt()가 버퍼의 내용을 가져올 때 분리자를 제외하고 가져오기 때문에 5만 가져오게 된다. 그러면 버퍼에 \t가 남아있는데 nextLine()은 공백문자, 개행문자인 분리자를 포함시키기 때문에 \t만 가져오고 프로그램이 종료되는 것이다. "

" nextLine()을 next()로 바꾸어 주는 것도 하나의 방법이다. "

 

요점은 둘의 차이점은 개행문자를 무시하냐 마냐, 그리고 튜터님 찬스 해결법으로 nextFloat() 아랫 줄에 빈 nextln() 을 추가 해주면 된다는 것.

 

float rate = sc.nextFloat();
String clear = sc.nextLine(); // <-추가

인용문을 잠시 따오자면 " ...버퍼에 \t가 남아있는데... nextLine()은 공백문자, 개행문자인 분리자를 포함시키기 때문에 \t만 가져오고... " 를 위한 nextLine()을 추가.

 

사실 참고글에도 버퍼라느니 \t 라느니, 분리자, 공백문자, 개행문자 등 모르는 단어가 많은데 이는 따로 공부하도록 하고 일단 수정한데로 다시 실행해본다.

 

떨린다... 원래 필요한 14줄에서 한 줄 더 필요해 15번째 nextLine()을 추가 작성했다. 그런데 저 터미널 캡쳐 시점에서 해당 15번째 줄(이쁜 에그스크럼블 위에 맛나게...끝!)을 작성할 수 있게 된 것 만 해도 성공했음을 직감했다.

 

그렇지~♬

 

드디어 본래 의도ㅎ... 아니 다시 의도한 대로의 결과물 완성.

 

하하~ 타이틀에 하트 붙이고 각 줄에 순서대로 번호 붙이려고 이 고생을 했다는게 뭔가 뭔가 하지만 역시 문제 있어서 해결하고 완성했을 때의 만족감이란 역시 역시 하다.

개인적으로 처음에 작성했던 요리레시피가 더 마음에 들지만, 배운 내용 복습한다는 마음과, '문제가 나오면 이런식으로 나오겠구나.' 라는 생각으로 작업하니 나름 괜찮았다.

 

스읍... 베이컨 레시피 보니까 또 배고파진다.

 

 

'코딩 > JAVA' 카테고리의 다른 글

TPJ-호텔 예약 프로그램 (3)  (1) 2023.11.01
TPJ-호텔 예약 프로그램 (2)  (1) 2023.11.01
TPJ-호텔 예약 프로그램 (1)  (0) 2023.11.01
오케~ 또시피~  (1) 2023.10.16
Cooking Recipe.  (0) 2023.10.13