Language/Java
[Java] 형변환
HangJu_95
2023. 12. 15. 15:04
728x90
자동 형변환
작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형 변환을 하지 않아도 되며, 자동으로 발생합니다.
public static void main(String[] args) {
int intValue = 10;
long longValue;
double doubleValue;
longValue = intValue; // int -> long
System.out.println("longValue = " + longValue); //longValue = 10
doubleValue = intValue; // int -> double
System.out.println("doubleValue1 = " + doubleValue); //doubleValue1 = 10.0
doubleValue = 20L; // long -> double
System.out.println("doubleValue2 = " + doubleValue); //doubleValue2 = 20.0
}
명시적 형변환
큰 범위에서 작은 범위 대입은 명시적으로 형 변환이 필요합니다.
이때 명시적으로 형 변환을 하기 위해 소괄호 안에 타입을 적어서 명시적으로 형 변환을 합니다.
public static void main(String[] args) {
double doubleValue = 1.5;
int intValue = 0;
//intValue = doubleValue; // 컴파일 오류 발생
intValue = (int) doubleValue; // 명시적 형변환
System.out.println(intValue); // 출력:1
}
intValue = (int) doubleValue; //형변환
이렇게 작성하는 것을 명시적 형변환이라고 합니다.
형 변환과 오버플로우
형변환을 할 때 작은 숫자가 표현할 수 있는 범위를 넘어선다면 이것을 오버플로우라고 합니다.
보통 오버플로우가 발생한다면 마치 시계가 한바퀴 돈 것 처럼 다시 처음부터 시작합니다.
public static void main(String[] args) {
long maxIntValue = 2147483647; //int 최고값
long maxIntOver = 2147483648L; //int 최고값 + 1(초과)
long maxIntOver2 = 3147483648L; // int 최고값을 한참 넘었다.
int intValue = 0;
intValue = (int) maxIntValue; //형변환
System.out.println("maxIntValue casting=" + intValue); //출력:2147483647
intValue = (int) maxIntOver; //형변환
System.out.println("maxIntOver casting=" + intValue); //출력:-2147483648
intValue = (int) maxIntOver2; // 형변환
// -10억이 추가되었다.
// 시계가 한바퀴 돌고 나서 다시 시작하는 순으로 발생
// overflow 발생
System.out.println("maxIntOver2 casting=" + intValue); //출력:-1147483648
}
오버플로우가 발생하지 않도록 큰 사이즈의 타입으로 변경하는 것이 좋습니다.
형변환과 계산
자바에서 형변환 계산은 다음 두가지를 기억하면 됩니다.
- 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
- 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
public static void main(String[] args) {
int div1 = 3 / 2;
// int와 int로 계산했기 때문에 int가 나온다
System.out.println("div1 = " + div1); //1
// int와 int로 계산했기 때문에 int가 나온다
double div2 = 3 / 2;
System.out.println("div2 = " + div2); //1.0
// double와 int로 계산했기 때문에 double가 나온다
double div3 = 3.0 / 2;
System.out.println("div3 = " + div3); //1.5
// double과 int로 계산했기 때문에 double이 나온다.
// 명시적 형변환 사용
double div4 = (double) 3 / 2;
System.out.println("div4 = " + div4); //1.5
int a = 3;
int b = 2;
// 이때 a앞에 double을 붙여줬기 때문에 double이 나온다.
// 명시적 형변환 사용
double result = (double) a / b;
System.out.println("result = " + result); //1.5
}