안녕하세요.
오늘은 scanner 사용시에 알아두면 좋은 팁(?)을 전달해드리려고 합니다.
결론부터 말씀 드리면 입력버퍼 비우기입니다.
scanner부터 알아보겠습니다.
1. scanner
사용자로부터 입력값을 받아서 출력하는 프로그램을 만들때 사용하는 라이브러리입니다.
API 공식문서를 통해 예제 따라해보시면서 익히시길 바랍니다.
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
scanner의 핵심은 System.in 과 System.out 입니다.
- System.in
키보드나 마우스와 같은 입력 장치를 통해 들어오는 표준 입력 값 - System.out
모니터와 같이 출력 장치에서 내보내는 값
2. 입력 버퍼 비우지 않았을때 문제점
아래 코드를 통해 확인해보겠습니다.
오디션 참가자의 정보를 입력/출력하는 프로그램이라고 가정합시다.
이 때 이름/나이를 입출력합니다.
public class BufferMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("이름을 입력해주세요: ");
String name = scanner.nextLine();
System.out.println("나이를 입력해주세요: ");
int age = scanner.nextInt();
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
이름, 나이를 순서대로 입력 받아 문제없이 출력되는 것을 확인할 수 있죠.
여기서 참가번호를 추가해보겠습니다. 문제는 여기서 발생합니다.
public class BufferMain2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("참가번호를 입력해주세요: "); // 추가
int id = scanner.nextInt();
System.out.println("이름을 입력해주세요: ");
String name = scanner.nextLine();
System.out.println("나이를 입력해주세요: ");
int age = scanner.nextInt();
System.out.println("참가번호 : " + id);
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
참가번호만 입력했을 뿐인데, 이름을 패스하고 바로 나이로 넘어가게 됩니다?
nextInt() → nextLine() 넘어가는 과정에 주목 해야합니다.
- nextInt() 는 입력값으로 들어온 값 중에 Enter나 공백을 기준, 그 앞의 Int형 값을 가져옵니다.
ㄴ 즉, 13만 입력한 것처럼 보이지만 실제 값은 13 + enter(\n) 인거죠.
ㄴ 여기서 nextInt()는 "13"만 입력받아 출력합니다.
ㄴ 그럼 남아있는 enter키는요? 입력버퍼에 저장됩니다 - 저장된 enter키는 nextLine()에 강제로 넣어주는 거죠.
ㄴ 즉, 이름을 입력할 자리에 enter값이 들어가게 된거죠. 그래서 바로 패스.
ㄴ그리고 나이를 입력해야하는데 Jessi라는 string값이 들어오니 Exception이 발생한거고요.
요약 : 개발자 의도와 전혀 다르게 구현되었음
개발자 의도 : 참가번호 → 이름 → 나이, 순서에 따라 입력한 값을 출력하는 것
실제 구현 : 참가번호 → 나이만 입력 받아 출력됨
3. 그래서 필요한게 "입력버퍼 비우기"
버퍼(buffer)는 사용자가 키보드나 마우스를 통해 입력한 데이터를 임시적으로 저장하는 메모리 공간입니다.
위의 예시로 미루어보아 enter키가 입력버퍼에 임시저장되어 nextLine()에 할당하는 그런 개념인 거죠.
그래서 임시 저장값을 비워주는 겁니다.
입력버퍼값에 저장된 enter값을 name에 할당되지 않도록, 별도 처리를 하는거죠.
public class BufferMain2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("참가번호를 입력해주세요: ");
int id = scanner.nextInt();
scanner.nextLine(); // 입력 버퍼 비우기 위한 코드 -> enter 할당
System.out.println("이름을 입력해주세요: ");
String name = scanner.nextLine();
System.out.println("나이를 입력해주세요: ");
int age = scanner.nextInt();
System.out.println("참가번호 : " + id);
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
입력버퍼 비우기 처리를 하니 의도대로 프로그램이 작동하네요.
결론
nextInt() → nextLine(), 입력 버퍼 비우는 처리가 필요하다.
- scanner.nextLine(); // 입력 버퍼를 비우기 위한 코드
[출처]
'Java' 카테고리의 다른 글
[Java8] Functional Interface 알아보기 (+ 기본형 특화 인터페이스) (0) | 2024.04.21 |
---|---|
Java String format 함수를 활용해보자 (0) | 2024.03.05 |
[기초문법] Java8 Stream 적용/미적용 실습해보기 (0) | 2024.01.16 |
Builder패턴을 사용하는 이유 (0) | 2024.01.10 |
자바 메모리 구조 (0) | 2023.12.02 |