[자바 무료 강의] └ [심화] 형 변환 원리 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의└ [심화] 형 변환 원리최종수정일 2023-04-08
아이콘약 6분

자바 형 변환의 원리에 대해 배우는 강의입니다. 지금은 당장 필요 없을 수 있으나, 원리를 알면 이해를 더 잘할 수 있습니다. 만약에 형 변환에 대해 깊게 알고 싶다면 해당 강의를 들어보세요! 생각보다 큰 도움이 될 겁니다!

추가 노트

1. 형 변환 원리


1-1. 정수의 암시적 형 변환

image

정수의 암시적 형 변환은 byte 패딩을 붙이는 방식으로 형 변환을 합니다.


1-2. 정수의 명시적 형 변환

image

정수의 명시적 형 변환은 byte 패딩을 제거하는 방식으로 변환하기 때문에 데이터 손실이 발생합니다. 형 변환되는 자료형의 표현 범위를 벗어나는 데이터는 변조가 될 수 있습니다.


1-3. 접미사 L과 암시적 형 변환

image

기본적으로 접미사 L이 작성되지 않은 리터럴은 4 byte로 스택 메모리에 일시적으로 저장합니다. 그리고 long 형 변수에 저장될 때 byte 패팅을 붙여서 저장됩니다. 그러나 L 접미사가 작성되어 있는 리터럴은 8 byte로 스택 메모리에 일시적으로 저장 후 long 형 변수에 저장될 때 그대로 저장됩니다.

최종적으로 저장된 값은 동일합니다.


1-4. 접미사 F와 암시적 형 변환

image

기본적으로 접미사 F가 작성되지 않은 리터럴은 배정도(8 byte)로 스택 메모리에 일시적으로 저장합니다. 그리고 double 형 변수에 저장됩니다. 그러나 접미사 F가 작성된 리터럴은 단정도(4 byte)로 스택 메모리에 일시적으로 저장되었다가 배정도(8 byte)로 변환한 후 double 형 변수에 저장됩니다.

리터럴을 처음부터 배정도로 할 것인지, 단정도로 할 것인지에 따라 변환되는 데이터의 크기가 다르므로 최종적으로 저장되는 데이터의 정밀도가 달라집니다.

예시로 400x400 해상도 이미지를 만들어 1600x1600으로 늘리는 것과, 처음부터 1600x1600 해상도 이미지를 만드는 것과 화질 차이가 나는 것을 떠올려보면 쉽게 이해될 겁니다.


1-5. 정수에서 실수로 명시적 형 변환

image

부동소수점은 소수점이 떠다닌다라는 의미를 가지고 있습니다. 이러한 부동소수점에서 정수를 추출하는 방법은 다음과 같습니다.

  1. 지수부를 10진수로 변경하면 132이다.

  2. 132 - float bias(127) 를 계산하면 5이므로 이후에 이동시킬 소수점의 횟수는 5입니다.

  3. 가수부의 맨 앞에 1 bit를 추가합니다.

  4. 부동소수점을 맨 앞의 비트 뒤로 이동시킨다.

  5. 부동소수점을 다섯 칸 이동시킵니다.

  6. 소수점 앞에 있는 비트를 십진수로 변환하면 32입니다.

1-6. 연산시 형 변환

연산시 형 변환과 관련된 예시는 다음과 같습니다.

image

image

image

도전자 질문
아이콘우땅(2023-01-18 14:46 작성됨)
안녕하세요

1-6. 연산시 형변환에서

double = 12.0 의 이진수 표기가 틀린 것 같습니다.

처음에는

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001

로 되어있는데 밑에서는 

01000000 00101000 00000000 00000000 
00000000 00000000 00000000 00000000

로 되어있습니다.

직접 계산해보니까 밑에 작성한 이진수 표기가 맞는 것 같아서요..!
아이콘코드라떼(2023-04-08 15:28 작성됨)
안녕하세요. 코드라떼입니다 :)

해당사항을 확인 후, 그림을 다시 수정했습니다.

감사합니다 :)
아이콘양또띠(2021-12-12 19:24 작성됨)
안녕하세요.. 좀 허접한 질문일 수 있는데
byte -> short -> int -> long -> float -> double 이렇게 암시적 형변환이 일어난다고 배웠는데요

