20/10/15

아라·2020년 10월 15일
0

국비교육

목록 보기
4/30

read()

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

BufferedReader는 엄밀히 말하면 클래스. ButteredReader 안에는 입력에 필요한 코드들이 모여 있다.

read()

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)으로 끝난다.

readline()

문자열 입력(1개의 라인)이 가능해지고 입력을 int가 아니라 string으로 받는다.

readline()에서의 자료형 변환

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);

오류(에러)

컴파일오류

  • 컴파일러가 번역을 할 때 문법이 올바른지 확인하는 과정에서 발견하는 오류.
  • 가장 간단한 오류.

런타임오류

  • 컴파일 작업 때는 발견되지 않았는데 실행 중에 발견되는 오류.
  • 주로 예외라고 함.
  • 발견 난이도 중급. 복불복으로 발견.

논리 오류

  • 문법도 틀린 곳이 없고, 실행도 잘되는데 결과가 이상함.
  • 발견 난이도 고급. 수정 난이도 높음.

Casting 형변환

암시적 형변환(자동 타입 변환)

  • 크기가 작은 자료형을 더 큰 자료형으로 변환할 때는 100% 안전

명시적 형변환(강제 타입 변환)

  • 크기가 큰 형에서 더 작은 형으로 변환할 때는 가능한 경우도 있고, 손실이 발생하는 경우도 있다.
byte b2; // 원본
short s2; // 복사본
		
s2=550;
b2=(byte)s2; // 큰 자료형을 작은 자료형으로 변환
		
System.out.println(b2); // 출력결과는 550이 아닌 38
  • 위의 경우에서 550을 넣었음에도 38이 되는 이유는 byte형의 메모리크기에 550을 넣으면 손실이 발생하기 때문.
  • 그렇기 때문에 명시적인 형변환이 발생할만한 복사에서는 원본의 값이 복사본의 자료형의 범위를 벗어나는지를 확인해야 한다.

정수형, 실수형 다 합쳤을 때의 자료형의 크기 비교

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 -> 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를 사용해야 한다.

연산자

  • 모든 산술 연산의 결과 자료형은 두 피연산자의 자료형 중 더 큰 자료형으로 반환된다.
  • 연산자로 연산한 결과가 자료형의 수용 가능한 범위를 벗어나 오류가 나는 경우가 있으니 조심해야한다.

0개의 댓글