JAVA/변수 및 객체, 기타

데이터 오버플로우와 형변환

Lune Bleue 2019. 12. 12. 00:55

1. 데이터 오버 플로우

컴퓨터의 데이터는 0과 1로 나뉘어져있으며, 이 크기는 1bit이다.

자료형을 보면 크기가 정해져있는데, 1byte는 8 bit(23)이다. 

1byte=

bit bit bit bit bit bit bit bit

값이 허용된 크기를 넘어가면서, 자료값이 손실되는 것을 오버플로우 라고 한다.

 

1byte 인 byte는 -128부터 127 까지를 저장 할 수있다.

만약 128을 byte에 저장하려고 한다면 오버플로우가 일어나 127 +1 = -128 의 값이 되는 것이다.

 

 

2. 형변환

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

 

자료형 a = (a의 자료형)b;

 

예를 들어 short b = 129 이 있다고 하자. 이를  다른 자료형의 변수로 바꿔본다.

byte a = (byte)b; -> -127 (오버플로우가 일어남)

int c = 129;

b = (short)c;  -> 129 (short형)

int d = (int)b; -> 129  (int형)

 

이렇게 다른 자료형으로 바꾸는 것을 형변환이라 하는데, 큰 자료형으로 변환 할 경우에는 값에 있는 자료형을 생략 할 수있다. 즉 int d = b 라고 사용해도 오류가 나지 않는다. 이는 컴파일러가 자동으로 형변환 해주기 때문이다.

 

문제가 되는 것은 작은 자료형으로 변환 할 때인데 이 경우 변환 될 자료형의 허용범위를 벗어날 경우 오버플로우가 일어나며, 이 때문에 작은 자료형으로 형변환 할 때는 반드시 값에 자료형을 명시해 주어야 한다.

 

이 뿐만아니라 실수를 정수로 형변환 할 시에는 소수점을 모두 버려 데이터의 자료값이 손실 되기에 이 역시 반드시 명시해주어야 한다.

float f = 12.60f

int i = (int)f -> 12(int형)

 

char의 경우 int로 형변환 하면 아스키 코드 값으로 변환된다. 정수와 계산하면 그 값으로 계산한다.

int g = 'a'; -> 97

int v = 'a' + 2;-> 99

 

3. 자료형이 다른 정수/ 실수의 계산

자료형이 다른 것 끼리 계산을 할 경우 큰자료형/ 실수형의 값으로 값이 출력된다.

즉 받아줄 변수의 자료형은 큰 자료형/실수로 지정해주어야한다. 다만 byte와 short값의 계산 결과는 무조건 int로 처리된다.

 

int a= 1;

double b = 1.0;

double result = a+b; ->2.0

 

이 경우 2라고 생각하고 받아줄 변수의 자료형을 int로 쓰면 에러가 난다.

 

이것을 억지로라도  작은자료형/정수 로 저장 하고 싶으면 형변환을 해주면된다.

int d = (int)(a+b);

int e = a +(int)b;