다른 건 다 이해가 되는데 long -> float은 어떻게 암시적 형변환이 가능한 건가요??
long은 8바이트 크기고 float은 4바이트인데.. float이 long만큼의 정수를 표현할 수 있나요?? 
아이콘코드라떼(2021-12-14 16:00 작성됨)
안녕하세요. 코드라떼입니다 :)

답변이 늦어져서 죄송합니다.

float나 double은 부동 소수점 방식으로 값을 저장하며 정수를 저장하는 방식과 다르게 공식에 의해서 계산되어 저장됩니다.
단순히 정수형으로 저장하는 방식으로 한다면 4byte 내에서 8byte 만큼의 정수를 표현할 수는 없습니다.
그래서 특정한 계산법으로 더 큰 값을 표현 가능하도록 만들어진 것이 부동 소수점입니다.
다만 이 과정에서 오차가 발생할 수 있습니다.

이 부분의 원리는 [심화] 정수와 실수 강의에서 설명되며 '단정도', '배정도' 방식으로 큰 값을 지정하여 계산해보면 어떤 원리인지 아실겁니다.
직접 42812932912932.0F를 손으로 계산해보시는 것도 도움이 되실 겁니다.

감사합니다.
아이콘우가우가(2021-11-28 15:26 작성됨)
안녕하세요!!

그러면 float 이나 long이나
f, l 이 붙으면 패딩바이트가 추가되는 것인가요?
아이콘코드라떼(2021-11-28 22:12 작성됨)
안녕하세요. 코드라떼입니다 :)

상황에 따라 다를듯합니다.

리터럴 심화 강의를 들으셨으면 'F'와 'L'의 의미가 무엇인지 아실 것으로 판단됩니다. 
F는 4 byte 실수형인지, L은 8 byte 정수형인지 판단하기 위해 붙는 접미사입니다.

만약에 변수가 double 자료형이고 리터럴에 'f' 접미사를 작성하는 경우 '단정도' 방식으로 계산 후 나머지 비트는 패딩바이트를 추가합니다.

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의└ [심화] 형 변환 원리최종수정일 2023-04-08
아이콘약 6분

자바 형 변환의 원리에 대해 배우는 강의입니다. 지금은 당장 필요 없을 수 있으나, 원리를 알면 이해를 더 잘할 수 있습니다. 만약에 형 변환에 대해 깊게 알고 싶다면 해당 강의를 들어보세요! 생각보다 큰 도움이 될 겁니다!

추가 노트

1. 형 변환 원리


1-1. 정수의 암시적 형 변환

image

정수의 암시적 형 변환은 byte 패딩을 붙이는 방식으로 형 변환을 합니다.


1-2. 정수의 명시적 형 변환

image

정수의 명시적 형 변환은 byte 패딩을 제거하는 방식으로 변환하기 때문에 데이터 손실이 발생합니다. 형 변환되는 자료형의 표현 범위를 벗어나는 데이터는 변조가 될 수 있습니다.


1-3. 접미사 L과 암시적 형 변환

image

기본적으로 접미사 L이 작성되지 않은 리터럴은 4 byte로 스택 메모리에 일시적으로 저장합니다. 그리고 long 형 변수에 저장될 때 byte 패팅을 붙여서 저장됩니다. 그러나 L 접미사가 작성되어 있는 리터럴은 8 byte로 스택 메모리에 일시적으로 저장 후 long 형 변수에 저장될 때 그대로 저장됩니다.

최종적으로 저장된 값은 동일합니다.


1-4. 접미사 F와 암시적 형 변환

image

기본적으로 접미사 F가 작성되지 않은 리터럴은 배정도(8 byte)로 스택 메모리에 일시적으로 저장합니다. 그리고 double 형 변수에 저장됩니다. 그러나 접미사 F가 작성된 리터럴은 단정도(4 byte)로 스택 메모리에 일시적으로 저장되었다가 배정도(8 byte)로 변환한 후 double 형 변수에 저장됩니다.

리터럴을 처음부터 배정도로 할 것인지, 단정도로 할 것인지에 따라 변환되는 데이터의 크기가 다르므로 최종적으로 저장되는 데이터의 정밀도가 달라집니다.

