노트북이 고장 나 어제 도착한 태블릿으로 작성 중.. 당분간 태블릿으로 til을 쓸 것 같다. 오타랑 띄어쓰기가 아주 형편없을 것 같긴 한데 당분간은 어쩔 수 없다..
오늘 TIL은 자바에서 입력할 때 쓰는 객체에 대해 알아보려 한다.
입출력에 대한 정리는 추후에 해보겠다.
참고 사이트 : langoustine
입력받은 데이터를 다양한 타입으로 변환하여 반환하는 클래스
기본형과 String 타입을 정규표현식을 사용해 파싱할 수 있다.
java.util.Scanner
의 경로로 import한다.
버퍼의 크기가 1kb다.
thread unsafe라서 멀티쓰레드 환경에서 문제가 생길 수 있다.
원하는 타입으로 읽을 수 있다.
버퍼가 작아 데이터가 거의 즉시 사용자에게 전송되어 입력할 때 마다 많은 시간이 소요된다.
System.in을 통해 입력스트림을 받는다.
import java.util.Scanner;
...
Scanner sc = new Scanner(System.in);
String st = sc.nextLine();
데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스
버퍼(Buffer)
데이터가 한 곳에서 다른 곳으로 전송되는 동안 큐 형태로 잠시 보관하는 임시 메모리 영역
java.io.BufferedReader
의 경로로 import한다.
IOException을 예외처리 해줘야한다. try-catch나 throws를 사용한다.
Scanner와 달리 String 타입만 읽어서 가져온다.
버퍼의 크기가 8kb이다.
thread safe라서 멀티 쓰레드 환경에서도 안전하다.
버퍼가 가득 차거나 개행문자가 나타나면 한번에 프로세스로 전달하기 때문에 Scanner보다 빠르다.
new BufferedReader(new InputStreamReader(System.in)) 처럼 문자기반의 보조 스트림인 inputStreamReader를 new로 만들고 그 안에서 System.in을 받아야 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// import java.io.*; 로 한번에 임포트해도 된다.
...
public static void main(String[] args) throws IOException {
BufferReader br = new BufferedReader(new InputStreamReader(System.in));
String st = br.readLine();
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(st);
}
타입
S가 B에 비해 타입에 자유롭다. B는 String 타입만 읽고 저장할 수 있어 필요시 형변환을 거쳐야 하지만, S는 원하는 타입으로 읽고 파싱할 수 있다.
속도 및 효율성
B는 S에 비해 버퍼의 크기가 4배기 때문에 메모리는 조금 더 잡아먹어도 속도나 입력 효율이 좋다.
문자 입력 하나하나마다 cpu가 입력하는 것 보다 버퍼에 쌓아두고 한번에 하는 것이 더 효율적이기 때문이다.
특히 코딩테스트에서 속도 차이가 꽤 나기 때문에 B가 권장된다.
쓰레드 안정성
B는 thread safe, S는 thread unsafe이다.
많은 도움이 되었습니다, 감사합니다.