위의 그림은 자바에서의 데이터 타입을 요약한 이미지입니다. 제가 이 항목에서 다루고 싶은 건 2가지입니다.
첫 번째는 기본형과 참조형을 나누는 기준이고, 두 번째는 자료형들에 따라 담을 수 있는 크기를 넘어서서 생기는 “Overflow”현상입니다.
1. 기본형과 참조형
결론적으로 말하자면 기본형과 참조형을 나누는 기준은 히프(Heap)의 유무입니다.
출처: https://lucas-owner.tistory.com/38
기본형은 “Stack”영역에 변수명과 변수값이 직접 그대로 담기지만
참조형은 “Stack”영역에 변수명이 담기고 변수 값은 “Heap”영역에 담김니다. 그럼 “Stack”영역에 변수 값이 담겨할 곳에는 뭐가 있을까요?
정답은 “Heap”에 담긴 변수 값의 주소가 적혀있습니다. 그래서 써야될 때면 “Heap”영역의 주소를 참조해서 쓰기때문에 “참조”형이라는 이름이 붙었습니다.
2. Overflow현상
public class Main {
public static void main(String[] args) {
int x = 1000000;
int y = 1000000;
int mul1 = x * y;
long mul2 = (long)x * (long)y;
System.out.println(mul1); //-727379968
System.out.println(mul2); //1000000000000
}
}
“int”가 담을 수 있는 데이터의 크기는 4byte(-2,147,483,648 ~ 2,147,483,647)이고
“long”이 담을 수 있는 데이터의 크기는 8byte(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)입니다.
1000000 * 1000000 = 1000000000000입니다. 여기서 주목해야할 건 1000000000000는 “int”의 그릇인 4 byte를 초과합니다. 그래서 mul1은 값이 초과해서 데이터가 깨져버렸습니다.(-727379968)
이러한 현상을 “Overflow”라고 합니다.
값을 온전히 보전하기 위해서는 더 큰 그릇인 “long”으로 담아서 출력해주면 됩니다.
데이터 저장 공간이 하나하나 소중한 임베디드 분야에서는 엄격하고 정확한 데이터 타입 선택이 필요하지만 그 외의 분야에서는 그렇게 신경쓰지 않아도 되지 않을까 싶습니다.