형변환 (Casting) : 값의 자료형을 변환하는 것 (단, boolean 제외)
** 형변환은 왜 필요할까?
int num1 = 10;
double num2 = 3.5;
double num3 = 0.1;
System.out.println("자동형변환 결과 : " + (num1 + num2));
System.out.println("자동형변환 결과 : " + (num1 * num3));
// 원래 에러가 발생해야 되지만 "자동 형변환" 덕분에 발생하지 않음.
int i1 = 3;
double d1 = i1;
System.out.println("i1 : " + i1); // 3
System.out.println("d1 : " + d1); // 3.0
// double 은 실수만 저장할 수 있는 자료형
// 정수가 대입되는 연산이 수행되면
// 정수 -> 실수로 자동 형변환
System.out.println(d1 + num2); //double + double
'만약 위에서 3.0으로 출력되는 결과값을 소수점을 출력하고싶지 않을때는 어떻게 해야할까?'
라는 궁금증이 들어 지금까지 배운것으로 조합을 해보았으나
float 이나 double을 형변환하여 int 로 바꾸게 되면 1.0처럼 소수점 자리가 없을때는 문제가 되지 않지만 소수점자리가 있을경우 소수점을 버리기 때문에
1. 소수점자리가 있을때는 그대로 표시
2. 소수점자리가 없을때는 예를들어 1.0처럼 소수점이 0일때는 1로 표시
라는 두가지 조건을 같이 만족시킬수 있는 명령어를 배워야 가능할 듯 싶다.
// int -> long 형변환
int i2 = 2_100_000_000; // 21억
long l2 = 10_000_000_000L; // 100억
long result2 = i2 + l2;
// int + long -> long + long = long
System.out.println("result2 : " + result2);
char -> int 형변환
char 자료형은 문자형이지만 실제 저장하는 값은 0부터 6만5천번 사이에 있는 숫자
만약 문자열의 아스키코드가 알고싶다면 char를 int로 형변환해주면된다.
char ch3 = 'v';
int i3 = ch3;
System.out.println(i3); // v의 아스키 코드는 118
char ch4 = '각';
int i4 = ch4;
System.out.println(ch4); // 각
System.out.println(i4); // 각의 아스키 코드 44033
char ch5 = '☏';
int ch5 = i5;
System.out.println(i5); // 전화기표시의 아스키 코드 9743
char ch6 = 9743;
System.out.println(ch6); // 결과값 ☏
오버플로우
오버플로우 현상은 컴퓨터가 미리 예측할 수가 없다!!
개발자가 미리 예측해야함.
int i7 = 2147483647; // int의 최대값
int result7 = i7 +1;
System.out.println(result7); // -2147483648
어렸을적 게임 세이브 데이터 수정을 max치로 바꾼후 (ff 255나 ffff 65535) 레벨업후 능력치가 오르면 0이나 -로 바뀌던 이유가 이것때문인것 같다.
아마 리미트를 걸수있는 방법이 있을듯 하다.
강제 형변환
1) 값의 범위가 큰 자료형을 작은 자료형으로 변환할 때 사용
2) 출력되는 데이터의 표기법을 변환시키고 싶을 때
ex) double temp = 3.14;
int num = (int) temp;
double temp = 3.14;
int num = (int) temp; // 형변환이 없을시 Type mismatch: cannot convert from double to int
System.out.println("temp:" + temp); // 3.14
System.out.println("num:" + num); // 3
// 실수 -> 정수형 변환 시 소수점 버림 처리(데이터 손실)
// int -> byte 강제 형변환
int iNum = 290;
// byte bNum = iNum; // type mismatch: cannot convert from int to byte
byte bNum = (byte) iNum;
System.out.println(iNum); // 290
System.out.println(bNum); // 34
// 같은 정수형 끼리의 변환 시에도
// 값의 범위 차이 때문에 데이터 손실이 발생
// char -> int 강제 형변환
char ch = 'A'; // 65
int iNum2 = ch; // 자동 형변환 이용
System.out.println(iNum2); // 65
// 강제 형변환 이용
System.out.println( (int)ch );
// int -> char 강제 형변환
int iNum3 = 44033;
System.out.println( iNum3 + "번째 문자 : " + (char)iNum3 ); // 44033번째 문자 : 각
앞서 형변환으로 알아냈던 코드나 코드가 해당하는 문자가 어떤건지 더 쉽게 알수있었다.
앞서 배운것을 활용한 실습문제
선언 및 초기화된 5개의 변수를 가지고 알맞은 사칙연산(+, -, *, /)과 형변환을 이용하여 주석에 작성되 값과 같은 결과가 나타나도록 코드를 완성하세요.
public class CastingPractice1 {
public static void main(String[] args) {
int iNum1 = 10;
int iNum2 = 4;
float fNum = 3.0f;
double dNum = 2.5;
char ch = 'A';
System.out.println( iNum1 iNum2 ); // 2
System.out.println( dNum ); // 2
System.out.println( iNum2 dNum ); // 10.0
System.out.println( iNum1 ); // 10.0
System.out.println( iNum1 iNum2 ); // 2.5
System.out.println( dNum ); // 2.5
System.out.println( fNum ); // 3
System.out.println( iNum1 fNum ); // 3
System.out.println( iNum1 fNum );// 3.3333333
System.out.println( iNum1 fNum ); // 3.3333333333333335
System.out.println( ch ); // 'A'
System.out.println( ch ); // 65
System.out.println( ch iNum1 ); // 75
System.out.println( (ch iNum1) ); // 'K'
}
내 답안
public static void main(String[] args) {
int iNum1 = 10;
int iNum2 = 4;
float fNum = 3.0f;
double dNum = 2.5;
char ch = 'A';
System.out.println( (int) + (iNum1 / iNum2) ); // 2
// '/' 가 자바에서는 몫만 구해줘서 앞에 (int) 가 필요 없었다.
// '%' 는 나머지를 구해줌
System.out.println( (int) dNum ); // 2
System.out.println( iNum2 * dNum ); // 10.0
System.out.println( (double) iNum1 ); // 10.0
System.out.println( (double) iNum1 / iNum2 ); // 2.5
System.out.println( dNum ); // 2.5
System.out.println( (int) fNum ); // 3
System.out.println( (int) (iNum1 / fNum) ); // 3
System.out.println( iNum1 / fNum ); // 3.33333333
System.out.println( iNum1 / ( (double) fNum) ); // 3.33333333333335
System.out.println( "'" + ch + "'" ); //'A'
System.out.println( (int) ch ); // 65
System.out.println( (int) ch + iNum1 ); // 75
// 자동형변환되어 강제형변환(int) 가 필요 없었다
System.out.println( "'" + (char) ( (int) ch + iNum1) + "'" ); //'K'
// 자동형변환되어 강제형변환(int) 가 필요 없었다2
}