1. System.in
2. Scanner
3. BufferedReader
자바
System.in
일반적으로 keyboard 입력을 지칭하는 Standard Input Stream 입니다.
- System.in은 키보드 장치를 직접 제어하고 키 입력을 받는 표준 입력 스트림 객체이다.
- 입력된 키를 바이트 정보로 제공하기 때문에 응용프로그램은 이 정보를 다시 문자나 숫자로 변환해야 한다.
- java.util.Scanner 클래스
- 데이터 형을 받기 편하다.(문자열로 받는건 같지만 입력하면서 바로 형변환이 일어난다.)
- 입력값의 경계로 공백, 엔터 모두 인식이 가능하다.
- IOException을 숨긴다.
- 동기화 되지 않는다.
- buffer 사이즈 1024
Scanner 객체 생성
Scanner scan = new Scanner(System.in);
- 응용프로그램이 키 입력을 쉽게 받을 수 있도록 자바에서 제공하는 클래스이다.
- Scanner 객체는 System.in 객체를 이용하여 키보드로 바이트 정보를 입력받고, 자바 응용프로그램이 원하는 타입으로 변환하여 리턴한다.
next() 와 nextLine()
- next()는 공백이 낀 문자열을 읽을 수 있다.
- nextLine()은 <Enter>키를 입력을 기다리며 <Enter>키 입력 시 빈 문자열("")을 리턴한다.
Scanner 객체 닫기
scan.close()
- Scanner 객체가 닫히면 System.in도 함께 닫혀서 키 입력을 받을 수 없음
- Scanner 객체를 여러개 생성해도 System.in을 공유하므로 한 군데서 Scanner.close()를 호출하여 객체를 닫아버리면 System.in도 닫혀서 다른 Scanner 객체에서도 키 입력을 받을 수 없게 된다.
- 응용프로그램에서 Scanner를 닫는 코드가 없으면 컴파일 시 warning(노란 표시) 경고가 발생하지만 실행에는 문제 없다.
bufferedreader
- Java.io.BufferedReader 클래스
- 데이터가 문자열로 먼저 저장되기 때문에 형변환 필수
-입력값이 엔터만 인식하기때문에 한 라인에 여러가지 입력하고 싶으면 stringtokenize 필수
(stringtokenize없이 입력하면 공백을 문자열로 인식)
- IOException을 던져야 한다.(throws)
- 입력과 동시에 동기화 된다.
- buffer 사이즈 8192
bufferedreader는 기존의 inputstreamreader에 버퍼링이 추가된 class이다.
기존의 inputstreamreader는 문자열을 한글자씩 읽어왔었지만 여기에 buffer를 추가하므로써 문자열을 한번에 저장하고 필요할 때 거내 올 수 있게 되었다. 읽을면서 출력해야하는 것보단 일단 저장하고 필요할때 출력만 하면 되기 때문에 속도가 빨라지고 부하가 적다.
scanner
package org.example;
import java.util.Scanner;
public class Scanner1 {
// IOException을 던질 필요 없음
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 형 변환을 따로 안해줘도 알아서 int형으로 저장된다.
// 변수 형태를 double로하고 싶으면 sc.nextDouble();로 하면된다.
int N = sc.nextInt();
System.out.println(N);
}
}
bufferedreader
package org.example;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Bufferedereader1 {
// IOException을 던저야함
public static void main(String[] args) throws IOException {
// bufferedreader는 설명에서처럼 inputstreamreader에 buffer를 추가하는 것이기 때문에
// inputstreamreader를 받아와야한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// StringTokenizer에 토큰으로 문자열을 나눠 저장했으니 변수에 넣을떄는 형변환을 해줘야한다.
// buffereredreader는 무조건 우선 문자열로 저장하기 때문에 다른 형으로 저장하고 싶으면 형 변환을 해줘야한다.
int N = Integer.parseInt(st.nextToken());
// 문자열로 저장할거면 형변환 없이 그냥 저장하면 된다.
int N2 = Integer.parseInt(st.nextToken());
String S = st.nextToken();
System.out.println(N);
System.out.println(N2);
System.out.println(S);
}
}
bufferedreader는 엔터만 받기 때문에 문자열이 아닌 정수형이나 실수형에 저장할 때는 각자 라인마다 변수를 지정해주고 입력 받아야한다. 만약 한 줄에 정수 또는 실수 형 변수를 두개 받고 싶으면 꼭 stringtokenize를 사용해야 한다. 없이 그냥 공백 주고 입력하면 이렇게 컴파일 오류가 뜬다.
'알고리즘, 자료구조(코딩테스트)' 카테고리의 다른 글
알고리즘 선택의 기준이 되는 시간 복잡도 (0) | 2023.09.13 |
---|