자바에서 사용자로부터 키를 입력받는 방법에 대해 정리해 보려고 합니다.
보통 자바 문법을 학습하게 되면 사용자로 부터 키를 입력받을 때 다음과 같이 작성해야 한다고 배웁니다.
//Scanner 객체 생성
Scanner sc = new Scanner(System.in);
//입력받은 문자열 변수에 저장
String text = sc.nextLine();
정확히 키 입력을 받을 때 사용하는 `Scanner`라는 것과 `System.in`이 무엇인지 그리고 어떻게 키를 입력받아서 화면에 출력되는지에 대해 좀 더 자세히 정리해 보려 합니다.
System.in
`System.in`은 키보드 장치를 직접적으로 제어하고 사용자로 부터 키를 입력받는 표준 입력 스트림 객체입니다. 사용자가 키보드로 입력을 하면 `System.in`을 통해 바이트 데이터로 변환시켜 자바 응용 프로그램에게 전달해 줍니다.
하지만, 이렇게 `System.in`으로 입력된 키를 단순한 바이트 데이터로 변환하여 바로 자바 응용프로그램에게 전달하면 바이트 데이터를 문자나 숫자로 변환해줘야하는 번거로움이 발생합니다. 그래서 키보드에서 입력된 키를 문자나 숫자(정수, 실수, 문자열) 등으로 사용자가 원하는 타입으로 변환해 주는 Scanner 클래스를 사용해 주게 되었습니다.
Scanner
`Scanner`는 자바 응용프로그램이 사용자가 입력한 키 입력을 쉽게 받을 수 있도록 자바 패키지에서 제공해주는 클래스입니다.
`Scanner`객체를 다음과 같이 생성해 주면 사용할 수 있습니다.
//Scanner 객체 생성
Scanner sc = new Scanner(System.in);
생성된 `Scanner` 객체인 `sc`는 `System.in`객체를 이용하여 사용자가 키보드로 입력한 일련의 데이터들을 바이트 데이터로 변환해 주고, 변환한 바이트 데이터들은 정수, 실수, 문자, 문자열 등으로 변환하여 자바 응용프로그램이 원하는 타입으로 리턴해 주는 과정을 거칩니다.
`Scanner` 클래스는 사용자가 입력하는 키 값을 공백문자 (' ', '\t', '\n')를 기준으로 분리하여 토큰 단위로 읽어 옵니다.
예를 들어 사용자가 "Hi Seoul 2024 11.5 true"를 입력하면 `Scanner`객체인 `sc`는 공백문자를 기분으로 "Hi", "Seoul", "2024", "11.5", "true"의 토큰 단위로 읽어옵니다.
import 문
이렇게 편리한 `Scanner` 클래스 자바에서 제공해 주는 패키지 클래스이기 때문에 사용하기 위해서는 프로그램의 맨 앞줄에 다음과 같은 import문을 작성해 주어야 합니다.
import java.util.Scanner;
`Scanner` 클래스는 자바에서 제공되는 `java.util`패키지 안에 있기 때문에 import문을 통해 `Scanner` 클래스가 있는 경로명이 `java.util.Scanner`라고 명시해 주어야지 컴퓨터가 해당 경로에서 `Scanner` 클래스를 찾아서 사용할 수 있습니다.
Scanner 클래스의 주요 메서드
메소드 | 설명 |
String next() | 다음 토큰을 문자열로 리턴 |
byte nextByte() | 다음 토큰을 byte 타입으로 리턴 |
short nextShort() | 다음 토큰을 short 타입으로 리턴 |
int nextInt() | 다음 토큰을 int 타입으로 리턴 |
long nextLong() | 다음 토큰을 long 타입으로 리턴 |
float nextFloat() | 다음 토큰을 float 타입으로 리턴 |
double nextDouble() | 다음 토큰을 double 타입으로 리턴 |
boolean nextBoolean() | 다음 토큰을 boolean 타입으로 리턴 |
String nextLine() | '\n'을 포함하는 한 라인을 '\n'을 버린 나머지 문자열을 리턴 |
void close() | Scanner 사용 종료 |
Scanner 객체 닫기
`Scanner`객체의 사용을 종료하려면 다음과 같이 작성해 주면 됩니다.
sc.close();
선언해 준 `Scanner`클래스의 객체가 닫히면, `System.in`도 함께 닫히기 때문에 `System.in`을 사용하여 키 입력을 받을 수 없습니다.
Scanner sc = new Scanner(System.in);
String text1 = sc.nextLine();
System.out.println(text1);
//오류 발생
sc.close();
Scanner sc2 = new Scanner(System.in);
String text2 = sc2.nextLine();
System.out.println(text2);
응용프로그램은 `Scanner` 객체인 `sc`를 닫는 코드가 없으면 컴파일 시에 경고(warning)가 발생하지만, 실행하는데 특별한 문제가 없고, 프로그램을 종료하면 자동으로 닫히기 때문에 `Scanner`객체를 닫는 코드를 거의 생략하는 편입니다.
개발자는 응용 프로그램 전체에 Scanner 객체를 하나만 생성하여 공유하여 사용하는 것이 바람직합니다. 왜냐하면 Scanner 객체를 여러 개 생성하여도 모든 Scanner 객체는 하나뿐인 System.in을 공유하므로 한 곳에서 sc.close()를 사용하여 객체를 닫아버리면 System.in도 닫혀버리기 때문에 위와 같이 다른 Scanner 객체인 sc2를 생성하여도 사용자로부터 키를 입력받을 수가 없습니다.
이상 자바에서 키를 입력받는 방식에 대해서 정리해 보았습니다.
Reference
- 황기태, 김효수, 명품 Java Programming. 생능출판, 2019
- Oracle, Java docs https://docs.oracle.com/en/java/javase/17/docs/api/index.html
Overview (Java SE 17 & JDK 17)
This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP
docs.oracle.com
'수수한 코딩세상 > Java' 카테고리의 다른 글
[Java] 호출 방식으로 알아보는 인스턴스 멤버 & 클래스 멤버 차이 (1) | 2024.07.31 |
---|---|
[Java] 문자열(String)로 알아보는 == 연산자와 equals() 메서드 차이 (0) | 2024.07.29 |
[Java] 요리 레시피 노트패드로 알아보는 next(), nextLine() 차이점 (1) | 2024.07.24 |
[Java] 랜덤 닉네임 생성기 (1) | 2024.06.19 |
[Java] Java 란? (0) | 2024.06.18 |