용도
유저의 입력을 받는 내장 함수
방법
Scanner inputString = null;
try
{
System.out.println("이름을 입력해주세요");
inputString = new Scanner(System.in);
// system.in: 일종의 필드 정의. 구조자 역할?
this.name = inputString.nextLine();
// 사용자의 입력을 받음
// 입력 받은 값을 데이터로 반환
// 그 외에도 다양한 타입 변경 가능한 메소드 존재
} catch (Exception e) {
System.out.println(e);
} finally {
System.out.println(this.name);
inputString.close();
// 리소스 해제
}
new Scanner(system.in)
next 메소드
입력값을 데이터로 반환하는 next 관련 메소드는 반환 값의 타입이나 공백 문자와 개행 문자(\n, \t, \r 등)처리 방식을 기준으로 서로 다른 값을 반환한다.
next()
공백을 기준으로 한 단어씩 입력받는다.
개행 문자를 무시한다.
hello world 라고 입력하면
hello만 반환한다.
nextLine()
엔터를 치기 이전에 모든 문자열을 입력받는다.
개행 문자까지 다 가져온다.
한 줄 전체를 하나의 값으로 받고 싶을 때 사용한다.
실제로 많이 사용하는데, 유저의 입력은 타입이 뭔지 알수 없기 때문에 nextInt 같은 건 에러가 나기 쉽기 때문이다.
주의사항
next 시리즈로 입력 시, 마지막에 엔터도 같이 입력된다.
그런데, nextLine이 아닌 next 계열 메소드는 엔터를 무시하며 입력받은 엔터를 다음 next 메소드로 전달해버린다.
예시
System.out.println("점수를 입력하세요");
Scanner inputNum =new Scanner(System.in);
int score =inputNum.nextInt();
System.out.println("이름을 입력하세요");
String str =inputNum.nextLine();
System.out.println("당신의 점수:" + score);
System.out.println("당신의 이름:" + str);
//점수를 입력할 때 엔터키를 누르면, 이게 이름 입력 인풋으로 자동 넘어감.
// 그러면 이름을 입력 못하고 그냥 넘어가지는 거
원인
nextInt 같이 개행문자를 무시하는 메소드는 버퍼에서 받은 값 중 엔터를 무시한다.
따라서, 무시된 엔터는 다음 next로 넘어간다.
이때 nexLine은 개행문자를 인식하므로 엔터 값이 인식되는 것이다.
리소스 해제
scanner.close()
스캐너 객체를 메모리에서 해제함
java에는 가비지 컬렉터가 있어서 기본적으로 메모리가 자동관리된다.
그러나, jvm에서 관리되지 않는 일부 리소스 존재하고 이들은 그래서 명시적으로 메모리 해제를 해야 한다.
(ex: 파일 핸들, 네트워크 연결, 외부 인풋)
'java' 카테고리의 다른 글
[java/기본] 예외 처리 (0) | 2024.04.21 |
---|---|
[java/기본] 문자열 클래스(String, StringBuffer, StringBuilder) (0) | 2024.04.21 |
[java] 람다식 기초 사용법 (0) | 2024.04.21 |
[java/기본] package와 import (0) | 2024.04.20 |
[java/기본]8. 접근제한자와 데이터 은닉(getter, setter) (0) | 2024.04.20 |