💁 오버플로우(Overflow)란,
자료형별 값의 최대 범위를 벗어나는 경우, 초과한 값을 버림처리하고 sign bit을 반전시켜 최소값으로 순환시키는 것
byte num1 = 127;
System.out.println("num1 : " + num1);
num1++;
>>> num1의 값을 1씩 증가시킨다는 의미
System.out.println("num1 : " + num1);
📌 Ref.
* 127 : byte의 최대 저장 범위
* 결과적으로, Overflow로 인해 128이 아닌 byte의 최소 저장 범위인 -128이 출력됨
💁 언더플로우(Underflow)란,
오버플로우의 반대 개념으로, 최소 범위보다 작은 수를 발생시키는 경우 일어나는 현상
byte num2 = -128;
System.out.println("num2 : " + num2);
num2--;
>>> num2의 값을 1씩 감소시킨다는 의미
System.out.println("num2 : " + num2);
📌 Ref.
* -128 : byte의 최소 저장 범위
* 결과적으로, Underflow로 인해 -129가 아닌 byte의 최대 저장 범위인 127이 출력됨
오버플로우나 언더플로우는 컴파일 에러, 런타임 에러를 발생시키지 않으므로
최대값, 최소값 범위를 고려해서 코드를 작성해야함
(동작은 정상으로 되기 때문에 잘못된 것을 눈치채기 어려움)
int firstNum = 1000000;
int secondNum = 700000;
int multi = firstNum * secondNum;
>>> int의 최대값인 약 21억이 이미 넘어버림
System.out.println("multi : " + multi);
long longMulti = firstNum * secondNum;
>>> 이미 위에서 int로 선언해버렸기 때문에,
System.out.println("longMulti : " + longMulti);
>>> 결과(값)는 위와 같을 수 밖에 없음
이미 오버플로우 처리된 결과를 가지고 변수에 담기 때문에 처음 결과와 차이가 없음
그렇다면, 계산이 처리되기 전에 long 타입으로 자료형을 변경해주어야함 (강제 형변환 사용)
long result = (long) firstNum * secondNum;
>>> 다른 변수를 선언과 동시에 (long)으로 강제 형변환
System.out.println("result : " + result);
🔑 Used Keywords
강제 형변환