새소식

java/java 필기

리터럴과 접미사 그리고 형변환

  • -

 

 

1. 리터럴과  접미사 L / F

 

문자열 리터럴을 제외한 byte / short / int / long / double / boolean / char 등의 리터럴은

'스택'에 일시적으로 적재되었다가 '변수'라는 메모리 공간으로 저장된다.

 

보통 21억이 넘어가는 매우 큰 수가 아닌 이상 4byte 크기의 공간에 적재되며, 그보다 큰 수는 8byte 공간을 사용하는데

이때 JVM에 8byte의 공간을 사용한다고 알리기 위해 접미사 L을 사용한다.

추가적으로 실수는 기본적으로 8byte 공간에 적재되며, 접미사 F를 사용하여 JVM에다 4byte의 공간을 사용하는 실수라고 알릴 수 있다.

 

ex)

(32.1531894726 != 32.1531894726F)

=> 실수형(8byte)과 Float 실수형(4byte) 으로 

저장할 수 있는 공간의 차이로 인해 두 수의 근사값이 다르기 때문에 다른 수가 되는 것이다

 

 

2. 형변환

 

형변환에 있어서 더 큰 자료형으로 바꿀땐 암시적 형변환을 사용하며

더 작은 자료형으로 바꿀땐 명시적 형변환을 사용해야 한다.

추가 사항으로 암시적 형변환은 값의 표현 범위를 기준으로 변환되며, 명시적 형변환시에는 값의 손실이 일어날 수 가 있다.

 

ex)

1000억의 리터럴 값 (8byte 사용)을 4byte의 값으로 표현 시 값이 변하게 된다.

4byte인 int 형으로 변경 시 전혀 다른 값(1410065408)이 된다.

 

정수의 형변환에서 큰 자료형으로의 형변환을 할 땐 자료형끼리의 크기 차이 만큼의 패딩 바이트를 붙이며,

작은 자료형으로 바꿀땐 바이트가 제거되는 만큼 줄어든 바이트에 존재하는 값들이 손실 될 수가 있다.

 

long 에서 float으로 변환하는 경우에는

float / double 이 부동소수점 방식으로 값을 저장하며, 정수 저장 방식과 다르게 특정한 공식에 의해 계산되어 저장되는데

이 과정에서 오차가 발생할 수 있다.

 그리고 long 형의 경우 8byte이지만, float의 경우는 4byte인데 

long 형보다 float 형이 더 큰 타입이다.

이는 메모리설계가 정수 타입보다 실수 타입이 더 크게 되어있고 그로 인해 float 타입이 더 많은 수를 표현할 수 있기 때문이다.

 

ex)

263을 이진수 부동소수점 방식으로 표현한다면

1. 2진수화 => 100000111.000~

2. 소수점을 맨 앞의 1 바로 뒤로 옮김 => 1.00000111000~

3. 맨앞의 1 제거 => 00000111000~

4. 양수이므로 부호 비트 1

5. 소수점 옮긴 자리 수 + 127 => 8 + 127 = 135

6. 최종 지수 비트는 10000111 이 된다. (소수가 아니기에 가수 비트는 생략했습니다.)
 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.