티스토리 뷰
1. 오버플로우 개요
1-1. 오버플로우(overflow)란?
💡변수가 담을 수 있는 값의 범위를 벗어나는 데이터를 담았을 때 발생하는 현상
자료형 별 값의 최대 범위를 벗어나는 경우 발생한 carry를 버림처리 하고 sign bit를 발전시켜 최소값으로 순환시키는 현
package com.ohgiraffers.section04.overflow;
public class Application1 {
public static void main(String[] args) {
/* 수업목표. 오버플로우에 대해 이해할 수 있다. */
/* 필기.
* 자료형 별 값의 최대 범위를 벗어나는 경우
* 발생한 carry를 버림처리하고 부호 비트를 반전시켜 순환한다.
* */
/* 설명. 오버플로우 */
byte num1 = 126;
num1++; // 기존의 num1 변수에 있던 값에 1을 더해 다시 대입한다.
// num1 = num1 + 1;
System.out.println("num1 = " + num1);
num1++;
System.out.println("num1 = " + num1);
num1++;
System.out.println("num1 = " + num1);
/* 설명. 언더플로우 */
num1--;
System.out.println("num1 = " + num1);
num1--;
System.out.println("num1 = " + num1);
num1--;
System.out.println("num1 = " + num1);
}
}
1-2. 오버플로우 발생 확인과 해결 방법
- 논리적 문제 발생과 해결 방법
/* 문제 발생 */
int firstNum = 1000000; //100만
int secondNum = 700000; //70만
int multi = firstNum * secondNum; //7천억이 나와야 함
System.out.println("firstNum * secondNum = " + multi); //--79669248 이 나온다.
// 실행 결과
firstNum * secondNum = -79669248
/* 해결 방법 */
/* 오버플로우를 예측하고 더 큰 자료형으로 결과값을 받아서 처리한다. */
long longMulti = firstNum * secondNum;
System.out.println("longMulti : " + longMulti); //여전히 오버플로우가 발생한다.
/* 이미 오버플로우 처리 된 결과를 가지고 변수에 담기 때문에 위에 결과랑 별 차이가 없다.
* 그럼 어떻게 해결을 해야 하나?
* 계산이 처리 되기 전에 long 타입으로 자료형을 변경해주어야 한다. (강제형변환 이용)
* 강제 형변환은 바로 다음 섹션에서 다루게 될 예정이다.
* */
long result = (long) firstNum * secondNum;
System.out.println("result : " + result); //정상적으로 7천억이 출력될 것이다.
// 실행 결과
longMulti : -79669248
result : 700000000000
'한화시스템 > 백엔드' 카테고리의 다른 글
[BE] JAVA_연산자 (0) | 2024.07.13 |
---|---|
[BE] JAVA_형변환 (0) | 2024.07.13 |
[BE] JAVA_상수 (0) | 2024.07.13 |
[BE] JAVA_변수 (0) | 2024.07.13 |
[BE] JAVA_리터럴 (0) | 2024.07.12 |