본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 형 변환

지난 글: [프로그래밍 언어/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