지난 글에서는 continue/break에 대해서 알아보았습니다.
이번글에서는 Scanner클래스와 유저입력을 받는 방법에 대해서 알아보겠습니다.
자바를 사용하다보면 유저의 입력(input)을 받아야하는 상황이 많이 있습니다.
키보드로 입력을 받아야하는 경우에 자바에서 가장 널리 사용되는
Scanner클래스를 이용한 유저의 입력(input)을 받는 방법에 대해서 알아보겠습니다.
자바의 라이브러리 클래스(java library class)
먼저 Scanner클래스에 대해서 알아보려면 자바에 대해서 좀 더 알아야 합니다.
너무 깊은 내용까지는 이번글에서 다루지는 않고 Scanner클래스를 사용하는데
필요한 기본적인 내용들만 다뤄보겠습니다.
자바에서는 자주 쓰이는 코드들을 라이브러리 패키지 형태로 유저에게 제공합니다.
ex) java.lang, java.util, java.net, java.io, java.sql, java.text 등등
자바는 기본적으로 java.lang 클래스를 제공하기 때문에 이를 사용할 때는
따로 ' import '하지 않아도 됩니다.
java.util, java.sql과 같은 패키지를 사용하기 위해서는 import를 꼭 해주어야 합니다.
위와 같이 자바 파일에 import를 해주었다면 이제 클래스를 사용할 준비가 되었습니다.
곧 자세히 따로 살펴볼 내용이지만 클래스를 사용하기 위해서는 아래와 같이
오브젝트(Object)를 생성해야 합니다.
이때 오브젝트(Object) 명으로는 주로 in 또는 scan이 사용됩니다.
위와 관련해서 자세히 설명이 되어 있는 블로그글을 발견해서 아래 링크 남깁니다.
자바를 다루는데 그치지 않고 좀 더 개념적인 내용이 궁금하신 분들은 참고부탁드립니다.
https://st-lab.tistory.com/41
Scanner 클래스
자 이제 본격적으로 Scanner클래스를 사용해서 유저입력(input)을 받는
방법을 아래 코드를 보면서 살펴보겠습니다.
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
// 정수형 자료형(data type)
// byte 타입 입력 및 리턴
byte b = in.nextByte();
// short 타입 입력 및 리턴
short s = in.nextShort();
// int 타입 입력 및 리턴
int i = in.nextInt();
// long 타입 입력 및 리턴
long l = in.nextLong();
// 실수형 자료형(data type)
// float 타입 입력 및 리턴
float f = in.nextFloat();
//double 타입 입력 및 리턴
double d = in.nextDouble();
// Boolean
// boolean 타입 입력 및 리턴
boolean bool = in.nextBoolean();
// String
// String 타입 입력 및 리턴
// 공백을 기준으로 한 단어를 읽습니다.
String s1 = in.next();
// String 타입 입력 및 리턴
// 공백을 기준으로 한 줄을 읽습니다.
String s2 = in.nextLine();
}
}
주석에 설명이 자세히 써져 있으니 읽어보시길 바랍니다.
char를 입력받는 것은 따로 없습니다.
따라서 char의 경우 charAt 메소드를 사용해서 입력받아야 합니다.
기본적으로 String을 입력받는 것들을 제외하고는 모두 next다음에
대문자로 시작하는 자료형(data type)의 이름을 적어주는 방식입니다.
저 중에 주로 사용할 것들은
nextInt();
nextDouble();
next();
nextLine();
이렇게 4가지가 될 것입니다.
문자열 입력할 때 주의사항!!
다른 자료형(data type)들은 크게 문제가 없지만 이중에 문자열을
입력받는 next()와 nextLine()은 사용에 주의하셔야 합니다.
그 이유에 대해서 자세히 알아보겠습니다.
next()의 경우 공백을 기준으로 그 앞의 것만 읽어 들입니다.
nextLine()의 경우 한 줄에 입력된 것들을 읽어 들입니다.
위에 설명만 놓고 보면 아무 문제가 없어 보이지만
함께 사용하는 경우에 각별한 주의가 필요합니다.
위에서 보시는 것과 같이 "My name is Mike!"를 입력했지만 My만 담기는 모습을
확인해 볼 수 있습니다.
그렇다면 "My name is Mike!"를 다 입력받으려면 next()를 4개 사용해야 합니다.
4개를 사용하자 문제없이 출력되는 것을 확인할 수 있습니다.
문제는 next()와 nextLine()을 함께 사용할 때 발생합니다.
위에 name is Mike! 앞에 공백이 생기신 거 보이시나요?
next()는 공백 전까지만 읽어 들이기 때문에 nextLine()이 앞에 공백까지 읽어 들인 것을
확인할 수 있습니다.
이제 가장 문제가 되는 부분을 보여드리겠습니다.
아래 이미지의 My / name / is 까지가 제가 입력한 부분입니다.
이상한 점 보이시나요?
is 앞에 한 줄이 공백으로 남아있는 것을 확인해 볼 수 있습니다.
그 이유는 next()를 두 번 사용하고 다음에 nextLine()를 사용했습니다.
nextLine()은 name 다음 단어를 입력하려고 enter가 사용할 때 name
다음에는 아무것도 없기 때문에 이 아무것도 없는 것을 읽어 들였습니다.
따라서 next()와 nextLine()을 함께 사용할 때는 읽어 들이는 범위를
잘 생각해서 next() 다음에 nextLine()을 한번 더 삽입하여
아무것도 없는 빈 줄을 nextLine()이 읽어주는 것을 방지해야 합니다.
위와 같이 next() 다음에 nextLine()을 삽입하자 원하는 결과를 얻어낸 것을
확인할 수 있습니다.
next()는 공백 전까지 한 문장만을 읽어 들인다는 것과
nextLine()은 개행(enter) 전까지 한 줄을 읽어 들인다는 것을
꼭 기억해야 합니다!
지금까지 Scanner클래스를 사용해서 유저입력(input)을 받는 방법과
주의사항에 대해서 알아보았습니다.
다음 글에서는 오브젝트(Object)와 인스턴스(instance)의 차이에
대해서 알아보겠습니다.
'자바(JAVA) 기초 함께 알아보자' 카테고리의 다른 글
자바(JAVA) 기초 함께 알아보자(14) - 접근제한자(Access modifier) public/private (0) | 2024.10.04 |
---|---|
자바(JAVA)기초 함께 알아보자(13) - 자바 클래스(class) / 오브젝트&인스턴스(object & instance) (2) | 2024.09.29 |
자바(JAVA) 기초 함께 알아보자(11) - 반복문의 continue/break (2) | 2024.09.27 |
자바(JAVA) 기초 함께 알아보자(10) - for-each반복문(loop) (2) | 2024.09.26 |
자바(JAVA) 기초 함께 알아보자(9) - 배열(Array) (2) | 2024.09.25 |