제대로 파는 얄코의 자바 강의를 듣다가, 이제까지 본 적 없는 이상한 코드를 발견했다.
// ⭐ int의 범위를 벗어나는 수에는 리터럴에도 명시 필요
// 끝에 l 또는 L을 붙여 볼 것
long _8b_long1 = 123456789123456789;
long _8b_long2 = 123_456_789_123_456_789L;
Java7부터는 가독성을 위해 long _8b_long2 처럼 숫자 사이에 언더바를 사용할 수 있다.
자바의 정수 자료형에는 4가지가 있다.
1. byte (1바이트)
2. short (2바이트)
3. int (4바이트)
4. long (8바이트)
long으로 _8b_long1
변수를 선언 및 초기화했으니까,
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 까지
저장이 가능할 것이라 예상했지만
위 스크린샷처럼 "Integer number too large" 라는 컴파일 오류가 떴다.?
강의에서는 long 자료형에 값을 대입할 때는 리터럴(값) 뒤에 소문자나 대문자 L을 붙여야
long으로 인식한다고 짧게 설명하고 넘어가길래, 왜 L을 별도로 붙여야하나 궁금해서 찾아봤다.
Java는 기본적으로 모든 정수를 int형으로 나타낸다.
Java는 값을 변수에 저장하기 전에, 값을 먼저 메모리에 저장한다. 이때 저장하는 형태가 무조건 int형으로 되어있다. 이 때, 값 맨 뒤에 대문자 L을 붙여주면, Java가 int형이 아닌 long형으로 저장하게 된다고 한다.
강의 후반부에 나온 추가 설명 덧붙이기
byte b1 = 1;
byte b2 = 2;
short s1 = 1;
short s2 = 2;
// ⚠️ 아래는 모두 불가
byte b3 = b1 + b2;
short s3 = b1 + b2;
short s4 = b1 + s2;
short s5 = s1 + s2;
// ⭐ byte와 short의 연산들은 int 반환
// 그냥 int를 많이 쓰는 이유 중 하나
int i1 = b1 + b2;
int i2 = s1 + s2;
int i3 = b1 + s1;
long l1 = 1;
long l2 = 2;
// long끼리의 연산은 long 반환
long l3 = l1 + l2;
b1 + b2의 결과를 byte에 넣을 수 없고, byte보다 큰 자료형인 short에도 넣을 수 없다.
byte와 short의 연산 결과들은 결과값으로 int를 반환하기 때문이다.
메모리를 크~게 절약해야 할 상황이 아닌 이상 int를 많이 사용한다.
** 참고자료