💡Input
자바 콘솔 입력 방법에는 대표적으로 read 메소드, BufferedReader 클래스, Scanner 클래스가 있다.
read 메소드
int num = System.in.read(); // 10 입력
System.out.println("출력: " + num); // 출력: 49
System.out.printf("출력: %c\n", num); // 출력: 1
문자 입력:
10
출력: 49
출력: 1
콘솔에 숫자 10을 입력해보자. 그러면 1의 아스키코드인 49가 출력될 것이다.
10을 입력했음에도 1이 출력되는 이유는 read라는 메소드가 한 번에 1byte씩 읽기 때문이다. 또한, 한글을 입력할 때 오류가 생기므로 read()는 잘 사용하지 않는다.
Enter (\r\n) 입력
int code = System.in.read(); // 1 입력
System.out.println("출력: " + code);
System.out.printf("출력: %c\n", code); // 출력: 49 (1)
code = System.in.read(); // 문자 코드
System.out.println("출력: " + code);
System.out.printf("출력: %c\n", code); // 출력: 13 (\r)
code = System.in.read(); // 문자 코드
System.out.println("출력: " + code);
System.out.printf("출력: %c\n", code); // 출력: 10 (\n)
문자 입력:
1
출력: 49
출력: 1
출력: 13
출력:
출력: 10
출력:
더불어 1을 입력하면 한 글자만 입력했음에도 13과 10이 출력이 되는데, 이것은 Enter가 Windows OS에서 \r과 \n으로 이루어져 있기 때문이다.
그래서 '1'이 아니라 '1 \r \n' 총 3글자를 입력한 것으로 인식되기 때문에 위의 결과가 발생하는 것이다.
BufferedReader 클래스
import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader 클래스를 사용하기 위해서는 클래스가 어떤 패키지에 들어 있는지를 함께 작성해야 한다. 보통 document를 보면 어떤 패키지에 들어 있는지 알 수 있으며, 마우스를 올렸을 때, import가 가능하다.
가장 좋은 방법은 Ctrl + Shift + O 단축키를 실행하는 것이다. 해당 단축키를 실행하면 소스코드 상단에 자동으로 import가 된다.
readLine() 메소드
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("문자 입력: ");
try {
String line = reader.readLine();
System.out.println(line);
} catch(Exception ex)
{
}
문자 입력:
내 이름은 Isaac입니다.
내 이름은 Isaac입니다.
BufferedReader 클래스는 한글 입력과 문장 단위 입력이 가능하다.
readLine()는 입력 버퍼에서 입력한 시점부터 엔터(\r\n)를 만나기 전까지 모두 읽어오는 메소드로, read 메소드와 달리 enter 입력이 사용자가 원해서 넣은 게 아니라는 것을 알고 있다.
Scanner 클래스
import java.util.Scanner;
try {
Scanner scan = new Scanner(System.in); // Wrapper Class
System.out.println("문자열: ");
String line = scan.nextLine();
System.out.println(line);
System.out.println("숫자: ");
int num = scan.nextInt();
System.out.println(num);
} catch(Exception ex)
{
}
Scanner 클래스의 기능은 모두 next로 시작한다.
scan.nextLine()으로 문자열을 입력받을 수 있으며, scan.nextInt()로 정수로 입력받을 수 있다.
scan.nextLine()은 reader.readLine()과 동일하며, 변환 기능이 포함되어 있어 Integer.parseInt("100")을 하지 않아도 된다는 점에서 편리하다.
Unhandled exception type IOException 오류 해결
try {
// 소스코드
} catch(Exception ex)
{
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type IOException
이러한 에러가 발생하는 이유는 try, catch 구문을 사용하지 않아서 발생하는 것이다.
예외처리가 가능하도록 소스코드를 try 내부에 작성해주면 에러는 사라진다.
💡Output
CLI / GUI
Command Line Interface은 텍스트 기반 명령 입출력 환경을 의미하며, Graphic User Interface은 화면 기반 입출력 환경을 의미한다.
출력 메소드 3가지
자바 콘솔 출력 방법에는 대표적으로 println 메소드 (print line), print 메소드, printf 메소드 (print format) 3가지가 있다.
String name = "Isaac";
System.out.println("안녕하세요. " + name + "님");
System.out.printf("안녕하세요. %s님", name); // $s: 형식 문자
println와 달리, printf는 형식 문자를 제공하여 출력되는 결과를 한 번에 미리 볼 수 있다는 장점이 있다.
printf를 사용하여 편리하고 가독성 좋은 코딩을 할 수 있다.
형식 문자
1. %s: String
2. %d: Decimal (모든 정수 byte, short, int, long)
3. %f: Float (모든 실수 float, double)
4. %c: Char
5. %b: Boolean
형식 문자의 확장 기능
%숫자s, %숫자d, %숫자f, %숫자c, %숫자b
위와 같은 방식으로 사용할 수 있으며, 출력할 너비를 지정하여 탭 문자와 유사한 역할을 한다.
int num = 123;
System.out.printf("[%d]\n", num); // [123]
System.out.printf("[%5d]\n", num); // [ 123]
System.out.printf("[%-5d]\n", num); // [123 ]
System.out.printf("[%3d]\n", num); // [123]
%.숫자f
위와 같은 방법으로 사용할 경우, 소수점 이하 자릿수를 지정할 수 있다.
%f 를 그대로 쓰면 소수 이하 6자리를 출력하므로, 필요한 만큼 조절하는 것이 좋다.
double num2 = 3.14;
System.out.printf("%f\n", num2); // 3.140000
System.out.printf("%.2f\n", num2); // 3.14
System.out.printf("%.1f\n", num2); // 3.1
System.out.printf("%.0f\n", num2); // 3
%,d
위와 같은 방법으로 사용하면 3자리 마다 자릿수 표기를 할 수 있다.
int price = 10000000;
System.out.printf("금액: %d원\n", price); // 금액: 1000000원
System.out.printf("금액: %,d원\n", price); // 금액: 1,000,000원