자바 도전기-4

김치전사·2021년 12월 29일
0

자바도전기

목록 보기
4/17

지금은 형변환에 대해 공부한다

연산을 수행하기 전에 타입을 일치시켜야 하는데, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 '형변환(casting)'이라고 한다

형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
예를 들어, int타입 값과 float타입의 값을 더하는 경우, 먼저 두 값을 같은 타입으로 즉, 둘 다 float타입으로 변환한 다음에 더해야 한다

형변환 방법은 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다

(타입)피연산자
double d=85.4;
int score=(int)d;//double타입의 변수 d를 int타입으로 형변환

피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다

public class CastingEx1 {
    public static void main(String[] args){
        double d=85.4;
        int score=(int)d;

        System.out.println("score="+score);
        System.out.println("d="+d);
    }
}

int타입(4 byte)의 값을 byte타입(1 byte)으로 변환하는 경우는 값 손실이 발생할 수 있다.
byte타입에서 int타입으로 변환하는 경우는 값 손실이 발생하지 않는다.
원래의 값을 채우고 남은 빈공간은 0으로 채우는 게 보통이지만, 변환하려는 값이 음수인 경우에는 빈 공간을 1로 채운다

public class CastingEx2 {
    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("[int -> byte] b=%d ->i=%d%n",b,i);

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

        System.out.println("i="+Integer.toBinaryString(i));
    }
}

Integer.toBinaryString(int i)라는 메서드를 통해 정수를 2진 정수로 변환한 문자열을 얻을 수 있다

public class CastingEx4 {
    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 i2=%d\n",f,i2);
        System.out.printf("d=%f i3=%d\n",d,i3);
        System.out.printf("(int)%f=%d\n",f2,i4);
    }
}

float는 10진수로 약 7 자리의 정밀도만을 제공하므로, int를 float로 변환할 때 정밀도 차이에 의한 오차가 발생할 수 있다. 그래서 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 float가 아닌 double로 형변환해야 오차가 발생하지 않을 것이다

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;에서 형변환이 생략됨

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

1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환할 수 없다.
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
profile
개인공부 블로그입니다. 상업적 용도 X

0개의 댓글