[JAVA] 문자열에서 한 글자씩 읽기

C++에서는 cin>>char; 하면 되는게 자바에는 없어서 찾아봤다.

오늘 공부할 내용은, BufferedReader, BufferedWriter 이다.

모든 자료 및 내용은 [이 블로그]가 출처임을 미리 밝힙니다.

















너무 깔끔하게 정리 해두셔서 보기 좋았다.

BufferedReader
  •  input stream으로 부터 문자를 읽어 들임


BufferedWrite

  •  output stream으로 문자를 내보냄


이 때, 버퍼링을 함으로써 문자, 문자 배열, 문자열 라인 등을 효율적으로 처리할 수 있다.

여기서 문득, 버퍼링의 정확한 의미가 궁금했다.

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
버퍼(Buffer)란?
버퍼링을 논하기 전에, 버퍼가 뭔지 알아야지!
  • 버퍼는 데이터를 A에서 B로 전송하는 동안, 일시적으로 그 데이터를 보관하는 메모리 영역을 의미한다.
  • Process간의 데이터 전송시 사용된다.
  • 보통 데이터키보드와 같은 '입력 장치'로 부터 받거나 or 프린터와 같은 '출력 장치'내보낼 때 버퍼 안에 저장된다.
  • 속도가 계속 변경될 수 있으므로, 데이터 수신 및 처리 속도에 차이가 있다.
  • FIFO(First In First Out) 방식에서 보통 사용된다.


그렇다면, 버퍼링이란?
  • Buffer를 활용하는 방식 또는 Buffer를 채우는 동작을 의미한다. 
  • 다른 말로, Queue라고 한다.
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

이 정도면 버퍼에 대해서 어느정도 알게된 것 같다.

추가로, InputStreamReader / OutputStreamWriter를 사용하는 경우 한 문자씩 읽지만 버퍼링을 하게 되면 입출력 스트림으로 부터 미리 버퍼에 데이터를 갖다 놓기 때문효율적이다.

BufferedInputStream / BufferedOutputStream = Byte 단위 처리

BufferedReader / BufferedWriter = char 단위 처리

보통 알고리즘 문제 풀 때, 모든 input이 숫자로만 들어올 때에는, Scanner를 사용하면 적절하게 풀이가 가능하지만, 문자와 숫자가 섞여서 나오는 경우에는 반드시 이 방법을 사용하자.

일단 백문이 불여일견이니까 코드를 한 번 볼건데, 보기전에 핵심사항 정리하고 끝마치도록 한다


〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
여기서 내가 얻은점

1. replaceAll(arg1, arg2)의 쓰임은 readLine으로 읽어들인 문자열에서, arg1은 모두 arg2로 대체한다는 의미.

2. toCharArray()는, data 배열이 char 배열이기 때문에 replaceAll로 띄어쓰기 제거한 뒤, 문자 하나 하나를 char형으로 집어넣는 과정을 처리해준다.

3. Scanner로 받아서 쓸 수 있는건 문자열이 다닥다닥 붙어있을때 얘기고, 띄어쓰기 들어간 경우에는 반드시 위의 방법을 써야된다. charAt도 안먹힌다.

4. Integer.parseInt는 String을 모두 int형으로 바꿔주는 역할을 한다.

5. 숫자가 하나 들어왔을 때는 위에처럼 할 수 있지만, 두 개 이상 띄어쓰기로 들어오면 난감하겠지?

6. 그래서 이 때는 밑에서 했던 것처럼 replaceAll로 띄어쓰기 없애고, int형 배열 만들어서 형변환을 적용해야한다.
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

[Code]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
    private static int N;
    public static void main(String args[]) throws Exception {
        BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(BR.readLine());
        for (int i = 0; i < N; i++) {
            char data[];
            data = BR.readLine().replaceAll(" """).toCharArray();
            System.out.println(data.length);
            for (int j = 0; j < data.length; j++)
                System.out.printf("%c ", data[j]);
            System.out.println();
        }
    }
}
cs

댓글