[Java] Scanner & BufferedReader

𝒄𝒉𝒂𝒏𝒎𝒊𝒏·2023년 10월 12일
0

Java

목록 보기
4/4
post-thumbnail

자바에서 입력 데이터를 받는 방법에는 Scanner 클래스와 BufferedReader 클래스가 있다.
입력 데이터가 간단한 경우 Scanner를 사용하여도 무관하다.
그러나 입력 데이터가 많은 경우 Scanner는 시간 초과가 발생할 수 있다.


✔️ Scanner 클래스

Scanner sc = new Scanner(System.in);

String str = sc.nextLine();
int i = sc.nextInt();
double d = sc.nextDouble();
  • next() : String을 읽는다. 공백문자를 기준으로 구분한다.
  • nextLine() : String을 읽는다. 띄어쓰기를 포함하여 한 줄을 읽으며, Enter를 기준으로 구분한다.
  • Scanner는 단순한 읽기 기능에 더해 parsing과 tokenizing을 할 수 있다.
  • nextInt(), nextBoolean(), nextByte(), nextShort(), nextLong(), nextFloat(), nextDouble()
    간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있다.
  • split 문자열 자르기
    String str = sc.nextLine(); //문자열 입력
    String[] result = str.split(" ");

📌 Scanner 클래스 사용 주의 사항

💬 Scanner 클래스는 "토큰 단위"로 읽는다.
토큰(Token) : 공백문자(Spacebar, Tab, Enter 등)로 구분되는 요소
어떤 값을 입력받을 때, 컴퓨터는 공백문자까지도 버퍼에 저장한다.
즉, 내가 입력한 Spacebar나 Enter, Tab도 입력값과 함께 버퍼에 저장이 되고,
해당 공백문자를 다른 곳에서 읽어들이기 전까지는 버퍼에 남아있는 것이다.

따라서 nextLine() 메소드를 사용할 때 이전에 공백문자가 버퍼에 남아있다면,
nextLine()을 한번 더 써주어서 공백문자를 없애주자.



✔️ BufferedReader 클래스

BuferedReader br = new BufferedReader(new InputStreamReader(System.in));

try {
		String str = br.readLine();
		int num = Integer.parseInt(str);
} catch (IOException e) {
		e.printStackTrace();
}
  • 데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다.
    즉 사용자가 입력한 문자 스트림을 읽는 것(read) 라고 한다.
    `버퍼(buffer)란? 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를 
     보관하는 임시 메모리 영역이다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다.`
  • 데이터를 파싱하지 않고 String으로만 읽고 가져온다.
  • Checked Exception으로 반드시 예외 처리를 명시해야한다.
    (I/O Exception을 throw하거나 try/catch)
  • Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다.
  • BufferedReader는 매개변수로 InputStreamReader를 사용하여 객체를 생성한다. InputStreamReader 란? 문자 기반의 보조 스트림으로써 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 주는 역할을 한다.
  • StringTokenizer
    split은 정규식을 기반으로 문자열을 자르는 로직으로 동작하기 때문에
    단순히 공백 자리를 당겨서 채우는 StringTokenizer가 더 빠르다.
    ```java
    BufferReader br = new BufferReader(new InputStream(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    // AB CD EFF GH 입력
    
    st.nextToken() // AB
    st.nextToken() // CD
    st.nextToken() // EFF
    st.nextToken() // GH
    ```
    
    특정 문자 Token 지정하기
    
    ```java
    String str = "this%is!my%string";
    StringTokenizer st = new StringTokenizer(str, "%!");
    
    st.nextToken() // this
    st.nextToken() // is
    st.nextToken() // my
    st.nextToken() // string
    ```

profile
𝑶𝒏𝒆 𝒅𝒂𝒚 𝒐𝒓 𝒅𝒂𝒚 𝒐𝒏𝒆.

0개의 댓글