[Java] 콘솔 입력 값을 받는 방법 (System.in)


Development note/Java  2019. 6. 5. 22:48

안녕하세요. 명월입니다.


이 글은 자바 환경에서 콘솔 입력 값을 받는 방법에 대한 글입니다.

우리가 자바 프로그램을 작성하면서 「System.out.println」 함수를 참 많이 사용합니다. 이 함수는 결과를 콘솔에 표시하는 함수입니다.

이클립스에서는 「sysout」이라고만 써도 자동으로 위 함수로 바뀝니다.


그럼 반대로 System.in을 통해서 콘솔로 부터 데이터를 입력 받을 수 있을까 하는 궁금증이 생깁니다. 결론은 System.in 함수만으로도 받을 수 있습니다.

public class Example {
  public static void main(String[] args) {
    try {
      byte[] data = new byte[4096];
      // 입력받는 System.in.read 함수
      System.in.read(data, 0, 4096);

      // 버퍼로 String으로 변환
      String buffer = new String(data);
      // 쓰레기 \0을 trim해버린다.
      buffer = buffer.trim();
      
      // 결과 출력
      System.out.println("Result : " + buffer);

    } catch (Throwable e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

위처럼 사용해도 아무런 문제 없습니다. 그러나 Java에서는 Scanner 클래스가 있는데 이게 좀 더 심플하게 코드 작성이 됩니다.

import java.util.Scanner;

public class Example {
  public static void main(String[] args) {
    // scanner클래스를 사용하면 IOException을 선언하지 않아도 된다.
    // 그러나 open - close 타입이라 사용 후에는 close로 리소스 반환을 해야 leak이 발생하지 않는다.
    try(Scanner scanner = new Scanner(System.in)){
      // 언테를 기준으로 String으로 받는다.
      String buffer = scanner.nextLine();
      // 결과 출력
      System.out.println("Result : " + buffer);
    }
  }
}

결과는 같습니다만, 소스를 보면 byte[]가 없어져서 무언가 더 심플해 보입니다. 그리고 IOException도 없어집니다.

그러나 Scanner는 open - close 타입이기 때문에 close를 통해 사용 후에는 리소스를 반환해야 합니다. 그래야 leak이 발생하지 않습니다.


여기까지 자바 환경에서 콘솔 입력 값을 받는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.