※ 리터럴은 데이터값을 의미한다.
long 타입으로 변수를 선언하고 값을 초기화 할 때에는
반드시 리터럴 뒤에 소문자나 대문자 L 을 붙여주어야 한다.
long 타입의 변수 lo 를 선언하고 정수의 데이터값 2147483648 을 초기화했다.
그런데 에러가 발생한다.
마우스를 올려보면 The literal 2147483648 of type int is out of range 라는 에러 메시지박스가 뜬다.
해석하면 '2147483648 이라는 데이터값은 int 타입의 허용범위를 초과했다' 라는 의미이다.
분명 long 타입으로 선언했는데 왜 이런 에러가 뜨는것일까?
이유는,
2147483648 이라는 값은 변수 lo 에 저장하기 전에 임시로 메모리에 저장되는데
이때 임시로 저장하기 위해 사용하는 기본 데이터 타입이 int 라서이다.
int 타입이 수용할수 있는 범위는 2147483647 까지 이기 때문에
허용범위를 초과하는 리터럴은 임시로 저장하는 과정에서 에러가 나는 것이다.
이것을 해결하려면 아래와 같이 리터럴 끝에 소문자나 대문자 L 을 붙여주면된다.
에러가 사라진 것을 확인 할 수 있다.
float 도 비슷한 맥락의 이유로 에러가 난다.
float 의 데이터값을 변수에 저장하기 전에 이 값을 메모리에 임시로 저장하는데,
이때 저장되는 타입이 double 이다.
아래의 예시를 보자.
'Type mismatch: cannot convert from double to float' 이 에러메시지를 해석하면
'유형 불일치 : double을 float로 변환 할 수 없습니다' 라는 의미이다.
double은 8byte의 데이터타입이고, float 은 4byte 의 데이터타입이다.
1199.80 이라는 수는 8바이트의 double 타입으로 임시 저장되는데, double 타입으로 임시저장된 리터럴을
4byte 의 좁은 float 타입의 변수에 옮겨 담으려니 공간이 좁아 저장할 수가 없어 에러가 나는것이다.
( 쉽게 이해하자면, 2L 병에 가득 담긴 물을 500ML 짜리 병에 모두 옮겨 담을 수는 없을것이다 )
이것을 해결하려면 아래와 같이 리터럴 끝에 소문자나 대문자 F 를 붙여주면된다.
에러가 사라진 것을 확인할 수 있다.
'Java > Standard' 카테고리의 다른 글
Scanner.nextInt() / nextLine() 오류 : 두가지 해결방법 (0) | 2020.06.19 |
---|---|
반복문 : while 과 do~while (0) | 2020.06.18 |
반복문 완전 기초 이해하기 : for문 (0) | 2020.06.18 |
2진수,8진수,16진수의 모든것 (17) | 2020.06.16 |
& 와 && 의 차이점과 활용예시 (5) | 2020.06.16 |