[Java] 코테 입출력

하비·2024년 8월 4일
1

Java

목록 보기
3/13

Java로 코딩테스트를 볼 때에는 무엇보다 시간을 줄이는 것이 중요하다. 그 중에서 입출력에 대해 이야기해보고자 한다.

Scanner-입/출력

  • 파일, 입력 스트림과 같은 다양한 입력 소스에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 변환하여 값을 리턴해주는 역할의 클래스다.
  • 입력 스트림을 다루는 방법을 몰라도 손쉽게 입력처리가 가능하며, 데이터 형변환을 알아서 해줘 편리하다.

입출력 예시

public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		System.out.println(t);
		sc.close();
	}

하지만, 데이터가 들어올 때마다 일일이 받아서 형변환을 해주기 때문에 대량의 데이터 처리 시에는 비효율적이다.

BufferedReader/BufferedWriter-입/출력

그래서 BufferedReader/BufferedWriter를 많이 쓴다.

  • BufferedReader/Writer는 데이터를 buffer 크기만큼 모아두었다가 전송하기 때문에 scanner보다 빠르다. 약 30% 정도 줄일 수 있다고 한다.
  • 대신, 필요한 경우에 직접 형변환을 해서 사용해야 한다.
  • BufferedReader와 함께 StringTokenizer를 사용해서 구분자에 맞게 구분 후 형변환을 해주면 된다.
  • I/O와 관련한 IOException 예외 사용이 필수다.

입출력 예시

public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st=new StringTokenizer(br.readLine(), " ");
		int sum=0;
		while(st.hasMoreElements()) {
			sum+=Integer.parseInt(st.nextToken());
		}
		bw.write(String.valueOf(sum));
		bw.flush();
		bw.close();
	}

StringBuilder-출력

  • 자바에서는 문자열을 상수 취급하기 때문에, 문자열을 조작할 때마다 새로 문자열이 만들어진다.
  • 이런 불필요한 문자열이 만들어지지 않도록 개선하기 위해 StringBuilder가 만들어졌다.
  • 이와 비슷한 걸로 StringBuffer가 있는데, 이것은 멀티스레드 환경에서 thread safe(동기화) 처리가 되어 있다.
  • but, 코테 환경에서는 single thread 환경이기 때문에, StringBuilder를 쓰는 것이 좋다.

출력 예시

public static void main(String[] args) throws IOException{
		StringBuilder sb=new StringBuilder();
		sb.append("Hello ");
		sb.append("왕왕").append("멍멍");
		System.out.println(sb.toString());
	}

그러면...

어떤 입출력을 사용할지 총 정리를 해보자면,

  • 입력 최적화
    • bufferedReader로 직접 line 단위 읽기를 한다.
    • 만약에, 데이터가 적은 경우라면 입력의 편의를 위해 scanner를 사용하는 것도 추천
  • 출력 최적화
    1. bufferedWriter로 buffer만큼 모아두고 출력
    2. StringBuilder로 모두 모아두고 한번만 출력(bufferedWirter의 경우, buffer size보다 출력 크기가 크면, 여러번 출력이 일어날 수 있기 때문에 StringBuilder보다 더 시간이 늘어날 수 있다.)
profile
멋진 개발자가 될테야

0개의 댓글