📌 형변환(Casting)
- 자바에서 값을 넣을때 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
- 예)
int->long- 큰 범위에서 작은 범위로는 값을 넣지 못하고, 다음과 같은 문제가 발생한다.
▶️ 소수점 버림
▶️오버플로우(overflow): 컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류이다.- 하지만 결국은 대입하는 형(타입)을 맞추어야 하기 때문에 개념적으로는 다음과 같이 동작한다.
int value = 10; double value = value; double value = (double) value; //형 맞추기 double value = (double) 10; //변수 값 읽기 double value = 10.0; //형 변환
- 이렇게 (double)과 같이 적어주면
int형이double형으로 형이 변한다. 이렇게 형이 변경되는 것을 형변환이라 한다. 작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형 변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에자동 형변환또는묵시적 형변환이라 한다.
명시적 형 변환
double은 실수(실제 수)를 표현할 수 있다. 그러나int는 실수가 아닌 정수를 표현하는데 이 경우double->int로 대입한다면 어떻게 될까?double doubleValue = 1.5; int intValue = 0; intValue = doubleValue; //컴파일 오류 발생 intValue = (int) doubleValue; //형변환
intValue = doubleValue이 부분은 컴파일 오류가 발생하는데int형은double형 보다 숫자의 표현 범위가 작기 때문에 이 경우 숫자가 손실되는 문제가 발생하는데, 큰 컵에 담긴물을 작은 컵에 담으려 하니 손실이 발생할 수 도 있다는 것이기 때문에 컴파일에서 값의 손실이 발생해 오류가 나타나는 것이다.- 이런 위험을 직접 감수하고 데이터 타입을 강제로 변경할 수 있는데
intValue = (int) doubleValue; //명시적 형변환- 이 경우는 개발자가 직접 코드를 입력해 바꾼다해서
명시적 형변환이라고 한다.
📌 형변환과 오버플로우
- 형 변환을 할 때 만약 작은 숫자가 표현하는 범위를 넘어서면 어떻게 될까?
long maxIntValue = 2147483647; //int 최고값 long maxIntOver = 2147483648L; //int 최고값 + 1(초과) int intValue = 0; intValue = (int) maxIntvalue; //형변환 intValue = (int) maxIntOver; //형변환▶️ 정상 범위:
long maxIntValue = 2147483647을 보면int로 표현하는 가장 큰 숫자인2147483647을 입력했다. 이 경우int로 표현하는 범위에 포함 되기 때문에long->int로 형변환을 해도 아무런 문제가 없다.
▶️ 초과 범위:long maxIntOver = 2147483648L을 보면int로 표현하는 가장 큰 숫자인2147483647보다 1큰 숫자를 입력했다. 이 숫자는int범위를 넘어가기때문에 마지막에L을 붙여long형을 사용해야 한다. 이 경우int로 표현하는 범위를 넘기 때문에 형 변환을 할시 문제가 발생한다.int Value = 2147483647; // maxIntvalue를 대입 int Value = -2147483648; // maxIntOver를 대입
- 결과를 보면
-2147483648이라는 전혀 다른숫자가 보인다. 이렇게 기존범위를 초과해서 표현하게 되면 전혀 다른 숫자가 표현되는데, 이런 현상을오버플로우라고 한다.- 참고로
-2147483648는int의 가장 작은 숫자이다.- 중요한 것은
오버플로우가 발생하는 것 자체가 문제다.오버플로우발생 시 결과가 어떻게 되는지 계산하는데 시간을 낭비하면 안된다!오버플로우자체가 발생하지
않도록 막아야 한다. 이 경우 단순히 대입하는 변수의 타입을int->long으로 변경해서 사이즈를 늘리면 오버플로우 문제가 해결된다.
📌 계산과 형변환
- 형변환은 대입 뿐만 아닌, 계산을 할 때도 발생한다.
int div1 = 3/2; //1 double div2 = 3/2; //1.0 double div3 = 3.0/2; //1.5 double div4 = (double) 3 / 2; //1.5 int a = 3; int b = 2; double result = (double) a / b; //1.5
- 자바에서 계산은 2가지만 기억하자
- 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
int+int는int를,double+double은double의 결과가 나온다.
- 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
int+long은long+long으로 자동 형변환이 일어난다.int+double은double+double로 자동 형변환이 일어난다.