자바의 형 변환에 대해서 알아봅시다. 자바의 형 변환은 암시적 형변환과 명시적 형 변환이 있는데요. 변수의 메모리 공간이 한정되어 있기 때문에 리터럴 값이 변수에 저장될 때 특정한 상황에서는 형 변환이 발생합니다. 그럼 자바의 형 변환에 대해서 알아봅시다.
ㅤ
형 변환은 기존의 자료형에서 다른 자료형으로 변환하는 것을 형 변환이라고 합니다.
byte a = 32;
// 1 byte로 저장된 값을 2 byte로 변환
short b = a;
이러한 형 변환에는 암시적 형 변환(Implicit Conversion)과 명시적 형 변환(Explicit Conversion)이 있습니다.
ㅤ
암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다.
정수의 암시적 형 변환
byte a = 32;
// 1 byte로 저장된 값을 2 byte로 변환
short b = a;
// 2 byte로 저장된 값을 4 byte로 변환
int c = b;
// 4 byte로 저장된 값을 8 byte로 변환
long d = c;
더 큰 범위의 자료형으로 변환하기 때문에 표현할 수 있는 값의 범위에 대한 제약이 없습니다.
실수의 암시적 형 변환
float a = 1.12F;
// 단정도(4byte)로 저장된 부동소수점을 배정도(8 byte)로 변환
double b = a;
자료형과 암시적 형 변환의 규칙
암시적 형 변환은 메모리 공간 크기를 기준으로 변환하지 않고 값의 표현 범위를 기준으로 변환됩니다. 정수만 표현할 수 있는 것 보단 정수와 실수를 둘다 표현 가능 한 것이 값의 표현 범위가 더 넓습니다.
그리고 실제로 단정도(4 byte) float는 int (4 byte) 보다 더 큰 정수를 표현할 수 있습니다.
ㅤ
암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다. 명시적 형 변환은 데이터의 손실이 발생할 수 있다는 것을 인지하고 형 변환을 한다고 명시하는 것이기 때문에 명시적 형 변환이라고 합니다. 예시로 8 byte로 표현되는 1000억의 리터럴 값이 4 byte로 표현을 하려고 하면 데이터의 변질이 발생합니다.
명시적 형 변환 구문
[자료형] [변수명] = (자료형) [변수명 또는 리터럴];
int a = (int) 100000000000L;
long b = 1000;
int a = (int) b;
정수의 명시적 형 변환
long a = 100000;
// 8 byte로 저장된 값을 4 byte로 변환
// 다만 100000은 4 byte로 표현이 가능하기 때문에 손실이 없음
int b = (int) a;
// 4 byte로 저장된 값을 2 byte로 변환
// 다만 100000은 2 byte로 표현할 수 없기 때문에 데이터 손실 및 변질
short c = (short) b;
실수의 명시적 형 변환
double a = 1.42;
// 배정도(8byte)로 저장된 부동소수점을 단정도(4 byte)로 변환
float b = (float)a;
정수에서 실수로 명시적 형 변환
float a = 32.123F;
// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;
// 변수 b에 실제로 저장된 값 : 32
정수에서 실수로 명시적 형 변환을 할 경우 int로 표현할 수 있는 정수의 범위를 넘지 않는 이상 일반적으론 정수부만 추출합니다. 그러나 표현할 수 있는 정수의 범위를 넘으면 데이터가 변질됩니다.
정수에서 실수로 명시적 형 변환(변질)
float a = 10000000000.0F;
// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;
// 변수 b에 실제로 저장된 값 : 2147483647
a 변수는 int로 표현할 수 있는 정수의 값의 범위를 넘었기 때문에 int로 표현할 수 있는 최대 값인 2147483647를 저장합니다. 그러므로 데이터가 변질될 수 있을 가능성을 염두에 두어야 합니다.
ㅤ
연산 과정에서도 형 변환이 발생할 수 있습니다.
기본적으로 정수형 끼리의 산술 연산은 4 byte로 암시적 형 변환을 한 후 계산을 합니다.
정수와 실수의 산술 연산은 실수형으로 암시적 형 변환을 합니다. 실수의 값의 표현 범위가 더 넓기 때문입니다.
ㅤ
실습도구에 해당 코드를 작성해 봅시다
ㅤ
ㅤ
코드 작성
byte byteNum = 32;
short shortNum = byteNum;
System.out.println(shortNum);
출력
32
ㅤ
코드 작성
short shortNum = 10000;
int intNum = shortNum;
System.out.println(intNum);
출력
10000
ㅤ
코드 작성
short shortNum = 10000;
long longNum = shortNum;
System.out.println(longNum);
출력
10000
ㅤ
코드 작성
int intNum = 26;
double doubleNum = intNum;
System.out.println(doubleNum);
출력
26.0
ㅤ
ㅤ
코드 작성
long longNum = 12345678;
int intNum = (int)longNum;
System.out.println(intNum);
출력
12345678
ㅤ
코드 작성
long longNum = 10000000000L;
int intNum = (int)longNum;
System.out.println(intNum);
출력
1410065408
ㅤ
ㅤ
코드 작성
float floatNum = 10.321F;
double doubleNum = floatNum;
System.out.println(doubleNum);
출력
10.321000099182129
ㅤ
ㅤ
코드 작성
double doubleNum = 32.1234567891234;
float floatNum = (float)doubleNum;
System.out.println(floatNum);
출력
32.123455
ㅤ
코드 작성
float floatNum = 32.1234F;
int intNum = (int)floatNum;
System.out.println(intNum);
출력
32
ㅤ
코드 작성
float floatNum = 3212312312.0F;
int intNum = (int)floatNum;
System.out.println(intNum);
출력
2147483647
강의에서 나온 구문에 대해 제가 이해한 것이 맞는지 질문드립니다. byte a = 32; short b = (short)a; -> "주기억장치에 byte 자료형으로 a라는 저장공간을 할당하고, 여기에 32라는 리터럴을 복사하여 저장한다.", 그 다음 "주기억장치에 short 자료형으로 b라는 저장공간을 할당하고, 여기에 a라는 변수에 저장된 값인 32를 short 자료형으로 변환하여 저장한다." 라는 의미로 생각하면 될까요? 궁금합니다.
안녕하세요. 코드라떼입니다 :) 생각하신 것이 맞습니다. 주기억장치라는 물리적인 장치로 생각한다면 변수로 할당되는 것은 주기억장치에 '일시적'으로 저장됩니다. 좀 더 깊게 알고 싶다면 계속 강의를 들으시고 '메모리 모델' 강의를 들으시면 좀 더 이해가 되실 것으로 생각됩니다 :) 감사합니다.
1) int intNum = 26; double doubleNum = intNum; System.out.println(doubleNum); -> 26.0 26.000000000(0갯수 몇개까지 나오는지는 잘 모르겠어요 😅) 이런식으로 나와야 하는거 아닌가요? 왜 0하나만 나오는지 궁금합니다! 소수부를 표현할 수 있다는 것만 보여주면 되는건가요? 😅😅 2) long longNum = 10000000000L; int intNum = (int)longNum; System.out.println(intNum); ->1410065408 왜 이런수가 나오는건가요?? int로 표현할 수 있는 최대값이 2147483647이니까 요거 출력되면 되는거라고 생각했어요 😅😅 3) float floatNum = 10.321F; double doubleNum = floatNum; System.out.println(doubleNum); -> 10.321000099182129 출력값이 왜 10.321000000000이런식으로 나오지 않는지 궁금합니다. 답변 부탁드립니다 라떼님!!! 🙏👀🙏🙏🙏
안녕하세요. 코드라떼입니다 :) 질문 1과 관련하여 답변드리면 단순히 System.out.println을 통해 출력하는 경우 소수점이 0으로만 되어 있는 경우 소수 몇 째자리까지만 보여줍니다 :) 질문 2와 관련하여 답변드리면 int는 약 21억까지의 값을 저장할 수 있는 32비트로 구성되어 있는데 64비트에서 32비트의 하향 형변환의 경우 앞에 있는 비트를 잘라내는 형식으로 강제 형 변환하므로 최댓값인 2147483647로 표기되는 것이 아니라 단순히 앞의 32비트를 잘라낸 나머지 32비트를 정수로 표현합니다. 질문 3과 관련하여 답변드리면 [심화] 정수와 실수의 강의에서 실수를 계산하기 위한 과정이 작성되어 있습니다. 단정도에서 배정도로 변환될 때 0비트 패딩을 붙이는데 0비트 패딩을 붙인 후 정수로 변환 후 실수로 변환 후 계산된 값이 뒤의 '99182129'가 붙을 경우이기 때문입니다. 10.321을 float로 저장 후 double로 암시적 형 변환된 비트로 표현해 드리면 다음과 같습니다. 32bit : 0 10000010 01001010010001011010001 64bit : 0 10000000010 0100101001000101101000100000000000000000000000000000 이 값을 부동소수점 데이터를 실수로 변환하는 법을 참고해서 계산해보세요 :) 감사합니다.
1분 45초에 실수형 명시적 형 변환 double a = 1.42; float b = (double)a; 라고 되어있는데요 괄호 안에 있는 자료형 float가 아닌 double이 맞는건가요? 아니면 오타인가요?
안녕하세요. 코드라떼입니다 :) 영상에서 double에서 float로의 형 변환 오타가 맞습니다. double a = 1.42; float b = (float)a; 맞습니다. 혼동을 드려 죄송합니다. 감사합니다.
형 변환 중에 byte > char로 변환이 불가능한 부분에 대해 언급하면 더 좋을 것 같습니다. char은 음수값을 저장할 수 없기에, byte a = -50; char b = a; 위와 같은 코드를 컴파일하면 에러가 발생합니다.
안녕하세요. 코드라떼입니다 :) 설명이 부족한 부분을 확인했습니다. 감사합니다 :)
강의 45초 정도에 명시적 형변환 영어 표기 변경 필요합니다
안녕하세요. 코드라떼입니다. 영상을 확인했습니다. 수정해서 다시 올리겠습니다. 확인해 주셔서 감사합니다^^ --------- 2021-06-25일 자로 수정되었습니다.
자바의 형 변환에 대해서 알아봅시다. 자바의 형 변환은 암시적 형변환과 명시적 형 변환이 있는데요. 변수의 메모리 공간이 한정되어 있기 때문에 리터럴 값이 변수에 저장될 때 특정한 상황에서는 형 변환이 발생합니다. 그럼 자바의 형 변환에 대해서 알아봅시다.
ㅤ
형 변환은 기존의 자료형에서 다른 자료형으로 변환하는 것을 형 변환이라고 합니다.
byte a = 32;
// 1 byte로 저장된 값을 2 byte로 변환
short b = a;
이러한 형 변환에는 암시적 형 변환(Implicit Conversion)과 명시적 형 변환(Explicit Conversion)이 있습니다.
ㅤ
암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다.
정수의 암시적 형 변환
byte a = 32;
// 1 byte로 저장된 값을 2 byte로 변환
short b = a;
// 2 byte로 저장된 값을 4 byte로 변환
int c = b;
// 4 byte로 저장된 값을 8 byte로 변환
long d = c;
더 큰 범위의 자료형으로 변환하기 때문에 표현할 수 있는 값의 범위에 대한 제약이 없습니다.
실수의 암시적 형 변환
float a = 1.12F;
// 단정도(4byte)로 저장된 부동소수점을 배정도(8 byte)로 변환
double b = a;
자료형과 암시적 형 변환의 규칙
암시적 형 변환은 메모리 공간 크기를 기준으로 변환하지 않고 값의 표현 범위를 기준으로 변환됩니다. 정수만 표현할 수 있는 것 보단 정수와 실수를 둘다 표현 가능 한 것이 값의 표현 범위가 더 넓습니다.
그리고 실제로 단정도(4 byte) float는 int (4 byte) 보다 더 큰 정수를 표현할 수 있습니다.
ㅤ
암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다. 명시적 형 변환은 데이터의 손실이 발생할 수 있다는 것을 인지하고 형 변환을 한다고 명시하는 것이기 때문에 명시적 형 변환이라고 합니다. 예시로 8 byte로 표현되는 1000억의 리터럴 값이 4 byte로 표현을 하려고 하면 데이터의 변질이 발생합니다.
명시적 형 변환 구문
[자료형] [변수명] = (자료형) [변수명 또는 리터럴];
int a = (int) 100000000000L;
long b = 1000;
int a = (int) b;
정수의 명시적 형 변환
long a = 100000;
// 8 byte로 저장된 값을 4 byte로 변환
// 다만 100000은 4 byte로 표현이 가능하기 때문에 손실이 없음
int b = (int) a;
// 4 byte로 저장된 값을 2 byte로 변환
// 다만 100000은 2 byte로 표현할 수 없기 때문에 데이터 손실 및 변질
short c = (short) b;
실수의 명시적 형 변환
double a = 1.42;
// 배정도(8byte)로 저장된 부동소수점을 단정도(4 byte)로 변환
float b = (float)a;
정수에서 실수로 명시적 형 변환
float a = 32.123F;
// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;
// 변수 b에 실제로 저장된 값 : 32
정수에서 실수로 명시적 형 변환을 할 경우 int로 표현할 수 있는 정수의 범위를 넘지 않는 이상 일반적으론 정수부만 추출합니다. 그러나 표현할 수 있는 정수의 범위를 넘으면 데이터가 변질됩니다.
정수에서 실수로 명시적 형 변환(변질)
float a = 10000000000.0F;
// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;
// 변수 b에 실제로 저장된 값 : 2147483647
a 변수는 int로 표현할 수 있는 정수의 값의 범위를 넘었기 때문에 int로 표현할 수 있는 최대 값인 2147483647를 저장합니다. 그러므로 데이터가 변질될 수 있을 가능성을 염두에 두어야 합니다.
ㅤ
연산 과정에서도 형 변환이 발생할 수 있습니다.
기본적으로 정수형 끼리의 산술 연산은 4 byte로 암시적 형 변환을 한 후 계산을 합니다.
정수와 실수의 산술 연산은 실수형으로 암시적 형 변환을 합니다. 실수의 값의 표현 범위가 더 넓기 때문입니다.
ㅤ
실습도구에 해당 코드를 작성해 봅시다
ㅤ
ㅤ
코드 작성
byte byteNum = 32;
short shortNum = byteNum;
System.out.println(shortNum);
출력
32
ㅤ
코드 작성
short shortNum = 10000;
int intNum = shortNum;
System.out.println(intNum);
출력
10000
ㅤ
코드 작성
short shortNum = 10000;
long longNum = shortNum;
System.out.println(longNum);
출력
10000
ㅤ
코드 작성
int intNum = 26;
double doubleNum = intNum;
System.out.println(doubleNum);
출력
26.0
ㅤ
ㅤ
코드 작성
long longNum = 12345678;
int intNum = (int)longNum;
System.out.println(intNum);
출력
12345678
ㅤ
코드 작성
long longNum = 10000000000L;
int intNum = (int)longNum;
System.out.println(intNum);
출력
1410065408
ㅤ
ㅤ
코드 작성
float floatNum = 10.321F;
double doubleNum = floatNum;
System.out.println(doubleNum);
출력
10.321000099182129
ㅤ
ㅤ
코드 작성
double doubleNum = 32.1234567891234;
float floatNum = (float)doubleNum;
System.out.println(floatNum);
출력
32.123455
ㅤ
코드 작성
float floatNum = 32.1234F;
int intNum = (int)floatNum;
System.out.println(intNum);
출력
32
ㅤ
코드 작성
float floatNum = 3212312312.0F;
int intNum = (int)floatNum;
System.out.println(intNum);
출력
2147483647
강의에서 나온 구문에 대해 제가 이해한 것이 맞는지 질문드립니다. byte a = 32; short b = (short)a; -> "주기억장치에 byte 자료형으로 a라는 저장공간을 할당하고, 여기에 32라는 리터럴을 복사하여 저장한다.", 그 다음 "주기억장치에 short 자료형으로 b라는 저장공간을 할당하고, 여기에 a라는 변수에 저장된 값인 32를 short 자료형으로 변환하여 저장한다." 라는 의미로 생각하면 될까요? 궁금합니다.
안녕하세요. 코드라떼입니다 :) 생각하신 것이 맞습니다. 주기억장치라는 물리적인 장치로 생각한다면 변수로 할당되는 것은 주기억장치에 '일시적'으로 저장됩니다. 좀 더 깊게 알고 싶다면 계속 강의를 들으시고 '메모리 모델' 강의를 들으시면 좀 더 이해가 되실 것으로 생각됩니다 :) 감사합니다.
1) int intNum = 26; double doubleNum = intNum; System.out.println(doubleNum); -> 26.0 26.000000000(0갯수 몇개까지 나오는지는 잘 모르겠어요 😅) 이런식으로 나와야 하는거 아닌가요? 왜 0하나만 나오는지 궁금합니다! 소수부를 표현할 수 있다는 것만 보여주면 되는건가요? 😅😅 2) long longNum = 10000000000L; int intNum = (int)longNum; System.out.println(intNum); ->1410065408 왜 이런수가 나오는건가요?? int로 표현할 수 있는 최대값이 2147483647이니까 요거 출력되면 되는거라고 생각했어요 😅😅 3) float floatNum = 10.321F; double doubleNum = floatNum; System.out.println(doubleNum); -> 10.321000099182129 출력값이 왜 10.321000000000이런식으로 나오지 않는지 궁금합니다. 답변 부탁드립니다 라떼님!!! 🙏👀🙏🙏🙏
안녕하세요. 코드라떼입니다 :) 질문 1과 관련하여 답변드리면 단순히 System.out.println을 통해 출력하는 경우 소수점이 0으로만 되어 있는 경우 소수 몇 째자리까지만 보여줍니다 :) 질문 2와 관련하여 답변드리면 int는 약 21억까지의 값을 저장할 수 있는 32비트로 구성되어 있는데 64비트에서 32비트의 하향 형변환의 경우 앞에 있는 비트를 잘라내는 형식으로 강제 형 변환하므로 최댓값인 2147483647로 표기되는 것이 아니라 단순히 앞의 32비트를 잘라낸 나머지 32비트를 정수로 표현합니다. 질문 3과 관련하여 답변드리면 [심화] 정수와 실수의 강의에서 실수를 계산하기 위한 과정이 작성되어 있습니다. 단정도에서 배정도로 변환될 때 0비트 패딩을 붙이는데 0비트 패딩을 붙인 후 정수로 변환 후 실수로 변환 후 계산된 값이 뒤의 '99182129'가 붙을 경우이기 때문입니다. 10.321을 float로 저장 후 double로 암시적 형 변환된 비트로 표현해 드리면 다음과 같습니다. 32bit : 0 10000010 01001010010001011010001 64bit : 0 10000000010 0100101001000101101000100000000000000000000000000000 이 값을 부동소수점 데이터를 실수로 변환하는 법을 참고해서 계산해보세요 :) 감사합니다.
1분 45초에 실수형 명시적 형 변환 double a = 1.42; float b = (double)a; 라고 되어있는데요 괄호 안에 있는 자료형 float가 아닌 double이 맞는건가요? 아니면 오타인가요?
안녕하세요. 코드라떼입니다 :) 영상에서 double에서 float로의 형 변환 오타가 맞습니다. double a = 1.42; float b = (float)a; 맞습니다. 혼동을 드려 죄송합니다. 감사합니다.
형 변환 중에 byte > char로 변환이 불가능한 부분에 대해 언급하면 더 좋을 것 같습니다. char은 음수값을 저장할 수 없기에, byte a = -50; char b = a; 위와 같은 코드를 컴파일하면 에러가 발생합니다.
안녕하세요. 코드라떼입니다 :) 설명이 부족한 부분을 확인했습니다. 감사합니다 :)
강의 45초 정도에 명시적 형변환 영어 표기 변경 필요합니다
안녕하세요. 코드라떼입니다. 영상을 확인했습니다. 수정해서 다시 올리겠습니다. 확인해 주셔서 감사합니다^^ --------- 2021-06-25일 자로 수정되었습니다.