본문 바로가기
Java/정리

3회차_상수 & 데이터 오버플로우 & 형변환

by 콧등치기국수 2021. 4. 10.

1. 상수

- 수학 : 변하지 않는 값

- 컴퓨터(JAVA) : 한 번만 저장할 수 있는 메모리 의미

 

1-1. 선언방법

final int AGE;

* (상수명 -> 모두 대문자로 표기)

 

1-2. 상수초기화 방법

변수와 동일

*  (초기화 이후 데이터(값)을 대입할 수 없다.)

 

 

2. 데이터 오버플로우 : 메모리에 표현범위를 초과하는 값을 저장하려는 경우

자료형의 크기에 따라 저장할 수 있는 데이터 범위가 달라진다.

컴퓨터의 데이터는 0,1로 구분되며 크기는 1bit이다.

1byte는 8bit이며, 원칙적으로 각 bit마다 0,1 두 개의 숫자를 넣어 8자리의 이진수를 나타낼 수 있다. 

즉 0~255까지 나타낼 수 있지만 음수도 표현해야하므로 "부호비트"(제일 앞의 bit)를 사용하여 -128~127까지 범위를 나타낸다. 

 

JAVA의 자료형 범위

 

1byte 가 저장할 수 있는 정수의 범위 : - 128 ~ 127 

 

그렇다면 아래와 같이 최대범위인 127을 초과하여 byte에 저장하려고 한다면 어떻게 될까?

아래와 같이 오버플로우가 일어나 128이 아닌 범위 중 가장작은 값인 -128이 된다.

127 +1 => -128 

 

 

전자시계를 예로 하여 이해해 볼 수 있다.

23:59:59(나타낼 수 있는 가장 큰 값)일 때 1초가 지나면 24:00:00이 아닌

00:00:00(나타낼 수 있는 가장 작은 값)로 돌아간다.

 

즉 1,2,3, ... , 125, 126, 127, -128, -127, -126, -125, ... 0,1,... 이렇게 가장작은 값과 가장 큰 값이 

서로 맞물려 있다.

 

* 부호비트

- 0 : 양수

- 1 : 음수

 

0111 1111 : 양수에서 최대값  = 127

1000 0000 : 128  부호비트 침범 -> 나머지 다 0 -> -값이 됨

 

* int범위로 인한 오버플로우 발생

int 저장범위(~약 21억) 초과로 인한 오버플로우 발생

 

위와같이 int저장범위 초과로 인해 오버플로우가 발생하여 

생뚱맞은 값이 결과로 나왔다.

이는 아래와 같이 long자료형으로 강제 형변환해줄 경우 해결이 가능하다. 

 

 

long형으로 강제 형변환

 

 

3.  형변환(casting)

값(Data)의 자료형을 바꾸는 것. (boolean제외한다.)

 

int를 boolean으로 변환하려 했으나 오류남

 

3-1. 형 변환 예시

* 123456 -> 123456.0

  (int)          (double)

* 'A' -> 65

  (char) (int)

* 3.14f -> 3

  (float)   (int)

 

 

3-2-1. 자동 형변환 (형변환 생략 가능)

컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환해주는 경우.

크게 문제될 일이 없으므로 아래와 같이 자동으로 큰 자료형으로 변환이 된다.

 

int a = 12;

double b = 3.5;

System.out.println(a + b);          //(15.5) int형과 double형의 연산결과가 double형으로 자동변환됨.

 

화살표방향대로 자동변환되는 자료형  

 

 

[ char -> int ] 자동형변환 됨

문자에 해당하는 유니코드 숫자로 변환

int num = 'A';
System.out.println("num : "+ num);    //65

 

 

long은 8byte이고 float은 4byte인데 어떻게 자동 형변환이 되는거지?

-> float의 비트수가 더 적지만 나타낼 수 있는 수의 범위가 더 커서 자동변환 가능하다.

 

 

short(양수,음수 모두) -> char(양수만)로 전환 X

==> int로만 해야함

 

 

* 단, byte와 short자료형 값의 계산 결과는 무조건 int로 처리

--> 따라서 byte, short자료형의 계산 결과를 int가 아닌, byte나 short로 얻고 싶은 경우

     (byte) / (short)를 통해 강제 형변환을 해줘야 한다.

byte와 short자료형 값의 계산 결과는 int!

 

 

3-2-2. 강제 형변환 (형변환 생략 불가능)

값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환

강제 형변환 시 데이터 손실이 발생할 수 있음 -> 데이터의 변형, 손실을 감수하고 강제 변환

double temp;

int n =(int)temp;  //()안 변환하고 싶은 자료형 명시

 

 

데이터 손실 과정
형변환으로 인한 데이터 손실

 

 

 

출처: kh정보교육원 예습영상, www.hanumoka.net/2017/09/08/java-20170908-java-datatype-orverlow/ 

'Java > 정리' 카테고리의 다른 글

7회차_제어문(switch문_return/break 차이)  (0) 2021.04.19
[Java] 연산자  (0) 2021.04.12
2회차_출력메소드(printf)  (0) 2021.04.10
1회차_클래스 import, println단축키  (0) 2021.04.10
1회차_콘솔창, explorer창  (0) 2021.04.10