저료형의 변환
자료형의 변환이란? '데이터의 표현 방식을 바꾸는 것' 이라고 할 수 있다.
자료형의 변환에는 자동 형 변환과 강제 형 변환이 있는데
자동 형 변환의 경우 '묵시적 형병환'이라 하고, 강제 형 변환의 경우 '명시적 형 변환'이라고 한다.
ㆍ 자동 형 변환(묵시적 형 변환) - 대입 연산의 전달 과정. (A=B)
묵시적 형 변환이란? 침묵의 '묵'자와 비슷한 것 같다. 말 그대로 조용히 변환된다는 뜻이다.
대입 연산자(=)의 두 피연산자의 자료형이 일치하지 않으면, 왼편에 있는 피연산자를 대상으로 형 변환이 자동으로 일어남
(저장소의 자료형에 맞춰 형 변환 => 값의 저장 가능)
정수 -> 실수(double 형) // 데이터 손실은 없지만 오차가 존재
실수 -> 정수(int 형) // 소수부 손실 (데이터 손실)
컴퓨터 측은 '데이터 손실'을 극도로 극혐하기 때문에 오차가 존재하더라도 데이터 손실이 되지않는 방향으로 진행한다.
큰 바이트의 정수 -> 작은 바이트의 정수(int -> char) // 변환 하고자 하는 정수의 바이트 크기에 맞춰
상위 바이트를 소멸시킨다. 즉, 부호가 바뀔 수 있다.
ex) int num3 = 129;
char ch = num3;
=> int형 num3이 char인 ch에 저장됨
char은 127까지 표현한다.
그렇기에 129가 들어가면 -127로 표현된다.
"129와 -127이 같냐?"
아래는 1의 보수법을 취해 음수를 양수로 변환한 것이다.
딱 맞는 것이 이해가는가?
ㆍ 자동 형 변환(묵시적 형 변환) - 정수의 승격 (Integral Promotion)
일반적으로 CPU는 int형 정수로 연산을 한다. => 다른 자료형보다 연산 속도가 빠르다.
ex) short num1 = 15, num2 = 25; // num1과 num2는 short형으로 선언
short num3 = num1 + num2; // num1 + num2의 값을 int형, num3에 저장할 때 short로 형 변환
변수 선언은 short형으로 했지만 연산할 때만큼은 int형으로 형 변환하여 계산함.
① num1(short) , num2(short) => 모두 short형으로 선언
② num1(int) + num2(int) => 모두 int형으로 변환하여 연산
③ num3(short) = num1(short) + num2(short) => int형으로 연산된 num1 + num2의 값이 short형으로 변환되어 num3에 저장됨
'③'에서는 총 2회 자료형의 변환이 일어난 것이다.
ㆍ 자동 형 변환(묵시적 형 변환) - 피연산자의 자료형 불일치
ex) double num1 = 5.19 + 19; // 실수 + 정수
=> 오차가 발생하더라도 데이터 손실을 최소화. 실수 + (정수를 실수로 형 변환)
ex) 5.15(double) + 19(int) => 5.15(double) + 19.0(double)
∴ 24.15(double)
* 피 연산자의 자료형이 일치하지 않아서 발생하는 자동 형 변환은 데이터 손실을 최소화하는 방향으로 진행한다.!!
char와 short는 생략 (char와 short는 연산할 때 int형으로 변환되기 때문이다.)
형 변환의 우선 순위는 정수 자료형보다 실수 자료형이 무조건 앞서있다고 정의한다.
ㆍ 강제 형 변환 (명시적 형 변환)
명시적 형 변환이란? 말 그대로 '명시한다'는 의미로 내가 직접 변환을 선언하겠다는 의미. (강제)
int num1 = 3, num2 = 4;
double divResult;
* 연산 결과의 자료형은 피연산자의 자료형과 일치.
① divResult = num1 / num2;
② divResult = (double)num1 / num2;
* (double)num1은 num1의 자료형을 double형으로 형 변환하라는 뜻.
( ) <= 형 변환 연산자 (Type Casting Operator)
형 변환 연산자가 자동형 변형보다 더 먼저 진행됨.
③ int num1 = 3;
double num2 = 2.5 * num1;
=> 자동 형 변환이 에러 없이 진행됨.
int num1 = 3;
double num2 = 2.5 * (double)num1;
=> 하지만, 이렇게 일부러 표시해서 어디서 형 변환이 되는지 표시해준다.
* 형 변환 위치 표시는 코드 분석을 더욱 용이하게 해준다.