231014CW
https://funold16.tistory.com/7
바로 어제 과제용으로 요리 레시피를 출력해주는 JAVA문을 작성했었다. 그런데 오늘 강의 자료를 찾아 돌아다니다 해당 과제 설명에 대해 보게 되었는데, 충격적이게도 과제는 내가 작성한 JAVA문과 완전히 다른 결과물을 원하고 있다는 걸 알게 되었다.
내가 작업했던건 레시피 3개를 각 번호와 함께 String 변수로 주고, Scanner로 번호를 받아서 해당 번호에 해당하는 레시피를 출력해주는 코드문이었는데, 과제 설명을 보니 한 줄, 한 줄 씩 쭈욱 입력하면, 각 줄에 몇가지 변경점을 주어 출력하게 작성해야 하는 것이었다. OMG 세상마상에.
이럴 때 찾으라고 주님이 계시나보다.
그런데 주님도 불금엔 쉬셔야지. 막 어려운 것도 아니고, 바로 작업 들어갔다. (사실 참고도 좀 했다.)
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(); // 평점용(소수점 들어올 경우를 예상하고 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
해결법과 도움되는 링크 안내도 받았는데,
내 코드문의 문제 원인은 바로 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 |