Javascript만 공부하다가 최근에 Java를 공부하고 있는데, 기존에 쓰던 언어는 많이 자유로워서 데이터 타입을 빡세게 잡지는 않아서 변수를 선언할 때 메모리에 대해서 생각을 안하고 리터럴의 크기가 어느정도인지 생각을 안하고 코드를 작성했었습니다.
Java를 공부하면서 느끼는 점이 내가 참 부족했었구나라는 생각이 들었다. 그래서 정리를 해보려고 합니다.
정수 자료형 (Data-Type) 정리
자료형 | 바이트 크기 | 수의 범위 |
byte | 1 | -2^7 ~ 2^7 -1 |
short | 2 | -2^15 ~ 2^15 -1 |
int | 4 | -2^31 ~ 2^31 -1 |
long | 8 | -2^63 ~ 2^63 -1 |
변수를 선언할 때 그 변수가 차지할 메모리의 크기를 지정해줘야합니다.
만약에 1바이트만 사용해도 될 변수인데, 4바이트,8바이트를 잡게 되면 메모리를 많이 잡아먹으니까 성능이 안좋아질 것입니다.
위의 표를 보고 저는 이 개념에 대해서 처음 배울 때는 왜 수의 범위가 저렇게 나오지? 라고 생각했습니다.
1 바이트(byte)는 8 비트(bit)입니다. 비트 1개당 경우의 수가 2개가 나올 수 있으므로 8바이트라는 것은 2^8 만큼의 경우의 수가 나올 수 있습니다.
그러면 byte 자료형은 2^8의 경우의 수 이므로 256까지 표현이 되어야 할 것같은데 수의 범위를 보니까 -128 ~ 127까지 사용이 가능합니다.
byte를 보면 최상위 비트에 부호 비트(MSB Most Significant Bit)가 존재합니다. 이것으로 음수, 양수를 계산하는 데 쓰이니까 저희가 사용할 수 있는 것은 7개의 비트만 있습니다. 그래서 -2^7 ~ 2^7 -1 의 수의 범위가 나옵니다.
여기에서 -1 이 나오는 이유는 0을 포함하기 때문에 그런 것입니다.
10진수로 나타내면 byte 자료형의 수의 범위는 -128 ~ ... 0 ... ~ 127 이런 식으로 나타납니다.
각 자료형(Data-Type)에 대한 사용처 및 쓰임새
byte, short
- byte: 1바이트 단위의 자료형, 동영상, 음악 파일, 실행 파일의 자료를 처리할 때 사용.
- short: 2바이트 단위의 자료형 C/C++ 언어와 호환 시 사용
int
- 자바에서 사용하는 정수에 대한 기본 자료형
- 4바이트 단위의 자료형
- 32비트를 초과하는 숫자는 long 자료형으로 처리
long
- 8바이트 자료형
- 숫자 뒤에 L(대문자) 또는 l(소문자L) 을 붙여서 long 형임을 표시함.
자바에서 정수 리터럴을 어떻게 처리할까??
위의 자료형은 변수의 자료형을 의미합니다. 변수에는 값을 대입을 시킬 수 있는데 여기에서 말하는 값은 리터럴이라고 합니다. 코드로 보실까요?
int a;
a = 1000; // 이곳에서 1000은 리터럴 입니다.
1000이라는 값 또한 메모리의 어딘가에 저장이 되어서 a라는 이름을 가진 공간에 복사해서 대입하는 것입니다.
그러면 1000이라는 숫자는 byte, short, int, long 중에 어느 것일까요??
자바에서는 항상 정수형 리터럴은 int형으로 계산해서 4바이트의 크기를 가지게 합니다. 정말 그런 것인지 확인하기 위해서 변수에 long 자료형에만 들어갈 법한 큰 숫자를 넣으면 에러가 나는 지 확인해보시면 됩니다.
long a;
a = 123456789000; // Error! The literal 123456789000 of type int is out of range
에러 내용을 보시면 이 숫자 리터럴은 int 범위를 벗어난다는 에러가 뜹니다. int 범위를 벗어났으니 숫자 리터럴을 long으로 하고 싶은데, 그럴려면 뒤에 영문자 L을 붙여주시면 됩니다. (소문자, 대문자 가능하지만 소문자 L은 1과 구분하기 힘들어서 대문자를 추천합니다.)
숫자 리터럴 뒤에 L 붙여서 long 타입으로 바꾸기
long a;
a = 123456789000L;
이렇게 하면 에러 안납니다 ㅎㅎ
long 자료형의 변수에 int 숫자 리터럴을 넣어도 될까?
8 바이트의 크기를 가지는 long 타입의 변수에 4바이트에 해당하는 숫자 리터럴을 넣어도 되는 지 의문이 들었습니다.
잘 작동합니다. 큰 공간에 작은 것이 들어가는 것은 문제가 없습니다.
다만, 작은 공간에 큰 값이 들어가는 것은 에러가 나네요 (Ex. int 자료형에 2^31 -1 보다 큰 값을 넣는 경우)
다음에는 실수가 프로그램에서 어떻게 표현되고 실수와 관련된 자료형을 정리해보겠습니다.
부족한 부분이나 개선해야할 내용이 있다면 언제든지 알려주시면 감사하겠습니다.
'자바' 카테고리의 다른 글
Java 데이터 타입 (실수형) (0) | 2022.11.26 |
---|