[Java 입출력] 고성능 입출력과 디버깅 테크닉

Scanner보다 빠른 입출력 방식과 효율적인 디버깅 방법을 설명합니다. - BufferedReader br = new BufferedReader(new InputStreamReader(System.in));



고성능 입출력 처리

INPUT

BufferedReader, StringTokenizer 사용

  • System.in 으로 입력을 InputStreamReader 로 받아서 BufferedReader 에 담는다.

  • br.readLine()" " 기준으로 잘라서 StringTokenizer 에 담는다. (split 처럼)

  • 만약 입력의 끝나는 부분을 알고싶다면???

    • br.readLine()==null 로 알 수 있으며, 테스트는 Ctrl+D 를 입력하면 된다.

    • 테스트케이스(입력)가 몇개인지 모를 때 예시 코드

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      //테케가 몇개인지 모를 때
      while(true) {
          String t = br.readLine();
          if ( t==null || t.length()==0 ) break;
          //풀이...
      }
      
  • 파입 입출력System.in 으로 사용 가능하게 설정도 가능!

    • System.setIn(new FileInputStream("input.txt"));
    • 이후 System.in 사용하면 됨.



OUTPUT

StringBuilder 사용

  • System.out.println 도 많이쓰지만, 많은 출력 땐 StringBuilder 를 권장
  • sb.setLength(0); -> 초기화 하기
  • sb.setLength(sb.length()-2); -> 끝에 2칸 지우기



예제코드

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int[][] arr = new int[301][301];

    public static void main(String[] args) throws IOException {
        // 1. 입력!!
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine()," ");
        int n = Integer.parseInt(stk.nextToken());
        int m = Integer.parseInt(stk.nextToken());
        // 그 다음 부터 n(행)번 입력 받기 (m은 열)
        for (int i = 0; i < n; i++) {
            stk = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < m; j++) {
                arr[i][j] = Integer.parseInt(stk.nextToken());
            }
        }

        // 2. 출력!!
        StringBuilder sb = new StringBuilder();
        sb.append("n : " + n + ", m : " + m).append('\n');

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                sb.append(arr[i][j]);
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }
}



디버깅 테크닉

💡 디버깅 팁(이클립스)

  • 단축키
    • F8: 브레이크포인트 이동
    • F6: 함수 단위 이동
    • F5: 한 줄씩 이동
  • if문 넣어서 원하는 곳으로 한번에 이동(브레이크 포인트 함께 사용)
  • 보고싶은 변수 드래그하면 한번에 볼 수 있음
    • Image



배열 출력

배열 출력 추천 메소드

// 1차원 배열
System.out.println(Arrays.toString(arr));

// 2차원 배열
for(int i = 0; i < n; i++) {
    System.out.println(Arrays.toString(arr[i]));
}

// 범위 지정 출력
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, 0, 5)));



객체 디버깅

toString 오버라이딩으로 객체 내용 보기 간편

class Node {
    int x, y;
    
    @Override
    public String toString() {
        return "Node[x=" + x + ", y=" + y + "]";
    }
}
//print로 객체 출력 시 자동으로 toString() 메서드 반환값이 출력 됨

효율적인 입출력 처리와 디버깅 기법을 활용하면 개발 생산성을 크게 향상시킬 수 있습니다.

댓글남기기