[Java] Scanner() 메서드 총정리

ᴄsᴇ ᴘᴇʙʙʟᴇ·2021년 9월 20일
2

Java 공부노트

목록 보기
1/2
post-thumbnail
post-custom-banner

Scanner 클래스의 메서드

Java에서 자주 사용하는 Scanner 클래스의 메서드에 관해
아래의 내용을 정리합니다.

  • 각 메서드가 언제 사용될까?
  • Scanner() 메서드 사용시 주의해야 할 점

1. Scanner() 메서드는 각자 언제 사용될까?


메서드기능
next()String을 읽음. 단, 띄어쓰기 뒷부분은 읽지 않음.
nextLine()String을 읽음. 띄어쓰기를 포함하여 한 줄(즉, Enter를 치기 전까지)을 읽음.
nextInt()int 를 읽음.
nextBoolean()boolean 을 읽음
nextByte()byte 를 읽음
nextShort()short 를 읽음
nextLong()long 을 읽음
nextFloat()float 을 읽음
nextDouble()double 을 읽음


2. Scanner() 메서드 사용시 주의해야 할 점

🥀 Scanner 클래스는 "토큰 단위"로 읽는다!

  • 토큰(Token) : 공백문자(Spacebar, Tab, Enter 등)로 구분되는 요소

⌨️ 예제

import java.util.Scanner;

public class JavaScanner {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		String name = scanner.next();
		String gender = scanner.next();
		int AdmissionYear = scanner.nextInt();
		double gradeGoal = scanner.nextDouble();
		
		System.out.println(name + gender + AdmissionYear + gradeGoal);
		
		scanner.close();
	}
}

👉🏻 결과

  • Scanner 클래스는 입력값을 토큰 단위로 읽는다.
    (단, nextLine()은 예외이다. nextLine()Enter 단위로 읽는다.)

  • 스페이스바로 구분된 토큰들은 pebble, female, 2020, 4.3 이므로
    각 토큰들은 Scanner 메서드에 하나하나 순서대로 들어간다.

  • 즉, name에는 pebble, gender에는 femle, AdmissionYear에는 2020, gradeGoal에는 4.3이 들어간 것이다.


🥀 공백문자는 사라지지 않는다!

어떤 값을 입력받을 때, 컴퓨터는 공백문자까지도 버퍼에 저장한다.

즉, 내가 입력한 Spacebar나 Enter, Tab도 입력값과 함께 버퍼에 저장이 되고, 해당 공백문자를 다른 곳에서 읽어들이기 전까지버퍼에 남아있는 것이다.


🥀 주의해야 할 메서드, nextLine()

nextLine() 메서드와 나머지 메서드의 차이점 2가지

  1. nextLine() 메서드는 Enter 단위로 읽고,
    나머지 메서드들은 토큰(Token) 단위로 읽는다.

  2. 입력값을 읽어들일 때,
    nextLine() 메서드는 '\n'를 포함해서 읽어들이고,
    나머지 메서드들은 '\n'뿐만 아니라 다른 공백문자도, 제외해서 읽어들인다.

  3. 반환할 때,
    nextLine() 메서드는 '\n'을 버려서 return 하고,
    나머지 메서드들은 애초에 공백문자를 제외해서 읽어들였으므로 당연히 반환값도 공백문자가 제외된 상태로 return 된다.

상세 설명

(1) nextLine()을 제외한 나머지 Scanner 클래스의 메서드

  1. 토큰(Token) 단위로 읽는다.

  2. 입력값을 읽을 때 공백문자를 제외해서 읽어들인다.

  3. 그에 따라 반환할 때도 당연히 공백문자를 제외한 값을 return 한다.

⌨️ 예제

import java.util.Scanner;

public class checkInputBuffer {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		int a = scanner.nextInt();
		System.out.println(a); 

	}
    
}
  • 이 예제에서, 사용자가 "5_(Spacebar)"를 입력했다고 하자.

  • nextInt() 메서드는 입력값을 읽을 때 공백문자(여기서는 Spacebar)를 제외해서 읽으므로, "5"만 읽어들인다.

  • 그렇게 되면 입력 버퍼에는 "5"가 나가고 "_"만 남게 된다.

  • a의 출력 결과를 보면, 애초에 nextInt()가 입력값을 읽을 때 5만 읽어서 반환하여 a에 저장했므로 출력값도 "5_"가 아닌 "5"가 된다.