예시로 400x400 해상도 이미지를 만들어 1600x1600으로 늘리는 것과, 처음부터 1600x1600 해상도 이미지를 만드는 것과 화질 차이가 나는 것을 떠올려보면 쉽게 이해될 겁니다.


1-5. 정수에서 실수로 명시적 형 변환

image

부동소수점은 소수점이 떠다닌다라는 의미를 가지고 있습니다. 이러한 부동소수점에서 정수를 추출하는 방법은 다음과 같습니다.

  1. 지수부를 10진수로 변경하면 132이다.

  2. 132 - float bias(127) 를 계산하면 5이므로 이후에 이동시킬 소수점의 횟수는 5입니다.

  3. 가수부의 맨 앞에 1 bit를 추가합니다.

  4. 부동소수점을 맨 앞의 비트 뒤로 이동시킨다.

  5. 부동소수점을 다섯 칸 이동시킵니다.

  6. 소수점 앞에 있는 비트를 십진수로 변환하면 32입니다.

1-6. 연산시 형 변환

연산시 형 변환과 관련된 예시는 다음과 같습니다.

image

image

image

도전자 질문
아이콘우땅(2023-01-18 14:46 작성됨)
안녕하세요

1-6. 연산시 형변환에서

double = 12.0 의 이진수 표기가 틀린 것 같습니다.

처음에는

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001

로 되어있는데 밑에서는 

01000000 00101000 00000000 00000000 
00000000 00000000 00000000 00000000

로 되어있습니다.

직접 계산해보니까 밑에 작성한 이진수 표기가 맞는 것 같아서요..!
아이콘코드라떼(2023-04-08 15:28 작성됨)
안녕하세요. 코드라떼입니다 :)

해당사항을 확인 후, 그림을 다시 수정했습니다.

감사합니다 :)
아이콘양또띠(2021-12-12 19:24 작성됨)
안녕하세요.. 좀 허접한 질문일 수 있는데
byte -> short -> int -> long -> float -> double 이렇게 암시적 형변환이 일어난다고 배웠는데요

다른 건 다 이해가 되는데 long -> float은 어떻게 암시적 형변환이 가능한 건가요??
long은 8바이트 크기고 float은 4바이트인데.. float이 long만큼의 정수를 표현할 수 있나요?? 
아이콘코드라떼(2021-12-14 16:00 작성됨)
안녕하세요. 코드라떼입니다 :)

답변이 늦어져서 죄송합니다.

float나 double은 부동 소수점 방식으로 값을 저장하며 정수를 저장하는 방식과 다르게 공식에 의해서 계산되어 저장됩니다.
단순히 정수형으로 저장하는 방식으로 한다면 4byte 내에서 8byte 만큼의 정수를 표현할 수는 없습니다.
그래서 특정한 계산법으로 더 큰 값을 표현 가능하도록 만들어진 것이 부동 소수점입니다.
다만 이 과정에서 오차가 발생할 수 있습니다.

이 부분의 원리는 [심화] 정수와 실수 강의에서 설명되며 '단정도', '배정도' 방식으로 큰 값을 지정하여 계산해보면 어떤 원리인지 아실겁니다.
직접 42812932912932.0F를 손으로 계산해보시는 것도 도움이 되실 겁니다.

감사합니다.
아이콘우가우가(2021-11-28 15:26 작성됨)
안녕하세요!!

그러면 float 이나 long이나
f, l 이 붙으면 패딩바이트가 추가되는 것인가요?
아이콘코드라떼(2021-11-28 22:12 작성됨)
안녕하세요. 코드라떼입니다 :)

상황에 따라 다를듯합니다.

리터럴 심화 강의를 들으셨으면 'F'와 'L'의 의미가 무엇인지 아실 것으로 판단됩니다. 
F는 4 byte 실수형인지, L은 8 byte 정수형인지 판단하기 위해 붙는 접미사입니다.

만약에 변수가 double 자료형이고 리터럴에 'f' 접미사를 작성하는 경우 '단정도' 방식으로 계산 후 나머지 비트는 패딩바이트를 추가합니다.

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)