이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[Java] Scanner클래스의 nextLine()과 next() 사용 시 주의점

  • 2021.10.05 17:22
  • Programming Language/Java

한 줄로 입력받아 split을 이용해 배열로 처리해 줄 때 nextLine() 메서드를 쓰는 경우가 많다.

하지만, nextLine()과 next() 메서드를 함께 쓸 때, 가끔씩 원하는대로 입력되지 않는 경우가 있다.

 

어떤 이유 때문인지, 어떻게 해결할 수 있을 지에 대해 알아보자.

 

선행 지식으로 버퍼에 대한 지식이 필요하다.

데이터를 한 곳에서 다른 곳으로 전송할 때, 임시로 데이터를 보관하는 영역을 버퍼라고 한다.

즉 스캐너를 통해 키보드로 입력을 받을 경우, print로 출력을 할 경우 모두 데이터가 버퍼에 저장된다.

 

int a = sc.nextInt();

 

위 코드의 실행 과정을 살펴보자.

스캐너 클래스의 nextInt() 메서드가 실행된 직후에는 버퍼에 아무 내용도 없기 때문에

키보드로부터 입력을 기다리는 상태가 된다.

 

10과 엔터를 눌렀다고 해 보자.

그러면 버퍼에는 10\n이 저장된다.

 

스캐너는 화이트스페이스를 기준으로 입력 데이터를 나누는데,

화이트 스페이스에는 공백(space) / 탭(tab) / 엔터(\n) 가 있다.

10\n 을 입력받을 경우 엔터를 기준으로 데이터가 구분되기 때문에, 

버퍼는 10을 가져오고, \n은 남겨진다.

 

 

 

Scanner sc = new Scanner(System.in);

으로 스캐너 클래스를 생성했다고 하자.

 

sc.next(); 

>> 입력받은 값 중 공백 전 까지 문자열로 반환한다.

sc.nextInt();

>> 입력받은 값 중 정수만을 반환한다.

(nextDouble nextFloat도 동일한 맥락)

 

sc.nextLine();

>> 입력받은 한 줄을 문자열로 반환한다.

여기서 한 줄이라는건, 입력의 시작부터 \n전 까지를 의미한다.

그러니 \n 전에 뭐가 있든 다 읽어올 수 있다는거다.

 

next() next() next() next() nextInt()...

 

String a1 = sc.next();

String a2 = sc.next();

int a3 = sc.nextInt(); 

다음 코드가 작성됐다고 하자.

asdf\nqwer\n1234\n를 입력할 시

첫 번째로 asfd가 저장되고 버퍼에는 \n이 남는다.

두 번째로 버퍼에 \n이 남아있지만, 개행문자만 남아있으니 건너뛰고 다음 입력인 qwer\n을 받아온다.

여기서 다시 qwer만 저장되고 \n은 버퍼에 남아있게 된다.

마지막 a3에도 같은 맥락으로 123이 저장된다.

엔터가 아니라 탭, 띄어쓰기에도 동일하게 적용된다.

 

nextLine(); nextLine(); nextLine(); nextLine();....

 

String a1 = sc.nextLine();

String a2 = sc.nextLine();

String a3 = sc.nextLine();

다음 코드가 작성됐다고 하자.

qwer\nasdf\nzxcv\n를 입력했다고 하면,

a1에는 qwer이 저장되고 버퍼에는 아무것도 남지 않는다.

같은 방법으로 a2에 asdf a3에 zxcv가 저장된다.

엔터 대신 탭, 스페이스바로 대신 사용할 수 없다.

 

next(); nextLine();

 

String a1 = sc.next();

String a2 = sc.nextLine();

다음 코드가 작성됐다고 하자.

qwer\nasdsf\n 을 입력하려고 하지만

qwer\n에서 실행이 멈춘다.

a1에 qwer이 저장된 다음 버퍼에는 \n가 남아있는데

nextLine()메서드는 \n를 기준으로 입력받기 때문에

a2에는 공백이 입력된다.

 

qwer\tasdf\n를 입력했다고 하면

a1에는 qwer이 저장되고

a2에는 \tasdf 가 저장된다.

스페이스를 넣어도 같은 결과가 나온다.

 

즉, next(); 다음 nextLine() 메서드를 사용할 시 의도하지 않은 결과가 나타난다.

 

해결책

 

next(); 다음에 nextLine();을 한줄 추가해 버퍼에 남아있는 \n을 지워준다.

 

이것 외에도 여러 가지 해결방법이 있지만, 이 방법이 가장 깔끔하다.

 

 

 

반응형

'Programming Language > Java' 카테고리의 다른 글

[Java] 스트림 (Stream)  (0) 2021.10.25
[Java] 람다식 (Lambda expression)  (0) 2021.10.25
[Java] 컬렉션 프레임웍 (Collections Framework)  (0) 2021.10.19
[Java] 열거형 (enums)  (0) 2021.10.18
[Java] 지네릭스 (Generics)  (0) 2021.10.17

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Java] 람다식 (Lambda expression)

    [Java] 람다식 (Lambda expression)

    2021.10.25
  • [Java] 컬렉션 프레임웍 (Collections Framework)

    [Java] 컬렉션 프레임웍 (Collections Framework)

    2021.10.19
  • [Java] 열거형 (enums)

    [Java] 열거형 (enums)

    2021.10.18
  • [Java] 지네릭스 (Generics)

    [Java] 지네릭스 (Generics)

    2021.10.17
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (605)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (68)
      • Operating System (18)
      • Computer Network (16)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바