기본적인 데이터 타입들을 입력받을 수 있다.
사용을 위해선 무조건 Java.util.Scsanner; 패키지를 import 해와야한다.
공백 또는 개행을 기준으로 읽게 된다.
Scanner sc = new Scanner(System.in);
여기서 참조한 변수의 타입은 Scanner 클래스이고, 괄호 안에 System.in은 콘솔에 명령어를 입력하면 그것을 프로그램에 받아오겠다는 뜻이다.
sc.next???()
해당 코드의 물음표가 무엇이냐에 따라 리턴할 타입이 결정된다. 여기서 유의해야할 사항으로는 next와 nextLine의 차이이다.
이 두 개의 차이을 설명하자면, 문자열 '안녕하세요 세상사람들' 이라는 문자열을 각각 next와 nextLine에 입력 시 결과는 이렇게 나온다
next의 경우
nextLine의 경우
다른 언어에서의 입력 기능은 .close 라는 기능을 지원하지 않는다. 어째서 자바에는 이것이 있는걸까? 에 대해 궁금하여 찾아보았다. 그리고 아래의 의견을 찾게 되었다
자바에서 가비지컬렉션으로 메모리 점유를 자동으로 해제하는 기능이 있습니다. 있는데...
자동 해제하는 대상은 "사용중이지 않은" 데이터가 대상입니다.
가령, 어떤 변수로도 접근이 불가능해진 객체라든가 말이죠.
일단 scanner 이라는 변수에 저 Scanner 객체가 담겨있다는 것만으로도 가비지 컬렉션 대상에서 제외이구요.
그리고 메모리에서만 내려간다고 해결될 문제도 아닙니다. OS 자원도 되돌려 줘야죠. (메모리와 OS 자원은 따로 생각해주세요.)
님의 경우 OS 자원에서 프로세스의 표준 입력을 가지고 왔을겁니다.
scanner = new Scanner(System.in); <-- 이렇게 하셨죠?
그래야 키보드 입력을 받으니까요.
그러면 이 Scanner 객체는 OS 에서 제공한 표준 입력을 계속 잡고 있게 되죠.
사용 끝냈으면 이걸 해제해서 되돌려 줘야죠
표준 입출력은 큰 문제는 없는데, 표준입출력 대신 파일을 물린다거나 네트워크 포트 소켓을 물린다거나 하면
가령 파일을 물렸다고 하면, close 하기 전에는 다른 프로그램이 그 파일 액세스 함부로 못해요.
이 의견을 다시 내가 생각하기에는 자바에선 가비지 컬렉션이라는 메모리 점유를 자동으로 해체하여 메모리의 효율성을 높여주는 기능이 있는데 여기서 Scanner 객체가 코드에 담겨있다는것 자체만으로 메모리을 잡아먹게 된다. 문제는 이게 비사용 중일 때도 먹고있다는 것이다. 그렇기 떄문에 이것을 해체하여 OS자원과 메모리을 돌려주어야 된다는 것이다. 만약, 안돌려주고 쭉 잡고 있다 파일 액세스를 시도 시 물려버리면 다른 프로그램이 해당 파일의 액세스가 불가하기 때문에 이것을 close로 풀어주는 것이다.