[JAVA] 데이터 타입 및 형변환
자바는 기본 데이터 타입과 레퍼런스 타입으로 나뉜다.
기본 데이터 타입에는
byte, short, int, float, double, char, boolean
나머지는 레퍼런스 데이터 타입 → 주로 class, interface, 배열 등
boolean
논리형. true / false
-
int형 → boolean형으로 형변환 안됨
예를 들어 0을 false, 1을 true로 쓰던 것 불가!
컴파일 에러 발생!
char
문자형. 16비트 유니코드
수치로는 0 ~ 65535 띠옴표로 사용하며, 문자 하나만.
큰따옴표는 String 타입으로 인식한다.
char c= '한'
char c= 'a'
char c= "a" // Error
char c= '\\ucafe' //유니코드
byte
정수형. 8비트
-128 ~ 127 범위안에 해당이 된다면 묵시적 형변환으로 대입이 가능하다.
byte b1 = -129; //error
byte b2 = -128;
byte b3 = -1;
byte b4 = 0;
byte b5 = 1;
byte b6 = 127;
byte b7 = 128; // error
short
정수형. 16비트
-32,768 ~ 32,767
int
정수형. 32비트
-2,147,483,648 ~ 2,147,483,647
-
int형 범위 에러
int i = 12345678901;
The literal 12345678901 of type int is out of range
long
정수형. 64비트
-
L을 끝에 붙이면 long으로 형변환
소문자, 대문자 상관없음
long l = 12345678901L;
안붙이면 int형으로 범위 초과 에러 발생!
float
실수형. 32비트
-
F을 끝에 붙이면 float로 형변환
실수형의 default는 64비트 double형
float = 3.14 //error float = 3.14F
double
실수형. 64비트
실수형의 default
-
자주하는 실수
float = 3.14 //error float = 3.14F
묵시적 형변환 (Implicit Type Casting)
작은 크기의 타입은 큰 크기의 타입으로 자동 형 변환된다. 정수형은 실수형으로 자동 형 변환이 된다.
byte → short → int → long → float → double
char →
char형과 short와 byte는 형변환이 불가능하다. 에러 발생!
→ char는 unsigned, short와 byte는 signed 타입이기 때문!
f = 123L ?
-
묵시적 형변환
64비트, 32비트와 같은 크기로 형변환을 결정하는 것이 아니고, 데이터 타입이 표현할 수 있는 범위를 가지고 형변환을 결정한다.
실수에 정수가 포함되어 형변환이 가능하다고 보고 묵시적 형변환이 일어나는 것.
long lvar = 100; float fvar = lvar; int ivar = 'a';
명시적 형변환 (Explicit Type Casting)
큰 크기의 타입이 작은 크기의 타입으로 변형할 경우
실수형이 정수형으로 타입을 변경할 경우
int pi = (int) 3.14F ?
-
명시적 형변환
실수형을 강제로 형변환을 시켜줄 수 있도록 명시적 형변환
실수형에서 정수형으로 명시적 형변환이 일어날 경우, 소수점 아래를 버린다.
따라서 pi에는 3이 저장됨.
float fvar = 100; //묵시적 형변환 long lvar = (long)fvar;
byte, short, char은 연산이 이루어지면 int형이 된다.
-
코드 예시
byte by1 = 1; byte by2 = 2; byte by3 = by1+by2; //error 컴파일 에러 byte by4 = (int)by1+by2; //error byte by5 = by1+(int)by2; //error byte by6 = (byte)(by1+by2); int in = by1+by2;
연산 결과를 명시적 형변환을 시켜주거나, int에 저장해야한다.
연산을 할 때에는 기본적으로 큰 타입으로 연산이 된다.
1-0.9 = 0.09999999998 ?
-
floating point
floating point는 2진 소수로 표현되는데, 대부분 십진수은 반올림해서 표현한다.
이진법에서 1/10은 무한히 반복되는 소수다. 따라서, floating point로 0.1를 정확히 표현할 수 없기 때문에 발생하는 오류이다.
자바에서는 이런걸 해결하기 위해 BigInteger/BigDecimal을 사용한다.
댓글남기기