형 변환
정수와 실수는 컴퓨터 내부에서 표현되는 방식이 전혀 다르다.
따라서 정수와 실수를 더한다고 할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로 통일한 후 연산을 해야한다.
이때 형 변환이 이루어진다.
즉 각 변수의 자료형이 다를 때 자료형을 같게 바꾸는 것을 말한다.
- 형 변환의 기본 원칙
1.바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어진다.
2.덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어진다.
- 형 변환의 종류
형 변환은 크게 묵시적 형 변환(자동 형 변환)과 명시적 형 변환(강제 형 변환) 두 가지로 구별할 수 있다.
- 위 두가지 원칙에 기반하여 묵시적 형 변환이 이루어지는 관계
정수 실수
byte -> short -> int -> long -> float -> double
1바이트 / 2바이트 / 4바이트 / 8바이트 / 4바이트 / 8바이트
char⨼
2바이트
위 표에서 화살표 방향과 반대로 형 변환을 하려면 강제로 변환해야 한다.
long형이 8바이트고 float이 4바이트인데 자동 형 변환이 되는 이유는 실수가 정수보다 표현 범위가 더 넓고 정밀하기 때문이다.
화살표 방향대로 형 변환이 이루어질 때는 자료 손실이 없지만, 그 반대인 경우에는 자료 손실이 발생할 수 있다.
묵시적 형 변환
- 바이트의 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우.
byte bNum = 10;
int iNum = bNum; //byte형 변수 bNum값을 int형 변수 iNum에 대입한다.
bNum의 크기는 1바이트이고 iNum의 크기는 4바이트이므로 자료 손실 없이 bNum에 들어 있는 값이 모두 iNum에 저장된다.
남은 3바이트에는 0으로 채워진다.
- 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
int iNum2 = 20;
float fNum = iNum2;
이 경우에는 두 변수의 크기가 같은 4바이트라도 float형인 fNum이 더 정밀하게 데이터를 표현할 수 있으므로 실수형인 float형으로 변환된다.
- 연산 중에 자동 변환되는 경우
int iNum = 20;
float fNum = iNum;
double dNum;
dNum = fNum + iNum;
fNum + iNum 연산에서 int형이 float으로 변환되고, 두 변수를 더한 결과 값이 dNum에 대입되면서 double 형으로 변환된다.
명시적 형 변환
- 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
int iNum = 10;
byte bNum = (byte)iNum;
byte형은 1바이트로 int형보다 크기가 작기 때문에 자료 손실이 발생할 수 있다.
따라서 프로그래머가 변환할 자료형을 명시적으로 써 주어야 하며 이를 강제 형 변환이라고 한다.
위 경우에는 대입된 값 10을 1바이트 안에 표현할 수 있으므로 자료 손실이 없다.
그러나 byte형이 표현할 수 있는 범위를 넘는 경우에는 자료 손실이 발생할 수 있다.
- 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
double dNum = 3.14;
int iNum2 = (int)dNum;
위 경우에는 실수의 소수점 이하 부분이 생략되고 정수 부분만 대입되어 3만 출력된다.
같은 연산이지만 결과가 다른 형변환 예제
public class ExplicitConversion {
public static void main(String[] args){
double dNum1 = 1.2;
float fNum2 = 0.9F;
int iNum3 = (int)dNum1 + (int)fNum2; //두 실수가 각각 형 변환이되어 더해짐
int iNum4 = (int)(dNum1 + fNum2); //두 실수의 합이 먼저 계산되고 형 변환됨
System.out.println(iNum3);
System.out.println(iNum4);
}
}

iNum3과 iNum4의 연산 결과가 다르다.
iNum3에서는 두 실수가 각각 명시적 형 변환이 일어나기 때문에 1 + 0으로 변환된 두 값을 합하여 1이 되기 때문이다.
iNum4에서는 dNum1 + fNum2의 합을 먼저 계산한다.
이 때 두 변수의 형이 다르므로 fNum2의 float형이 dNum1의 double형과 같은 형(double)으로 변환되는 묵시적 형 변환이 일어나면서 두 수가 더해져서 값이 2.1이 되고, 이후에 int형으로 명시적 형 변화가 되어 결과 값이 2가 된다.
같은 연산이더라도 형 변환이 언제 이루어졌는지에 따라 결과 값이 다르게 나타난다.
'JAVA' 카테고리의 다른 글
| 비트 연산자, 연산자 우선순위 (0) | 2024.12.09 |
|---|---|
| 연산자 (0) | 2024.12.06 |
| 상수와 리터럴 (0) | 2024.12.03 |
| 실수 자료형, 논리 자료형 (0) | 2024.12.02 |
| 문자 자료형 연습 / 'A'와 "A"는 다르다. (2) | 2024.12.02 |