변수와 리터럴의 타입 불일치

홍제섭·2022년 6월 10일
0

JAVA 공부를 하다 리터럴의 타입과 접미사 부분에서 막혔다.

저장범위에 따라서

범위가 '변수(그릇) > 리터럴(물건)' 인 경우, ok
int i = 'A'; // int > char
long l = 123; // long > int
double d = 3.14f; // double > float

범위가 '변수 < 리터럴'인 경우, 에러
int i = 30_0000_0000; // int의 범위 (±20억) 벗어남
long l = 3.14f; // long < float
float f = 3.14d; (d는 생략 가능) // float < double

byte, short 변수에 int리터럴 저장가능
(단, 변수의 타입의 범위 이내이어야 함)
byte b = 100; // OK. byte의 범위(-128 ~ 127)에 속함
byte c = 129; // 에러. byte의 범위를 벗어남

이라고 하는데 이게 뭔 소리인지 갑갑해 변수별로 저장범위에 대해 공부해보았다.

아 그러니까

int i = 'A'; // int > char
integer 타입의 변수 i에 문자'A'가 저장되는 것이 아니라, 문자 'A'의 문자코드인 65가 변수 i에 저장되니 OK

long l = 123; // long > int
이 문장은 integer타입의 리터럴을 더 넓은 범위인 long타입 변수에 저장하니 ㅇㅋ

double d = 3.14f; // double > float
float타입의 값을 더 범위가 넓은 double타입의 변수에 저장하는 것이기 때문에 ㅇㅋ

라서 위에 껀 OK 인거구,

int i = 30_0000_0000(long임); // int의 범위 (±20억) 벗어남
변수 i가 int타입인데, int타입의 최대값인 20억이 넘는 값을 저장하려고 하기때문에 에러가 발생함

long l = 3.14f; // long < float
괜찮을 것 같지만
8바이트 < 4바이트니까 괜찮을 것 같지만 실수형은 정수형보다 저장범위가 훨씬 넓기 때문에 에러가 발생함

float f = 3.14d; (d는 생략 가능) // float < double
double타입의 값을 float타입의 변수에 저장하려는 것이기 때문에 에러발생함

변수의 범위 크기 차이로 더 작은 범위의 리터럴을 담을 수 있는 게 엄청 신기방기쓰

profile
보여주고 증명하며 사는 삶.

0개의 댓글