[Java] 형변환
형 변환 (캐스팅, Casting) 이란?
변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형 변환이라고 한다.
형 변환 방법
double d = 85.4;
int score = (int) d;
위와 같이 형 변환 연산자 '()'를 이용하여 변환한다.
변환 과정
double d = 85.4;
int score = (int) d;
int score = (int) 85.4;
int score = 85;
기본형의 형 변환
char c = (char) 65; // int -> char
int i = (int) 'A'; // char -> int
int i = (int) 1.6f; // float -> int
float f = (float) 10; // int -> float
boolean타입은 다른 타입과 형 변환이 안된다.
정수형 간의 형 변환
// 큰 타입 -> 작은 타입
byte b = (byte) 10; // 1010(10) -> 1010(10)
byte b = (byte) 300; // 100101100(300) -> 00101100(44)
// 작은 타입 -> 큰 타입
int i = (int) 10; // 1010(10) -> 1010(10)
int i = (int) -2; // 11111110(-2) -> 111111100(-2)
- 작은 타입으로 변환할 경우 값의 손실이 발생할 수 있다.
- 큰 타입으로 변환할 경우 값의 손실이 없다.
- 변환하고자 하는 값이 양수면 0, 음수면 1을 빈칸에 채워 넣는다.
실수형 간의 형 변환
작은 타입 -> 큰 타입 (float -> double)
- float의 기저인 127을 빼고 double의 기저인 1023을 더한다.
- float의 가수 23자리를 채우고 빈칸에 0을 채운다.
큰 타입 -> 자은 타입 (double -> float)
- double의 기저인 1023을 빼고 float의 기저인 127을 더한다.
- double의 가수 52자리 중 23자리만 저장하고 나머지는 버린다.
주의점)
- 24번째 자리가 1일 경우 반올림이 발생한다.
- float 타입의 값을 넘는 경우 ±무한대(큰 경우), ±0(작은 경우)의 결과를 얻는다.
정수형과 실수형 간의 형 변환
저장 방식
정수형 -> 실수형 변환
10진수 7 (0 | 000...00111) 111 -> 1.11 * 2^2+127 (정규화) (0 | 10000001 | 11000...000)
주의점)
int의 최대 값인 약 20억을 변환할 경우 최대 10자리의 정밀도가 필요하다. 큰 값을 변환할 경우 deouble형으로 변환해야 오차가 발생하지 않는다.
EX)
int -> float -> int : 9123456 -> 91234568.0 -> 91234568
int -> double -> int : 9123456 -> 91234567.0 -> 91234567
실수형 -> 정수형 변환
정수형은 소수점 이하를 표현할 수 없기 때문에 소수점 이하의 값은 버려진다.
EX)
9.1234567f -> 9
float (0 | 10000010 | 001000111111001101011101) -> 1001.001000111111001101011101
int (0 | 0000000....00001001)
위의 예시처럼 소수점은 모두 버려진다.
만약 정수로 변환 시 정수의 범위를 넘는다면 오버플로우가 발생한다.
자동 형 변환
- 편의상의 이유로 형 변환을 생략할수 있다.
- 형변환을 명시 해주면 의도적인 형 변환으로 간주하여 에러가 발생하지 않는다.
- 서로 다른 타입의 덧셈의 경우 더 큰 범위를 가진 타입으로 자동 형 변환이 이루어져 계산되어 값 손실을 줄이고 올바른 값을 얻는다.
연산자의 범위보다 큰 값을 저장하는 경우 에러가 발생한다. EX) incompatible types: possible lossy conversion from int to byte
아래의 예시는 위의 3가지 특징을 보여주는 예시이다.
1. float f = 1234;
2. char c = (char) 100;
3. int i = 3;
double d = 1.0 + i;
// double d = 1.0 + (double) i;
자동으로 형 변환하는 것을 산술 변환이라고 한다.
자동 형 변환의 규칙
- 기존의 값을 최대한 보존할 수 있는 타입으로 자동 변환
- 표현 범위가 넓은 쪽으로 변환하여 값 손실을 줄인다.
- char와 short는 같은 2byte지만 값의 범위가 달라 자동 형 변환이 될 수 없다.
자동 형 변환의 타입 나열
// 1byte => 2byte => 4byte => 8byte => 4byte => 8byte
byte => short => int => long => float => double
char =>
위의 순서대로 변환 시 자동 변환이 된다.
반대 방향으로 변환시 캐스팅 연산자를 써줘야 한다.
형 변환의 정리
- boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능하다.
- 기본형과 참조형은 서로 형 변환할 수 없다.
- 서로 다른 타입 간의 연산은 형 변환하는 것이 원칙이나 작은 범위에서 큰 범위로 변환 시 캐스팅 연산자 생략 가능하다.