(2) nextLine() 메서드

  1. Enter 단위로 읽는다.
    (즉, Spacebar와 같은 공백문자들은 포함해서 한 줄을 읽음)

  2. 읽을 때는 (입력 버퍼에 저장되어있는) 공백문자를 포함하는 한 줄을 읽는다.

  3. 값을 반환할 때(결과를 출력할 때)는 '\n'(Enter)을 버린 나머지만 return

⌨️ 예제 1

import java.util.Scanner; 

public class Test {
    public static void main(String[] args) {
    
        Scanner scanner = new Scanner(System.in);
 
        int num = scanner.nextInt();
        String str = scanner.nextLine();
 
        System.out.println("num 값:"+ num);
        System.out.println("str 값:"+ str);
        
        scanner.close();
    }
}
  • 이 예제에서 사용자가 num에는 "5"를, str에는 "I love you"를 저장하길 원한다고 하자.

  • 사용자가 nextInt() 메서드에 "5\n(Enter)"를 입력했다고 하자.

  • nextInt() 메서드는 입력값을 읽을 때 공백문자(여기서는 Enter)를 제외해서 읽으므로, "5"만 읽어들인다.

  • 그렇게 되면 입력 버퍼에는 "5"가 나가고 "\n"만 남게 된다.

  • nextLine() 메서드는 입력값을 읽을 때 (입력 버퍼에 저장되어있는) 공백문자를 포함하여 읽는다.
    즉, nextInt()로 인해 입력 버퍼에 저장된 "\n"까지 읽어들이는 것이다.

  • 그런데 nextLine()Enter 단위로 값을 읽으므로, 입력 버퍼에 저장된 "\n"를 읽은 후 입력값을 모두 읽어들였다고 생각하고 넘어가버린다.
    즉 "I love you"를 입력하기도 전에 입력을 끝내버리는 것이다.

  • nextLine()은 반환시에는 "\n"를 버리고 반환하므로, 결국에는 아무것도 return 되지 않게 된다.

  • 결과를 보면 str 값은 어떠한 공백문자도 값도 없이 아무것도 출력되지 않은 것을 확인할 수 있다.

  • cf) 위의 예시에 "5\n"와 "I love you" 대신에 "5_like"를 입력하면 결과는 다음과 같다. 이유는 스스로 분석해보자.


⌨️ 예제 2 (예제 1 문제 해결)

사용자가 원하던대로 num 값에 5를 넣고, str 값에 "I love you"를 넣고 싶다면 아래와 같이 작성해주면 된다.

import java.util.Scanner; 

public class Test {
    public static void main(String[] args) {
    
        Scanner scanner = new Scanner(System.in);
 
        int num = scanner.nextInt();
        scanner.nextLine(); //enter를 버려주는 역할
        String str = scanner.nextLine();
 
        System.out.println("num 값:"+ num);
        System.out.println("str 값:"+ str);
        
        scanner.close();
    }
}
  • nextLine()입력 버퍼에 저장된 공백문자까지 읽어온다는 특성과,
    반환시 Enter 값(\n)을 버리고 return 한다는 특성을 이용하여
    "5\n"로 인해 생긴 "\n"을 반환시에 버려주는 nextLine() 메서드를 중간에 작성해준다.

⌨️ 예제 3

import java.util.Scanner; 
public class Test {
    public static void main(String[] args) {
    
        Scanner scanner = new Scanner(System.in);
 
        String str1 = scanner.next(); 
        String str2 = scanner.nextLine(); 

        System.out.println("str1:" + str1);
        System.out.println("str2:" + str2);
        scanner.close();
    }
}

  • 앞서 배운 내용을 참고하여, 왜 결과가 이렇게 나왔는지 생각해보자.

  • "들어갈까요" 앞에 "_"가 되어있다는 것에 주목하자.



3. 결론

Scanner 클래스의 메서드를 사용할 때, nextLine() 메서드를 주의하자!

nextLine() 앞에 공백문자를 사용할 때, 특히 Enter를 사용할 때
웬만하면 nextLine()을 한번 더 써주어서 공백문자를 없애주자.



참고 사이트 & 예제 출처

profile
ꜱɪɴᴄᴇ 2021.09.01
post-custom-banner

0개의 댓글