나를 기록하다
article thumbnail
반응형
 

5. 형변환(casting)

💡
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

5.1 형변환 방법

💡
(type) 피연산자

 

  • 예제
  • 결과
  • 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능.

5.2 정수형 간의 형변환

  • 큰 타입에서 작은 타입으로의 변환에서는 ‘값 손실(loss of data)’이 발생할 수 있음.

 

  • [예제] CastingEx1
public class CastingEx {
    public static void main(String[] args) {
        int i = 10;
        byte b = (byte)i;
        System.out.printf("[int -> byte] i = %d -> b = %d%n", i, b);



         i = 300;
         b = (byte)i;
        System.out.printf("[int -> byte] i = %d -> b = %d%n", i, b);



         b = 10;
         i = (int)b;
        System.out.printf("[byte -> int] i = %d -> b = %d%n", b, i);

        b = -2;
        i = (int)b;
        System.out.printf("[byte -> int] i = %d -> b = %d%n", b, i);

        System.out.println("i = " + Integer.toBinaryString(i));
    }
}
// 결과
[int -> byte] i = 10 -> b = 10
[int -> byte] i = 300 -> b = 44
[byte -> int] i = 10 -> b = 10
[byte -> int] i = -2 -> b = -2
i = 11111111111111111111111111111110

 

 

5.3 실수형 간의 형변환

⭐︎주의사항⭐︎

형변환할 때 가수의 24번째 자리에서 반올림이 발생할 수 있음 → 반올림이 발생하여 23번째 자리의 값이 1 증가

 

  • [예제] CastingEx2
public class _12_CastingEx2 {
    public static void main(String[] args) {
        float f = 9.1234567f;
        double d = 9.1234567;
        double d2 = (double)f;

        System.out.printf("f = %20.18f\n", f);
        System.out.printf("d = %20.18f\n", d);
        System.out.printf("d2 = %20.18f\n", d2);
    }
}
// 결과
f = 9.123456954956055000
d = 9.123456700000000000
d2 = 9.123456954956055000

→ float는 7자리 정밀도, double은 15자리 정밀도를 가진다.

따라서 같은 값을 저장해도 서로 다른 값이 저장되기 때문에 형변환을 해도 같아지지 않는다.

 

5.4 정수형과 실수형 간의 형변환

정수형과 실수형은 저장형식이 완전히 다르기 때문에 복잡한 변환과정을 거쳐야 한다.

int : 1(S) + 31 = 32(4 byte)

float : 1(S) + 8(E) + 23(M) = 32(4 byte)

5.4.1 정수형 → 실수형

  • [예제] 10진수의 7을 float 타입의 변수에 저장되는 과정

→ 이와 같은 이유로 실수형을 정수형으로 형변환할 때 반올림이 발생하지 않는다.

ex) 1.666 →(int)→ 1

만약, 실수의 소수점을 버리고 남은 정수가 정수형의 저장범위를 넘는 경우에는 정수의 오버플로우가 발생한 결과를 얻는다.

5.4.2 실수형 → 정수형

  • [예제] 9.1234567f →(int)→ 9

 

  • [예제] CastingEx3.java
public class _13_CastingEx3 {
    public static void main(String[] args) {
        int i = 91234567;
        float f = (float)i;
        int i2 = (int)f;

        double d = (double)i;
        int i3 = (int) d;

        float f2 = 1.666f;
        int i4 = (int)f2;

        System.out.printf("i = %d%n", i);
        System.out.printf("f = %f, i = %d%n", f, i2);
        System.out.printf("d = %f, i3 = %d%n", d, i3);
        System.out.printf("(int) %f = %d", f2, i4);
    }
}
  • 결과
i = 91234567
f = 91234568.000000, i = 91234568
d = 91234567.000000, i3 = 91234567
(int) 1.666000 = 1

 

5.5 자동 형변환

서로 다른 타입간의 대입이나 연산 시, 형변환으로 타입을 일치시키는 것이 원칙
하지만 경우에 따라 편의상의 이유로 형변환을 생략할 수 있음
→ 컴파일러가 생략된 형변환을 자동적으로 추가

float f = 1234; // 형변환의 생략. float f = (float)1234;와 같다.
byte b = 1000; // 에러. byte의 범위 (-128 ~ 127)를 넘는 값을 저장
char ch = (char)1000; // 명시적 형변환. 에러가 발생하지 않는다.

int i = 3;
double d = 1.0 + i; // double d = 1.0 + (double)i;에서 형변환 생략됨.

 

5.5.1 자동 형변환의 규칙

💡
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.

 

5.5.2 자동 형변환

  • 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다.

byte(1 byte)→short(2 byte)→int(4 byte)→long(8 byte)→float(4 byte)→double(8 byte)

char(2 byte) ­­­⤴︎

✿ 보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크기 마련이지만, 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 갖는다. 따라서 float와 double이 같은 크기인 int와 long보다 오른쪽에 위치한다.

💡
1. boolean 을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환할 수 없다.
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...