classOperator3_1 {publicstaticvoidmain(String[] args) {int i =65, num =10;char ch ='A';float f =1.6f;System.out.println("(char)i = "+ (char)i);System.out.println("(int)ch = "+ (int)ch);System.out.println("(int)f = "+ (int)f);System.out.println("(float)num = "+ (float)num); }}
자동 형변환
float f = 1234; => int 타입의 값을 float타입의 변수에 저장!
상대적으로 int 타입이 float 타입 보다 크기가 작기 때문에 가능합니다.
float f = (float)1234; => 사실 변수와 리터럴의 타입을 일치 시켜줘야 합니다.
우리가 보는 코드에는 형변환이 생략되어 있었습니다. 즉, 컴파일러에 의해 자동으로 형변환된 겁니다.
int i = 3.14f;
이렇게 큰 타입을 작은 타입에 저장할 때 Error 가 발생합니다.
3.14f 가 int 타입으로 변환될 때 소수점이 사라지면서 원래 값이 달라집니다.
즉, 값 손실이 발생하는데 이런 경우, 컴파일러가 자동으로 형변환을 안 해줍니다.
int i = (int)3.14f; => 이렇게 직접 수동으로 형변환을 시켜줘야 합니다.
"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."
형변환을 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서인데, 형변환을 생략 하려면 컴파일러가 알아서 자동으로 형변환을 해야합니다.
따라서 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없음으로 두 타입 중에서 표현 범위가 더 넓은 쪽으로 형변환됩니다.
아래 예제코드로 학습해 보겠습니다.
classOperator3_2 {publicstaticvoidmain(String[] args) {// 큰 타입을 작은 타입에 저장!// int i = 3.14f; // Error 발생int i = (int)3.14f; // 형변환 필요!System.out.println("i = "+ i);// 예외 경우 확인// 100 은 int 타입 따라서 아래 코드는 현재 큰 타입(int)을 작은 타입(byte)에 넣고 있음!// 컴퓨터는 byte의 범위가 -128 ~ 127 인 것을 알고 있다.// 따라서 100을 byte b 에 집어 넣어도 값 손실이 발생하지 않는 다는 것을 알기 때문에// 자동으로 형변환을 해준다.// byte b = (byte)100; -> 컴파일러가 자동 형변환byte b =100; // OKSystem.out.println("b = "+ b);// 위의 경우는 100 은 리터럴 즉, 상수이기 때문에 컴파일러가 값을 명확하게 알지만// 아래 num 은 변수, 따라서 확신할 수 없기 때문에 Error 발생int num =100;// byte b2 = num; // Error 발생byte b2 = (byte) num; // byte 타입으로 형변환System.out.println("b2 = "+ b2);// byte b3 = 1000; // Error 발생, 범위를 넘어감byte b3 = (byte) 1000;// OK, 그러나 값 손실 발생, b3 에는 -24 가 저장됨// 즉, 상수여도 값 손실이 일어나면 자동 형변환 불가능!System.out.println("b3 = "+ b3); }}