Home » 레퍼런스 » JAVA » java scanner skip 메서드에 대해 알아봅시다.

java scanner skip 메서드에 대해 알아봅시다.

안녕하세요. scanner 클래스에 있는 skip 메서드는 특정 패턴을 만족시키면, 입력을 skip 할 수 (버릴 수) 있는 메소드입니다. 제가 사용했던 빈도가 그리 높지 않으니, 간단하게만 알아보겠습니다.


java scanner skip 메서드에 대한 설명

먼저 skip 메서드에 대한 설명을 보겠습니다.

[그림 1] skip에 대한 설명

pattern에 매치되는 입력을 skip한다. 이것이 다입니다. 어떨 때 쓰는가? 원하지 않는 입력을 skip 해야 할 때 씁니다.

skip(pattern)

scanner로부터 pattern 형태의 입력이 들어오면 skip 합니다.

여기까지 보면, 단순하게 현재 scanner에 입력이 pattern 형태이면 무시하겠구나. 정도만 생각하실 수 있어요. 몇 가지 예제를 보면서, 어떻게 동작하는지 알아보겠습니다.


1번 예제

java scanner skip 메서드의 동작 방식을 이해하기 예제를 보겠습니다.

[그림 2] 예제 1번 프로그램

예제 1번 프로그램을 볼게요. Scanner로부터 정수 하나를 받습니다. 그리고, skip을 하고, 다시 Line 단위로 입력받습니다. skip 안에 들어가있는 패턴을 보면 \\s+라고 되어 있습니다.

  • \\s는 white space를 의미합니다.
  • +는 1개 이상을 의미합니다.

즉, 7번째 줄은 white space 하나 이상 나오는 패턴을 skip 하겠다는 의미입니다.

[그림 3] Scanner에 들어오는 입력

스캐너에 들어오는 입력을 보겠습니다. 123 다음에 공백 문자가 오고, 개행이 옵니다. 다음에 456이 오는 형태입니다.

현재 입력은 위와 같이 들어오고 있습니다. 먼저 nextInt로 받아 볼게요.

그러면 123이 nextInt로 들어갑니다. 이제 버퍼에 남아 있는 것은 공백과 개행 문자, 그리고 뒤에 딸려나오는 456입니다.

다음, 공백과 \n은 white space 문자입니다. 따라서, \\s+ 패턴을 만족하기 때문에, skip은 회색 부분을 읽어버립니다.

다음에 nextLine이 들어왔으므로, 노란색 부분을 nextLine이 긁어갑니다. 여기서 skip이 공백만 읽을 수도 있지 않았을까요? \n까지 읽은 것은 + 가 greedy했기 때문입니다.


2번 예제

이런 경우를 생각해 봅시다.

[그림 4] Scanner에 들어오는 입력

Scanner에 들어오는 입력이 123, 공백, a, 공백 4개, 개행, … 입니다. 예제 2번 프로그램을 보겠습니다.

[그림 5] 예제 2번 프로그램

예제 2번의 skip을 보면, 패턴이 \\s{2,}임을 볼 수 있어요.

  • \\s는 white space를 의미합니다.
  • {2,}는 둘 이상 반복을 의미합니다.

즉, white space가 둘 이상 반복되는 패턴이 나오면 skip을 한다는 의미입니다.

상황을 그려 봅시다. 일단, 123은 nextInt로 받을 수 있습니다. 그러고 나면

  • 공백, a, 공백, 공백, 개행 문자, … 가 남는 상황입니다.
  • 이것은 white space 둘 이상 반복되는 패턴이 아닙니다.

상황을 다시 그려보면 아래와 같습니다.

3번째 위치인 공백부터 보자고요. 공백은 white 문자이긴 하지만, white 문자가 둘 이상 반복되지 않습니다. 그렇기 때문에, 4번째 위치까지 보게 됩니다. 그런데, a는 white 문자가 아닙니다. 따라서 패턴을 만족하지 않아요.

[그림 6] 예제 2번 프로그램의 결과

NoSuchElement 예외를 던집니다. 다시 정리하면

  • java scanner skip 메서드는
    • 현재 버퍼의 시작 위치부터 특정 위치까지 pattern에 만족하는지 검사합니다.
    • 만족하는 pattern이 없으면 예외를 던집니다.
    • 만족하는 경우 해당 부분은 skip 합니다.
    • \\s+ 에서 최대한 많이 skip 한 이유는, + 가 greedy 했기 때문입니다.

regex의 greedy 쪽을 찾아보면 도움이 되지 않을까 싶습니다.

Leave a Comment

6 + 1 =