JAVA

형 변환

seungmin576 2024. 12. 6. 15:05

형 변환

정수와 실수는 컴퓨터 내부에서 표현되는 방식이 전혀 다르다.

따라서 정수와 실수를 더한다고 할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로 통일한 후 연산을 해야한다.

이때 형 변환이 이루어진다.

각 변수의 자료형이 다를 때 자료형을 같게 바꾸는 것을 말한다.

 

 

  • 형 변환의 기본 원칙

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