형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
예를 들어, 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 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. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.