본문 바로가기
프로그래밍 언어/Java

[Java] 형 변환

by 까망 하르방 2021. 3. 7.
반응형

형 변환

Java에서 형 변환은 두 가지로 나눠 볼 수 있는데, 자동(묵시적)형 변환 명시적 형변환

[자동 타입 변환] 작은 데이터 타입 → 큰 데이터 타입

타입 변환을 하면 원본 데이터의 손실 없이 그대로 보존 되기 때문에 자동 타입 변환이 일어난다.

byte >> short/ char >> int >> long >> float >> double

자동 형변환은 개발자가 별도의 작업을 하지 않아도 알아서 처리됩니다.

즉, JVM 내에서 알아서 해석되는 변환 작업이라고 생각할 수 있습니다.

ex) 1G 메모리 카드에 있는 데이터를 2G 용량의 메모리 카드로 옮기는 작업을 할 때는

      특별히 별도의 작업을 하지 않아도 되는 것과 비슷한 원리입니다. (작은 것 → 큰 것)

 

[강제 타입 변환] 큰 데이터 타입 → 작은 데이터 타입

타입 변환을 하게 되면 데이터 손실이 발생할 수도 있으므로

변환하고자 하는 타입을 지정해야 한다.

 

명시적 형변환은 "큰 용량의 상자에서 작은 용량의 상자로 옮기는 작업"으로 이해하면 됩니다. 

캐스팅(Casting)이라고 하기도 합니다. 다음과 같이 괄호를 이용해 바꿀 수 있다.

int x = 1;

byte y = (byte) x;

(다운)캐스팅은 큰 상자에서 작은 상자로 데이터를 옮길 때, 필요한 크기로 잘라낸다는 개념입니다.

그리고 잘라내게 되면 원하지 않는 데이터가 들어갈 수 있는데...

그 이유는 바이트 데이터가 부분 잘려나가면서 캐스팅 되기 때문입니다.

(같은 크기의 상자에서라도 타입이 완전히 다르면 캐스팅 작업이 필요합니다.ex) char/short, float/int 등)

[1 byte (8bit)]: byte

[2 byte]: short, char

[4 byte]: int, float

[8 byte]: long, double

 

데이터의 값이 커서 데이터의 손실이 발생하는 경우도 있지만 

아래와 같이 데이터 타입의 특성상 데이터의 손실이 발생하는 경우가 있다.

public class Main {
    public static void main(String[] args) {
        double d = 1.9;
        System.out.println(d);
        
        int n = (int) d;
        System.out.println(n);
        
    }
}

 

※ 소수(double, float)는 주의해야 합니다.

long v1 = 1234L; // 8byte

float v2 = v1; // 4byte

지금까지의 이론대로 라면 위의 선언은 잘못된 것이므로 컴파일할 수 없는 코드입니다.

하지만, 실제로 위의 코드는 전혀 문제가 없는 코드입니다.

소수일 때는 데이터를 보관하는데 있어서 연산 작업이 이루어지기 때문입니다.

즉, double, float은 데이터를 '000000'과 같은 방식으로 표현하는 것이 아니라,

연산의 결과로 '부호 + 지수 + 가수'의 형태가 되므로

일반적인 형 변환의 법칙에서는 조금 예외라고 볼 수 있습니다. 

 

만일 다음과 같은 결과는 어떻게 될까?

public class Main {
    public static void main(String[] args) {

        int x = 10;
        int y = 3;
        System.out.println("int...: " + x/y);
       
        int a = 10;
        double b = 3;
        System.out.println("double...:" + a/b);
    }
}

[결과] - 정수와 소수의 연산은 소수로 자동 변환된다.

 

 

반응형

댓글