ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 자바 형변환 ( Type Casting )
    JAVA/컨셉 , 예제 2018. 8. 24. 13:27

    자바는 숫자를 표기법에 따라 다른 데이터 타입으로 인식한다.

    int (4 byte) : 10, 20, 30...
    long(8 byte) : 10L, 20L, 30L...

    double(8 byte) : 1.2, 10.34, 5.6...
    float(4 byte) : 1.2F, 10.34F, 5.6F...

    10과 10L은 같은 값이지만 데이터의 타입이 달라지기 때문에 취급에 주의를 둬야 한다. 
    long 타입의 변수에 int 타입의 변수를 할당하는 것은 문법적으로 문제가 없지만 int 타입의 변수에 long 타입의 변수를 할당하는 것은 Syntax error가 발생하게 된다. 그 이유에 대해 알아보자.

    데이터 타입은 자바에서 매우 중요하다. 변수를 선언한 타입에 맞춰 값을 할당해야 하고, 그렇지 않으면 에러가 발생한다. 하지만 다음과 같은 원시 타입의 정수 및 실수에 대해서는 데이터 타입이 상이함에도 자동 형변환을 통해 에러가 발생하지 않도록 한다. 숫자 타입 데이터들의 경우 아무래도 다른 타입이라도 연산을 하는 경우가 빈번히 발생하고, 개발자는 이를 일일이 하기에는 번거로움이 따르기 때문에 컴파일러가 지원을 해주는 부분이라고 생각을 하고 넘어가자.

    long num = 10;

    타입을 맞춘다면 10이 아니라 10L을 할당해야 하지만 에러가 나지 않고 10이 할당된다. 여기에는 자동 형변환 ( Type Casting) 의 절차가 생략되어 있다. 

    long num = (long) 10;

     다음과 같이 10을 long형으로 형변환하는 과정을 컴파일러가 진행해준다고 생각하면 된다. 이는 작은 데이터 타입에서 큰 데이터타입으로 변환을 하는 것이기 때문에 데이터의 손실이 없음이 보장되기에 가능하다. 프로그래밍 언어에서는 Wide casting이라고 한다.

    28번째 줄에서 4 바이트 int형 변수 num2에 8 바이트 long형 리터럴 값인 10L을 할당하려고 하고 있다. 4 바이트 변수에 8 바이트 변수를 할당하려고 하면 데이터의 손실이 우려되고, 그로 인해 컴파일러에서는 에러를 발생시키는 것이다. 이를 해결하려면 명시적으로 형변환을 해줘야 한다.

    int num2 = (int) 10L;

    다음의 형변환은 8바이트 long 타입 변수 10L을 4바이트 int 타입으로 강제로 형변환해 num2에 할당하라는 의미이다. 이때 형변환은 "데이터의 손실을 감수하고라도 진행하겠다"는 의미가 담겨있다. 이렇게 더 작은 데이터 타입으로 형변환 하는 것을 프로그래밍 언어에서 Narrow Casting이라고 한다.

    // 명시적 캐스팅(narrow) 데이터 손실 우려 int num3 = (int) (10 + 10.6); // int + double // 10 + 10.6의 //결과를 ()안의 int 타입으로 바꾸어서 할당해라. double dNum = 50.20193; int num4 = 10000; int num5 = num4 + (int)dNum;

    서로 다른 타입의 데이터를 연산할 때 자동형변환을 한다면 Wide Casting을 기준으로 진행된다. 

    int(4바이트) + long(8바이트) => long (8바이트)
    float(4바이트) + double(8바이트) => double (8바이트)
    byte (1바이트) + short (2바이트) => short (2바이트)
    int(4바이트) + double(8바이트) => double(8바이트)

    그렇다면 같은 데이터 크기는 어떻게 처리할까? 

    두가지 데이터 타입을 연산한 값을 넣은 결과를 통해

    int(4바이트) + float(4바이트) => float(4바이트)
    long(4바이트) + double(8바이트) => double(8바이트)

    임을 파악할 수 있다. 이는 자바에서 정한 규칙이다. "왜 float 타입이지? double 타입이지?" 라는 의문을 가질 필요가 없는 것이다.


Designed by Tistory.