콘솔에서 입력을 받기 위해서 스캐너(java.util.Scanner)를 많이 사용하실 겁니다. 

예를 들어 int를 입력받고 싶을 땐 Scanner.nextInt()를 사용하시면 콘솔을 통해 정수를 입력받을 수 있습니다. 

그리고 라인 하나를 입력받는 Scanner.nextLine() 메소드도 많이 사용되는 메소드 중 하나입니다. 스트링을 입력받을 때 주로 사용합니다.

 

근데,  nextLine 메소드를 사용하기 전에 next, nextInt, nextLong와 같은 메소드를 사용했을 때 문제점이 생깁니다. 

nextLine 메소드가 스킵되어 버리는 문제입니다.

 

Scanner scanner = new Scanner(System.in);

ArrayList<String> list = new ArrayList<>();

int k = scanner.nextInt();

for(int i = 0; i < k; i++) {

	list.add(scanner.nextLine());

}

scanner.close();

 

위의 코드는 nextInt 메소드를 이용해 콘솔에서 정수를 입력받아 변수 k에 저장한 후,

어레이리스트에 k번만큼 String을 저장하고 있습니다. 

String을 입력받을 땐 nextLine 메소드를 사용하고 있죠. 

 

그런데 이렇게 실행시켜보시고, 어레이리스트의 사이즈를 출력해보시면 k가 아니라 k-1이 됩니다. 

nextLine 메소드가 한번 스킵되기 때문인데요,

이는 nextInt 메소드가 새로운 라인을 소비하지 않기 때문입니다. 

해결책은 세가지입니다.

 

 

1) k에 저장될 int를 입력한 후 라인을 바꾸지 말고 스페이스로 구분 후 첫번째 입력값을 넣어줍니다. 

 

이 방식은 추천하지 않는 방식입니다.

입력할 때 주의를 기울여야 하는 방식이며 입력을 받은 후 추가 처리를 해주어야 할 가능성도 있기에 번거로움이 동반됩니다. 

콘솔창으로 예를 들어 보겠습니다.

 

Hello

Java

World

만약 이렇게 콘솔에 입력하시려고 한다면,

Java를 입력하고 엔터를 치는 순간 입력이 끝나게 될 겁니다. 

3은 k로 들어가게 되고, 엔터를 치는 순간 어레이리스트의 첫번째 원소로 공백이 추가됩니다.

두번째 원소로 Hello, 그리고 Java가 마지막인 세번째 원소로 추가되게 됩니다.

 

대신,

3 Hello

Java

World

이렇게 입력하시면 원하시는 대로 스트링 세개가 모드 어레이리스트로 들어가게 됩니다.

하지만 단점이 존재합니다.

첫번째 원소인 Hello는 앞에 공백을  포함하여 들어가게 됩니다.

그래서 필요에 따라 trim 메소드를 사용하셔야 하는 번거로움을 동반할수도 있습니다.

 

 

2) nextInt 메소드 이후에 강제로 라인 하나를 소모해줍니다. 

 

우리에게 이러한 문제점이 생긴 이유는, nextInt 메소드가 라인을 소모하지 않기 때문이었습니다. 

그렇다면 입력 이후에 추가로 라인을 소모해주면 되지 않을까요.

 

Scanner scanner = new Scanner(System.in);

ArrayList<String> list = new ArrayList<>();

int k = scanner.nextInt();

scanner.nextLine();

for(int i = 0; i < k; i++) {

	list.add(scanner.nextLine());

}

scanner.close();

 

위의 코드에서처럼 nextInt 메소드 바로 아랫줄에 라인을 소모해주면 정상으로 작동하게 됩니다.

 

 

 

3) nextInt대신 nextLine을 사용하고 타입변환을 해줍니다.

 

제 생각에는 이 방법이 가장 깔끔한 방법인 것 같은데요,

말그대로 문제가 되는 nextInt대신 nextLine으로 String을 입력받은 후 타입변환을 해주는 겁니다. 

 

Scanner scanner = new Scanner(System.in);

ArrayList<String> list = new ArrayList<>();

int k = Integer.parseInt(scanner.nextLine());

for(int i = 0; i < k; i++) {

	list.add(scanner.nextLine());

}

 scanner.close();

 

nextLine으로 String을 입력받은 후 Integer 객체의 parseInt 메소드를 사용해 String을 Integer로 변환시켜주었습니다. 

이렇게 해서 깔끔하게 문제를 해결할 수 있었습니다.

 

 


오류가 있거나 질문이 있으시면 댓글로 알려주세요