[[Java]] long으로 선언하고 123,456,789,123,456,789를 할당했는데 "Integer number too large" 라니요?

i-c-a-n-d-o·2024년 10월 7일
0

제대로 파는 얄코의 자바 강의를 듣다가, 이제까지 본 적 없는 이상한 코드를 발견했다.

//  ⭐ int의 범위를 벗어나는 수에는 리터럴에도 명시 필요
//  끝에 l 또는 L을 붙여 볼 것
long _8b_long1 = 123456789123456789;  
long _8b_long2 = 123_456_789_123_456_789L; 

🤔 What the "L"?

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형으로 저장하게 된다고 한다.


왜 굳이 기본값을 int로 저장할까 궁금해서 gpt에게 물어봤더니 2가지 이유가 있다고 한다. 아직 100% 이해는 못했지만, 나중에라도 다시 찾아보기 위해 같이 기록하고 넘어간다. 1. 성능 최적화: 대부분의 CPU가 32비트 정수를 빠르게 처리할 수 있다. 2. 메모리 절약: 많은 프로그램에서 int 크기(32비트)의 숫자로 충분하다.

+ 추가 내용

강의 후반부에 나온 추가 설명 덧붙이기

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를 많이 사용한다.


** 참고자료

[블로그] 3-2 접미사 L, F
[강의] 제대로 파는 자바 by 얄코

profile
나는 백엔드 개발자다!

0개의 댓글