지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 상수와 리터럴
형 병환이란?
컴퓨터 내부에서 정수와 실수가 표현되는 방식은 전혀 다르다.
하여 정수와 실수를 더한다고 할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로
통일한 후 연산을 해야한다. 이때 이루어지는 것이 형 변환(type conversion)이다.
위 문장에서 변수 num은 int형이고 변수 dnum은 double형이다. 형 변환이란
이렇게 각 변수의 자료형이 다를 때 자료형을 같도록 바꾸는 것을 말한다.
형 변환은 크게 묵시적 형 변환(자동 형 변환)과 명시적 형 변환(강제 형 변환) 두 가지로
구별할 수 있다.
묵시적 형 변환
형 변환의 기본 원칙은 밑과 같다.

위 두 가지 원칙에 기반해 묵시적 형 변환이 이루어지는 관계를 알 수 있다.

ㄱ) 바이트 크기가 작은 자료형에서 큰 자료형으로 변환

이 경우에 sNum의 크기는 2바이트이고 iNum의 크기는 4바이트이므로 자료 손실 없이
sNum에 들어 있는 값이 모두 iNum에 저장된다. 남은 3바이트에는 0으로 채워진다.
ㄴ) 덜 정밀한 자료형에서 더 정밀한 자료형으로 변환

이 경우에는 long형인 lNum이 8바이트로 더 크지만 float형인 fNum이 더 정밀하게
데이터를 표현할 수 있기에 실수형인 float형으로 변환한다.
ㄷ) 연산 중에 자동 변환

이 경우에는 dNum = fNum + iNum에서 두 번의 형 변환이 일어난다.
우선 fNum + iNum 연산에서 int형이 float형으로 변환되고, 두 변수를 더한 결과 값이
dNum에 대입되면서 double형으로 변환된다.
명시적 형 변환
명시적 형 변환은 묵시적 형 변환과 반대라고 볼 수 있다.
ㄱ) 바이트 크기가 큰 자료형에서 작은 자료형으로 변환

이 경우에는 byte형인 bNum이 1바이트, int형인 iNum이 4바이트로 bNum이 int형보다 크기가 작기에
자료 손실이 발생할 수 있다. 따라서 변환할 자료형을 프로그래머가 명시적으로 써 줘야 하며 이를
강제 형 변환이라고 한다. 위는 대입된 값 10이 1바이트 안에 표현할 수 있어서 자료 손실이 없지만
밑처럼 byte형이 표현할 수 있는 범위를 넘어가면 자료 손실이 발생할 수 있다.


이 경우는 값 500이 byte형이 표현할 수
있는 범위를 넘기에 자료 손실이 발생해 대입된 값이 -12로 출력된다.
ㄴ) 더 정밀한 자료형에서 덜 정밀한 자료형으로 변환
실수 자료형에서 정수 자료형으로 값이 대입되는 경우도 역시 형 변환을 명시적으로 해주어야 한다.


이 경우에는 실수의 소수점 이하 부분이 생략되고 정수 부분만 대입된다.
ㄷ) 연산 중 형 변환


8행과 9행의 연산 결과가 다른 것이 보인다. 8행에서는 두 실수가 각각 명시적으로 형 변환한다.
따라서 2와 0으로 변환된 두 값을 합해 결과 값이 2가 된다.
하지만 9행에서는 두 실수 dNum과 fNum의 합을 먼저 연산한다. 두 실수의 자료형은 다르지만,
float형이 double형으로 묵시적 형 변환이 일어나면서 두 수가 더해져 값이 3.1이 되고, 이후에
int형으로 명시적 형 변환이 일어나 결과 값이 3이 된다. 이처럼 같은 연산이라도 형 변환이 언제
이루어졌느냐에 따라 그 결과 값이 다르게 나타날 수도 있다.
참고 서적: 자바 프로그래밍 입문 - 박은종
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA 입문 - 비트 연산자 (4) | 2022.05.02 |
---|---|
JAVA 입문 - 항과 연산자 (8) | 2022.05.02 |
JAVA 입문 - 상수와 리터럴 (0) | 2022.05.01 |
JAVA 입문 - 변수의 자료형 (0) | 2022.04.30 |
JAVA 입문 - 변수 (1) | 2022.04.30 |