안녕하세요. scanner 클래스에 있는 skip 메서드는 특정 패턴을 만족시키면, 입력을 skip 할 수 (버릴 수) 있는 메소드입니다. 제가 사용했던 빈도가 그리 높지 않으니, 간단하게만 알아보겠습니다.
java scanner skip 메서드에 대한 설명
먼저 skip 메서드에 대한 설명을 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip2.png)
pattern에 매치되는 입력을 skip한다. 이것이 다입니다. 어떨 때 쓰는가? 원하지 않는 입력을 skip 해야 할 때 씁니다.
skip(pattern)
scanner로부터 pattern 형태의 입력이 들어오면 skip 합니다.
여기까지 보면, 단순하게 현재 scanner에 입력이 pattern 형태이면 무시하겠구나. 정도만 생각하실 수 있어요. 몇 가지 예제를 보면서, 어떻게 동작하는지 알아보겠습니다.
1번 예제
java scanner skip 메서드의 동작 방식을 이해하기 예제를 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip5.png)
예제 1번 프로그램을 볼게요. Scanner로부터 정수 하나를 받습니다. 그리고, skip을 하고, 다시 Line 단위로 입력받습니다. skip 안에 들어가있는 패턴을 보면 \\s+라고 되어 있습니다.
- \\s는 white space를 의미합니다.
- +는 1개 이상을 의미합니다.
즉, 7번째 줄은 white space 하나 이상 나오는 패턴을 skip 하겠다는 의미입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip10.png)
스캐너에 들어오는 입력을 보겠습니다. 123 다음에 공백 문자가 오고, 개행이 옵니다. 다음에 456이 오는 형태입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip6.png)
현재 입력은 위와 같이 들어오고 있습니다. 먼저 nextInt로 받아 볼게요.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip7.png)
그러면 123이 nextInt로 들어갑니다. 이제 버퍼에 남아 있는 것은 공백과 개행 문자, 그리고 뒤에 딸려나오는 456입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip8.png)
다음, 공백과 \n은 white space 문자입니다. 따라서, \\s+ 패턴을 만족하기 때문에, skip은 회색 부분을 읽어버립니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip9.png)
다음에 nextLine이 들어왔으므로, 노란색 부분을 nextLine이 긁어갑니다. 여기서 skip이 공백만 읽을 수도 있지 않았을까요? \n까지 읽은 것은 + 가 greedy했기 때문입니다.
2번 예제
이런 경우를 생각해 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip11.png)
Scanner에 들어오는 입력이 123, 공백, a, 공백 4개, 개행, … 입니다. 예제 2번 프로그램을 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip12.png)
예제 2번의 skip을 보면, 패턴이 \\s{2,}임을 볼 수 있어요.
- \\s는 white space를 의미합니다.
- {2,}는 둘 이상 반복을 의미합니다.
즉, white space가 둘 이상 반복되는 패턴이 나오면 skip을 한다는 의미입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip13.png)
상황을 그려 봅시다. 일단, 123은 nextInt로 받을 수 있습니다. 그러고 나면
- 공백, a, 공백, 공백, 개행 문자, … 가 남는 상황입니다.
- 이것은 white space 둘 이상 반복되는 패턴이 아닙니다.
상황을 다시 그려보면 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip14.png)
3번째 위치인 공백부터 보자고요. 공백은 white 문자이긴 하지만, white 문자가 둘 이상 반복되지 않습니다. 그렇기 때문에, 4번째 위치까지 보게 됩니다. 그런데, a는 white 문자가 아닙니다. 따라서 패턴을 만족하지 않아요.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/ja_skip15.png)
NoSuchElement 예외를 던집니다. 다시 정리하면
- java scanner skip 메서드는
- 현재 버퍼의 시작 위치부터 특정 위치까지 pattern에 만족하는지 검사합니다.
- 만족하는 pattern이 없으면 예외를 던집니다.
- 만족하는 경우 해당 부분은 skip 합니다.
- \\s+ 에서 최대한 많이 skip 한 이유는, + 가 greedy 했기 때문입니다.
regex의 greedy 쪽을 찾아보면 도움이 되지 않을까 싶습니다.