Java/Java 기초 문법

[Java 기초 문법] 입력 및 Scanner 클래스

excited-hyun 2021. 7. 21. 00:47
반응형

java.util 패키지의 Scanner 클래스를 이용하여 콘솔 입력을 받는 방법은 java의 다양한 입력 방법들 중 가장 많이 사용되는 방식입니다.

c언어의 scanf(), c++의 cin, python의 input()과 비슷하다고 생각하시면 됩니다.

 

Scanner 클래스를 사용하기 위해선?

Scanner 클래스는 바로 사용할 수 있는 것이 아닙니다.

 

Scanner에 오류가 왜 뜨는 걸까요?

Scanner는 외부 패키지인 java.util에 포함되어있기 때문에 사용하기 위해서는 이를 import해주어야 사용이 가능합니다.

 

import java.util.Scanner;

이걸 써주니 더 이상 오류가 뜨지 않습니다.

 

 

입력 메소드의 사용

Scanner라는 클래스 안에 있는 메소드를 사용합니다. ex)next(), nextLine(), nextInt(), ...

new Scanner(System.in).next();

 

그런데 매번 입력마다 이렇게 new Scanner(System.in). 이라는 긴 내용을 써주는 것은 여간 귀찮은 일이 아닙니다.

따라서 Scanner의 객체를 하나 생성해두고 이를 이용하는 방식을 사용하는 것이 좋습니다.

Scanner sc = new Scanner(System.in);
String name = sc.next();

 

저 첫줄을 어떻게 외워서 써?! 라고 생각하실 수 있습니다. 그렇지만 이클립스의 자동완성이라는 아주 좋은 기능이 있기 때문에 걱정이 없습니다!

 

Scanner 클래스의 메소드에는 여러 가지 입력 메소드가 있습니다.

궁금하신 분들은 아래의 java 도큐멘트에서 java.util 패키지의 Scanner 클래스를 찾아서 next~()인 것들을 보세용

https://docs.oracle.com/javase/8/docs/api/

저는 이 중에서 주로 사용하는 것들에 대해서만 작성하겠습니다.

 

 

next()

next() 메소드는 공백 또는 엔터를 구분점으로 판단하고 분리하여 입력받습니다.

아래의 코드를 한 번 실행해 보겠습니다.

import java.util.Scanner;

public class InputTest {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 : ");
		String name = sc.next();
		System.out.println(name + "님 어서오세요.");
		System.out.println();
		System.out.println();
	}
}

 

"홍길동"을 입력하는 경우 아무 문제없이 입력되고 String 변수인 name에 잘 저장되어 출력되는 것을 확인할 수 있습니다.

 

"홍 길동"을 입력하는 경우 상황이 달라집니다. next()는 공백을 구분점으로 판단하기 때문입니다.

제가 입력한 "홍 길동"이 아닌 "홍"만이 저장됩니다. 이렇게 공백을 구분으로 입력 받는 next()와 달리 한 줄을 모두 입력받는 nextLine()이 있습니다.

 

반응형

nextLine()

nextLine() 메소드의 경우에는 공백도 문자로 포함하여 입력받습니다. 즉 한 줄씩 입력을 받는 것입니다.

 

위의 코드의 next()를 nextLine()으로 바꿔서 실행해 보겠습니다.

import java.util.Scanner;

public class InputTest {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 : ");
		String name = sc.nextLine();
		System.out.println(name + "님 어서오세요.");
	}
}

 

"홍 길동"을 입력해도 우리가 원하는 대로 결과가 나오는 것을 확인할 수 있습니다.

 

그런데, nextLine() 사용 시에 주의해야 할 점이 하나 있습니다.

아래 처럼 이름 입력부분을 다시 next()로 수정하고 그 뒤에 nextLine()으로 주소를 입력받는 코드를 추가하고 실행해 보겠습니다.

import java.util.Scanner;

public class InputTest {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 : ");
		String name = sc.next();
		System.out.println(name + "님 어서오세요.");
		System.out.println();
		
		System.out.print("주소: ");
		String addr = sc.nextLine();
		System.out.println("사는 곳 : " + addr);
	}
}

 

"홍길동"이라는 이름을 입력하고 엔터 한 번을 눌렀을 뿐인데 주소까지 입력이 완료되어 모든 실행이 끝나버렸습니다.

 

이게 어떻게 된 일일까요?

앞에 nextLine()이 아닌 다른 입력 메소드를 사용하는 입력이 있다면 nextLine()에는 그 이전 입력의 마지막에 입력한 개행(엔터)이 입력되어 그 입력이 완료되어 버립니다.

따라서 이렇게 앞에 다른 입력메소드를 사용한 경우엔 저 개행을 처리해줄 의미없는 nextLine()을 하나 미리 써줘야 합니다.

import java.util.Scanner;

public class InputTest {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 : ");
		String name = sc.next();
		System.out.println(name + "님 어서오세요.");
		System.out.println();
		
		System.out.print("주소: ");
        	sc.nextLine();			//하나 더 써줘서 개행문자 씹기
		String addr = sc.nextLine();
		System.out.println("사는 곳 : " + addr);
	}
}

이렇게 잘 입력이 되는것을 확인할 수 있습니다.

 

 

next+자료형()

이 메소드들은 뒤에 오는 자료형에 해당하는 값을 입력 받아오게 됩니다.

아래는 java 도큐멘트에서 가져온 메소드들 입니다.

boolean nextBoolean()
Scans the next token of the input into a boolean value and returns that value.
byte nextByte()
Scans the next token of the input as a byte.
double nextDouble()
Scans the next token of the input as a double.
float nextFloat()
Scans the next token of the input as a float.
int nextInt()
Scans the next token of the input as an int.
long nextLong()
Scans the next token of the input as a long.
short nextShort()
Scans the next token of the input as a short.

 

아래는 nextInt()를 사용해서 작성한 코드입니다.

import java.util.Scanner;

public class InputTest {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("나이 : ");
		int age = sc.nextInt();
		System.out.println("10년 뒤 나이 : " + (age+10) );
	}
}

 

age+10 연산까지 잘 일어나는 것을 확인할 수 있습니다.

 

728x90
반응형