형 변환1
작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
int -> long -> double
큰 범위에서 작은 범위는 문제가 발생할 수 있다
1. 소수점 버람
2. 오버플로우
public class Casting1 {
public static void main(String[] args) {
int intVal = 10;
long longVal;
double doubleVal;
longVal = intVal;
System.out.println("longVal = " + longVal);
doubleVal = longVal;
System.out.println("doubleVal = " + doubleVal);
doubleVal = intVal;
System.out.println("doubleVal1 = " + doubleVal);
doubleVal = 20L;
System.out.println("doubleVal2 = " + doubleVal);
}
}
형이 변경 되는 것을 형 변환이라고 하는데, 작은 범위 숫자 타입에서 큰 범위 숫자 타입으로 대입은 개발자가 이렇게 직접 형 변환을 하지 않아도 된다.
이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형 변환 이라고 한다.
형 변환 2
큰 범위에서 작은범위 대입은 명시적 형변환이 필요하다.
public class Casting2 {
public static void main(String[] args) {
double doubleVal = 1.5;
int intVal = 0;
intVal = (int) doubleVal; //명시작 casting 해줘야 함
System.out.println(intVal);
System.out.println("doubleVal = " + doubleVal); // 값 변경 되지는 않는다
}
}
int형은 double 형보다 숫자의 표현 범위가 작다. 이 경우 숫자가 손실되는 문제 발생 가능성. -> CompileError
이런 위험을 개발자가 감수하고 값을 대입하고 싶다면 데이터 타입을 강제로 변경 가능
intVal = (int) doubleVal; -> 명시적 형변환
캐스팅 용어
형 변환 후 출력해보면 1이 출력되는 결과를 볼 수 있다.
참고로 형 변환을 한다 해서 doubleVal에 있는 값이 정수형으로 변환 되는 것은 아니다. 그대로 유지
형변환 오버플로우
public class Casting3 {
public static void main(String[] args) {
long maxIntVal = 2147483647;
long maxIntOver = 2147483648L;
int intVal = 0;
intVal = (int) maxIntVal;
System.out.println("intVal = " + intVal);
intVal = (int) maxIntOver;
System.out.println("intVal = " + intVal);
}
}
int로 표현 할 수 있는 가장 큰 수인 2147483647보다 숫자 1큰 수를 입력하면, 리터럴은 int 범위를 넘어가기 때문에 마지막에 L을 붙여서 long형을 사용
이렇게 기존 범위를 초과해서 표현하게 되면 전혀 다른 숫자 표현, -> 오버플로우
계산과 형 변환
public class Casting4 {
public static void main(String[] args) {
int div1 = 3 / 2;
System.out.println("div1 = " + div1);
double div2 = 3 / 2;
System.out.println("div2 = " + div2);
double div3 = 3.0 / 2;
System.out.println("div3 = " + div3);
double div4 = (double) 3 / 2;
System.out.println("div4 = " + div4);
int a = 3;
int b= 2;
double rst = (double) a/ b;
System.out.println("rst = " + rst);
}
}
같은 타입끼리의 계산은 같은 타입의 결과
서로 다른 타입의 계산은 큰 범위로 자동 형 변환