이번 주 제시된 도서 관리 과제 중 해당 기능이 필요했다.
## 모드 번호를 입력해주세요.
## 도서 제목을 입력해주세요.
## 도서 저자를 입력해주세요.
## 페이지 수를 입력해주세요.
나는 단순히 이렇게 작성했다.
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int mode;
String title;
String author;
int page;
System.out.println("모드 번호를 입력하세요");
mode = scanner.nextInt();
System.out.println("도서 제목을 입력하세요.");
title = scanner.nextLine();
System.out.println("도서 저자를 입력하세요");
author = scanner.nextLine();
System.out.println("페이지 수를 입력하세요");
page = scanner.nextInt();
System.out.println(mode);
System.out.println(title);
System.out.println(author);
System.out.println(page);
}
전혀 문제가 없는 코드인 것 같다.
그럼 실행해보자
도서 번호 숫자를 입력하고 엔터를 쳤더니
도서 제목을 건너뛰고 바로 도서 저자를 입력하라고 뜬다. 이게 왜 이러지??
scanner.nextXXX 와 scanner.nextLine()이 어떤 식으로 작동하는지를 알아야 한다.
우선 nextInt() 등의 함수는 Enter 키로 입력의 끝을 구분한다.
하지만 여기서 큰 문제는, nextInt 등의 함수는 입력을 받고 개행문자('\n')을 지우지 않는다.
지금 과정을 생각해보자.
먼저 nextInt()함수가 호출되었고 그래서 나는
2 ENTER 을 입력했다.
그러면 nextInt()는 버퍼에서의 정수 값 2를 가져다 리턴하고, '\n'을 버퍼에 남겨둔 상황이다.
그 이후에 도서 제목을 입력하려고 nextLine()이 호출이 되었고, 해당 nextLine은 개행 문자를 만나면 한 줄로 인식하고 입력을 마쳐버린다.
그렇기에 도서제목에는 현재 '\n'이 들어가 있는 상황인 것이다.
그렇다면 이를 어떻게 해결하면 좋을까?
해결책들을 살펴보자.
1. 그냥 '\n'을 사전에 미리 읽어두는 것이다.
도서 제목을 읽어들이기 전에 먼저 nextLine()을 한 번 더 호출해서 해당 버퍼를 비우는 행위를 하는 것이다.
나빠보이지 않는다.
실제로 나도 해당 과제에서는 해당 방식으로 해결했다.
public class ConsoleInputManager {
private static final Scanner scanner = new Scanner(System.in);
public int inputInt() {
int intNum = scanner.nextInt();
scanner.nextLine();
return intNum;
}
public long inputLong() {
long longNum = scanner.nextLong();
scanner.nextLine();
return longNum;
}
public String inputString() {
return scanner.nextLine();
}
}
2. scanner.nextInt() 등을 쓰는것 대신에 기존에 nextLine으로 문자열을 입력받아서 이를 해당 데이터 타입으로 변환하는 것이다.
int modeNum = Integer.parseInt(scanner.nextLine());
'대외활동 > 프로그래머스 데브코스 백엔드 5기' 카테고리의 다른 글
백엔드 데브코스 3, 4개월차 회고 - 최종 프로젝트 전 마음가짐 (1) | 2024.02.08 |
---|---|
백엔드 데브코스 2개월차 회고 - 봄(스프링) (0) | 2023.11.15 |
백엔드 데브코스 1개월차 회고 - 낯선 환경 (4) | 2023.10.12 |
Error와 Exception의 차이가 뭘까? (feat. 도서 관리 과제를 하던중..) (0) | 2023.10.05 |
프로그래머스 데브코스 백엔드 5기 합격 수기 (0) | 2023.09.08 |