Java - Scanner 클래스 next(), nextLine()의 차이
next()와 nextLine()의 차이
next()
- 공백( \t ), 엔터( \n )를 기준으로 한 단어 또는 한 문자씩 입력받는다.
- 문자열 내에 엔터( \n ), 공백( \t ) 등은 입력되지 않는다.
nextLine()
- 엔터( \n )를 포함한 문자열 전체를 입력받는다.
- 버퍼에 포함된 개행문자를 포함해서 입력받는다.
한마디로, next()와 nextLine()은 개행문자의 포함 유무로 나뉜다.
개행문자란?
표시 위치를 다음의 행으로 옮기는 데 사용되는 문자. 쉽게 말해 Enter( \n )등 을 의미한다.
예를 들어보자
System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt();
System.out.print("연산자를 입력하세요: ");
String operator = scanner.nextLine();
System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();
이 코드를 출력하면
다음과 같이 연산자를 입력받지않고 바로 다음 명령어로 넘어가는 상황이 발생한다.
이유는 무엇일까?
int num1 = scanner.nextInt();
이 명령어에서 숫자 123을 입력할 때 Enter를 누르며 123\n이 입력되고 int는 정수를 입력받는다.
즉, nextInt()에 123이 입력되고 문자 " \n "이 버퍼에 남아 있어
다음 nextLine() 명령어가 버퍼에 남아있는 " \n " 값을 포함하여 입력받아 바로 다음 명령어로 넘어가버리는 문제가 발생하는것이다.
버퍼(Buffer)란?
일종의 임시 데이터 저장공간을 뜻한다.
이를 해결하려면 어떻게 해야할까?
System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt(); // 123\n 입력 (\n은 Enter를 의미한다.)
System.out.print("연산자를 입력하세요: ");
String operator = scanner.nextLine(); // 버퍼에 남아있는 "\n" 값을 가져감
operator = scanner.nextLine();
System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();
위 처럼 nextLine() 명령어를 하나 더 생성하여 남아있는 " \n " 값을 가져가도록 해주면 된다. (버퍼 비우기)
또 다른 방법으로는
System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt(); // 123\n 입력 (\n은 Enter를 의미한다.)
System.out.print("연산자를 입력하세요: ");
String operator = scanner.next(); // 남아있는 "\n" 값을 무시
System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();
개행문자를 무시하는 next() 명령어를 넣어준다.
두 해결방법 모두 위와 같이 정상적으로 출력되는 모습을 볼 수 있다.
'Java' 카테고리의 다른 글
Entity에 Setter사용을 지양하는 이유 feat.DTO, Entity 간 변환 (0) | 2024.09.26 |
---|