Buffered / String 관련 정리

여상우·2022년 8월 1일
0

Java

목록 보기
2/4

역시나 내가 공부하다 어려운 게 생기면 정리하려 velog에 들어온다😂
오늘은 자주 사용하는 Buffered 시리즈와 String 시리즈에 대한 정리


1. BufferedReader

보통 자바 처음 배우면 Scanner(System.in)와 nextInt(), nextLine()과 같은 친구들과 친할 것이다.
하지만 BufferedReader를 사용하면 좀 더 빠르고 효율적으로 문자를 입력받을 수 있다.
그 전에, Buffer란 무엇인가?

  • Buffer
    데이터를 전송하는 과정에서 일시적으로 데이터를 저장하는 임시 메모리 공간

따라서 BufferedReader는 입력받은 데이터들을 그때그때 전송해주는 것이 아니라 Buffer에 저장했다가 한 번에 전송해준다. 따라서 Scanner에 비해 좀 더 빠르다!
여기서 중요한 점은 BufferedReader는 형식이 String으로 고정 된다는 점!
그리고 예외처리를 해 주어야 한다는 점 이다(try catch 혹은 throw IOException으로)

Scanner(System.in)InputStream, InputStreamReader에 대해 조사해보고 가자 (왜나면 내가 잘 모르니까)
자세한 내용은 블로그 https://st-lab.tistory.com/41 에 자세히 설명이 되어있다(내 블로그 아님!! 정리 잘 해주셔서 감사합니다 🙏)

간단히 설명하고 넘어가자. 우리가 데이터를 전송하고 전송받는 과정에서의 통로, 혹은 데이터 전달과정은 Stream이라고 부른다. Stream은 단방향이므로 입력 Stream, 출력 Stream 이렇게 한 방향으로만 Stream이 진행된다.
그리고 Java에서 기본적인 입력 Stream은 InputStream이고 출력 Stream은 OutputStream이다.

우리가 자주 사용하는 Scanner 클래스는 데이터를 입력받기 위해서 InputStream을 사용하려고 Scanner(System.in)이라고 적어주는 것이다. 즉 in 부분은 InputStream이라는 것!
(사실 여기서도 정확히 하자면 InputStream은 문자를 입력받는 부분에서 제대로 입력받지 못하는 경우가 왕왕 생기기 때문에 ByteStream인 InputStream 대신, '문자'단위로 처리할 수 있도록 InputStreamReader를 사용한다)
BufferedReader도 이러한 InputStreamReader를 사용하여 다음과 같이 작성한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = br.readLine();

BufferedReader를 이용한 readLine()은 기본적으로 텍스트를 한 줄만 읽어오기 때문에 여러 줄을 읽기 위해서는 일반적으로 while문과 함께 사용하여

while(String str = br.readLine() != null) {
	 // 내부에 읽어올 부분
}

과 같이 사용한다. 이것은 readLine() 메소드가 stream의 끝에 다다랐을 경우에 기본적으로 null값을 반환하기 때문!


2. StringTokenizer

StringTokenizer는 기본적으로 이런 방식으로 생성이 된다!

  • StringTokenizer stringToken = new StringTokenizer(문자열);
    -> 이 경우는 기본적으로 띄어쓰기나 탭, 줄바꿈 기준으로 문자열을 분리한다.
  • StringTokenizer stringToken = new StringTokenizer(문자열, 구분자);
    -> 이 경우는 구분자를 기준으로 문자열을 분리한다.
  • StringTokenizer stringToken = new StringTokenizer(문자열, 구분자, true/false);
    -> 이 경우는 구분자를 기준으로 문자열을 분리하는데 구분자도 토큰에 포함시킬 지(true), 아닐지(false, 기본)를 결정

즉 배열 할 때 자주 사용했던 .split() 메소드와 매우 유사하게 기능이 사용이 됨!
그리고 StringTokenizer 메소드 중에는 3가지정도 자주 사용하는 메소드가 있다.

  1. stringToken.hasMoreTokens()

결과를 boolean으로 리턴하며, 계속해서 토큰이 있으면 true, 남아있는 토큰이 없으면 false를 리턴

  1. stringToken.nextToken()

해당 객체에서 다음 토큰을 반환(약간 .get() 같은 느낌?)

  1. stringToken.countTokens()

객체에서 총 토큰의 개수를 리턴(그래야 토큰의 남은 개수를 알 수 있으니까!)


3. BufferedReader와 StringTokenizer를 같이 쓴다면?

BufferedReader와 StringTokenizer를 같이 쓰면, 우리가 기존에 Scanner를 사용하는 것 처럼 쓸 수 있다.
따라서

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

이렇게 사용하면 StringTokenizer st = new StringTokenizer(br.readLine()); 이 부분에서 이미 Scanner처럼 한 줄을 읽도록 해준다. 그리고 token화가 되었기 때문에

st.nextToken();을 해 주면 처음 토큰이 바로 튀어나온다!


4. 그 외...

BufferedReader가 Scanner처럼 input을 대체하여 사용할 수 있다면, BufferedWriter는 System.out.println을 대체해서 사용할 수 있다. 다른점은 버퍼를 사용하여 출력한다는 점..?
하지만 BufferedWriter는 사용한 후 .flush()와 .close()를 통해 내부에 있는 버퍼를 모두 출력해주고, 또 더이상의 입력을 받지 않도록 닫아주어야 하기때문에 그냥 sysout을 쓰기로 했다!

profile
Keep forwarding person.

0개의 댓글