int var1=System.in.read();
System.out.printf("사용자가 입력한 문자는 %c입니다.\n", var1);
위와 같이 실행할 경우, 원래 입력한 문자가 나온다. read()는 입력받은 문자를 문자코드값으로 돌려주기 때문에 int형으로 받고, 그렇기 때문에 %d를 이용하여 출력하면 문자코드의 숫자로 출력이 된다.
int data=System.in.read();
System.out.println(data);
data=System.in.read();
System.out.println(data);
data=System.in.read();
System.out.println(data);
위 경우 실행하여 A를 입력하게 되면 출력값은 아래와 같다.
65
10
이 때
키보드에 입력하면 메모리공간에 쌓이고, 이것을 읽어오는 것이 자바프로그램의 read()이다. A를 입력하면 'A\n'이 메모리에 저장되고(입력이 끝나면 엔터를 치므로) A의 값 65, 개행(=엔터, =\n)의 값 10이 출력된다. 참고로 미처 쓰지 못한 데이터가 남아있더라도 출력이 끝나면 메모리는 초기화된다. 이 공간을 버퍼(입력버퍼)라고 한다.
BufferedReader는 엄밀히 말하면 클래스. ButteredReader 안에는 입력에 필요한 코드들이 모여 있다.
package com.test.java;
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 이밖에도 필요한 전체 패키지(클래스)를 import하는 단축키는
// Ctrl+Shift+O이다.(Windows기준)
import java.io.*;
// 이렇게 쓰는 것이 보기에는 좋지만 io에 있는 전체 도구를 불러오게 되므로 방해가 될 수도 있다. 그래서 와일드카드를 사용하는 방법보다 위처럼 각 패키지(클래스)를 나열해주는 방법을 주로 사용한다.
public class Ex12_BufferedReader {
public static void main(String[] args) {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
}
}
read()보다 복잡하지만 사용하는 이유는 한글입력이 가능하다. '가'를 입력했을 때, 가의 문자코드 값인 44032가 출력된다. 한글은 가(44032)에서 시작해서 힣(55203)으로 끝난다.
문자열 입력(1개의 라인)이 가능해지고 입력을 int가 아니라 string으로 받는다.
readline()으로 받으면 string으로 받으므로 int를 받아야 할 경우 아래와 같이 코드를 쓰면 된다.
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
String year=reader.readLine(); // 여기서 문자열을 받고
int newyear=Integer.parseInt(year); // 여기서 문자열을 int로 바꿔준다. 이때, 받은 문자열에 숫자가 아닌 문자가 존재하면 에러가 난다.
readline()은 모든 입력 데이터가 문자열로 입력되는 게 단점이다. 그래서 아래와 같이 readline()으로 받은 변수를 바꿔준다.
byte : Byte.parseByte(변수);
short : Short.parseShort(변수);
int : Integer.parseInt(변수);
long : Long.parseLong(변수);
float : Float.parseFloat(변수);
double : Double.parseDouble(변수);
boolean : Boolean.parseBoolean(변수);
char자료형으로 바꿀 경우는 아래와 같다.
String c2="A";
char c1=c2.charAt(0);
System.out.println(c1);
아래는 readline()으로 두 수를 입력받아 연산하고, 두 수와 연산결과를 출력하는 코드이다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("첫번째 숫자를 입력해주세요. : ");
String a=reader.readLine();
System.out.print("두번째 숫자를 입력해주세요. : ");
String b=reader.readLine();
int newA=Integer.parseInt(a);
int newB=Integer.parseInt(b);
int result=newA+newB;
System.out.printf("결과) %d + %d = %d\n", newA, newB, result);
byte b2; // 원본
short s2; // 복사본
s2=550;
b2=(byte)s2; // 큰 자료형을 작은 자료형으로 변환
System.out.println(b2); // 출력결과는 550이 아닌 38
byte(1)<short(2)<int(4)<long(8)<float(4)<double(8)
위의 경우를 참고하여 형변환을 하면 된다.
// long -> float
long l5=100;
float f5;
f5=l5; // long보다 float가 더 큰 자료형이므로 에러가 안 난다.
// float -> long
long l6;
float f6=3.14F;
l6=(long)f6; // float에서 더 작은 long으로의 변환이므로 캐스트연산자를 꼭 붙여야 한다.
// char -> int
char c9='A';
int n9;
n9=c9;
System.out.println(n9); // 출력 결과는 65
// int -> char
char c9;
int n9=65;
c9=(char)n9; // char형이 int보다 큰 자료형이므로 캐스트연산자를 붙여야 한다.
System.out.println(c9);
short의 범위는 너무 작으므로 char를 문자코드로 상호 변환할 때는 반드시 int를 사용해야 한다.