Scanner 클래스의 hasNext()

10951번 문제를 풀다가 hasNextInt()라는 메서드를 처음 알게되었다.

Buffer를 이용해서 해결하려고 했는데, 도저히 해결할 수 없었고, 구글링해서 hasNextInt() 라는 함수를 알게되었다. hasNext()Scanner의 내장 함수인데, 스캐너 객체로 데이터가 들어왔는지 여부를 반환하는 함수이다.


문제에 대한 정답 코드이다.

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

while(sc.hasNextInt()){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a+b);
}
}

스터디에서 코드 리뷰를 해봤는데 아직 sc.nextInt() 에 값이 안들어왔음에도 while문이 어떻게 동작할 수 있었는가 라는 질문이 나왔다. 그래서 인텔리J에서 함수를 클릭하여 어떻게 동작하는지를 살펴보았다.

먼저 hasNextInt()이다.

1
2
3
public boolean hasNextInt(){
return hasNextInt(defaultRadix);
}

위 함수는 boolean 값을 반환하는데 여기서 반환되는, 파라미터를 갖고있는 hasNextInt()라는 함수를 찾아보면 또 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean hasNextInt(int radix) {
setRadix(radix);
boolean result = hasNext(integerPattern());
if (result) { // Cache it
try {
String s = (matcher.group(SIMPLE_GROUP_INDEX) == null) ?
processIntegerToken(hasNextResult) :
hasNextResult;
typeCache = Integer.parseInt(s, radix);
} catch (NumberFormatException nfe) {
result = false;
}
}
return result;
}

어떤 데이터타입이든 일단 데이터가 hasNextInt() 로 들어오게 되면, try catch문을 통해 예외처리를 하는 것 같다.

다시 처음 위의 hasNextInt() 함수에서 반환되는 boolean값의 파라미터인 defaultRadix를 확인해보면 다음과 같다.

1
2
// The default radix for this scanner
private int defaultRadix = 10;

Scanner 객체의 기본 정수형 인자(?)인것 같다.

아직 키보드가 입력받지 않았음에도 스캐너 객체가 생성될 수 있었던 이유가 defaultRadix가 10이었기 때문이었다.