자바 입출력 정리

트리에 관한 기본적인 알고리즘 문제를 풀려고 하니 대다수의 사람들이 tokenizer를 사용하더라. 입출력에 대해서 정리하고 넘어가고자 한다.

기본 입출력

기본입출력은 Scanner를 이용하는 걸 말한다.

주의해야할 점은 nextIntnextLine으로 연속으로 입력 받을 때, nextInt는 이후 따라오는 \n을 입력 받지 않는다. 따라서 두 메서드 중간에 nextLine이 없다면 정확한 입력을 받지 못한다.

Buffered Reader

사용법

String 타입에 대해 공부하다보면 String을 직접 더하는 것보다는 StringBuffer나 StringBuilder를 사용하라는 말이 있다.

String 두 개의 문자열을 생성하면, 클래스의 주소값이 다르다. 즉 String은 새로운 값을 할당할 때마다 새로 생성된다.

이와 달리 StringBuffer는 값을 memory에 append하는 방식으로 클래스를 직접 생성하지 않는다. 논리적으로 따져보면 클래스가 생성될 때 method들과 variable도 같이 생성되는데, StringBuffer는 이런 시간을 허용하지 않는다.

String Builder와 stringBuffer의 차이

StringBuilder는 변경가능한 문자열이지만 synchronization이 적용되지 않았다. 하지만 StringBuffer는 thread-safe라는 말에서처럼 변경 가능하지만 multiple thread환경에서 안전한 클래스라고 한다.

StringBuffer는 멀티 쓰레드 환경에서 다른 값을 변경하지 못하도록 하므로 web이나 소켓환경과 같이 비동기로 동작하는 경우가 많을 때는 StringBuffer를 사용하는 것이 안전하다.

StringTokensizer

자바에서는 String을 token 단위로 끊어주는 StringTokenizer 클래스를 제공한다.

생성자

StringTokenizer(String str) : 구획문자(delimiter)를 인자로 받지 않는 생성자.

StringTokenizer(String str, String delim) 
구획문자를 인자로 받는 생성자. delim에 구획 문자를 넣어준다.
구획문자는 2자리 이상도 설정할 수 있다.

StringTokenizer(STring str, String delim, boolean returnDelims) 
returnDelims가 true이면 구획문자도 토큰으로 간주한다.

주요 함수

  • countTokens() : 토큰의 갯수를 리턴한다.
  • nextToken() : 다음 토큰을 리턴한다. 이전 토큰은 제거한다.
  • nextToken(String delim) : 구획문자를 delim으로 바꾼 후 다음 토큰을 리턴한다.
  • hasMoreTokens() : 리턴할 다음 토큰이 있으면 true를 다음 토큰이 없으면 false를 리턴한다.
String str = "this is my string";
		
		StringTokenizer st = new StringTokenizer(str);
		
		System.out.println(st.countTokens());
		
		while(st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		System.out.println(st.countTokens());

출력값

4
this
is
my
string
0

정리

일반적으로 많이 사용하는 Scanner를 이용해서 받는것도 좋지만, 속도는 BufferedReader로 읽는 것이 빠르고, 문제에 따라 String을 다룰 때에는 StringTokenizer 혹은 StringBuilder를 사용하면 편리하다. 주의해야 할 점은 String을 다룰 때 잊지 말고 자료형을 적절하게 변환해 주어야 한다.


참고자료

BufferReader 사용법 https://coding-factory.tistory.com/251

자바 입출력 공부 https://kirade.github.io/algorithm/2017/12/19/java-%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9E%85%EC%B6%9C%EB%A0%A5/

String tokenizer https://arer.tistory.com/48

자바 String StringBuilder, StringBuffer 차이

https://novemberde.github.io/2017/04/15/String_0.html

0%