변수 형변환
1. 형변환 이란?
- 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
2. 형변환 방법
-(타입)피연산자
ex)
double d = 99.9;
int score = (int)d;
위 예제는 bouble 타입ㅇ듸 변수 d 를 int 타입으로 형변환
변환 수식 결과
int -> char (char)65 'A'
char -> int (int)'A' 65
float -> int (int)1.6f 1
int -> float (float)10 10.0f
3. 정수형 간의 형변환
- 큰 타입에서 작은 타입으로 변환, 예시로 int 타입 값을 byte 로 변환하는 경우 그 크기만큰 잘려나간다 그래서 경우에 따라 '값 손실'이 발생할 수 있다.
- 반대로 작은 타입에서 큰 타입으로 변환, 예시로 byte 값을 int 값으로 변환하는 경우 저장공간의 부족으로 잘려나가는 일이 없으므로 값 손실이 발생하지 않는다. 나머지 공간은 0 or 1 로 채워진다.
- 빈 공간은 0으로 채우는 게 보통이지만, 변환하려는 값이 음수인 경우네는 빈공간을 1로 채운다 .
오류 : Type mismatch: cannot convert from int to short
->
4. 실수형 간의 형변환
- 실수형에서도 정수형 처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈공간을 0으로 채운다.
- float 값을 bouble 변환하는 경우 지수(E)는 float의 기저인 127을 뺀 후 double의 기저인 1023을 더해서 변환하고, 가수(M)는 float의 가수 23자리를 채우고 남은 자리를 0으로 채운다.
5. 정수형과 실수형 간의 형변환
- 정수형과 실수형은 저장형식이 완전히 다르기 때문에 정수형간의 변환처럼 간단히 값을 채우고 자르는 식으로 살 수없다. 좀더 복잡한 변환과정을 거쳐야한다.
1) 정수형을 실수형으로 변환
- 정수는 소수점이하의 값이 없으므로 비교적 변환이 간단
- 정수를 2진수로 변환한 다음 정규화를 거쳐 실수의 저장형식으로 저장
- 실수형의 저장형식에서 설명했으므로 생략
2)실수형을 정수형으로 변환
- 실수형의 소수점이하 값은 버려짐
- 정수형의 표현형식으로 소수점 이하의 값은 표현할 수 없기 때문
ex) float -> 상수 9.1234567f 를 int 로 형변환시 9가 된다.
- 실수형을 정수형으로 형변환 할 때 반올림이 발생하지 X
ex) 실수 1.666 -> int 형변환시 1이 된다.
- 만일 실수의 소수점을 버리고 남은 정수가 정수형의 저장 범위를 넘는 경우 정수의 오차 오버플로우가 발생한 결과가 된다.
6. 자동 형변환
1) 서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타일을 일치시키는 것이 원식 But 경우에 따라 편의상의 이유로 형 변환을 생략가능!(컴파일러가 자동추가)
2) 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는 경우에 형변환을 생략하면 에러 발생!
byte b = 100; // 오차범위 초과
char ch = (char)1000 ; // 명시적 형변환. 에러발생X
int i = 3;
double d = 1.0 +i ; // double d = 1.0 + (double)i; 에서 형변환이 생략 가능
7. 자동 형변환의 규칙
- 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환
- 형변환을 생략하면 컴파일러가 알아서 자동적으로 형변환을 한다고 한다. 그 기준은 위와 같다.
1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환할 수없다.
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
ex)
자동 형변환
1 byte 2 byte 4byte 8byte 4byte 8byte
byte -> short -> int -> long -> float -> double
char----> int -> long -> float -> double
<요약>
형 변환
1. 자동 형변환 (암시적)
ㄱ.작은자료형 op(연산)큰 자료형 -> 큰 자료형
ㄴ.작은자료형의 값을 큰 자료형에 대입할 때
2. 강제 형변환 (명시적)
ㄱ. (변환하고자하는 자료형) cast 연산자를 사용해서 강제로 형변환 [cast 강제 형변환]
(주의)
->
=============================================
Type mismatch: cannot convert from double to float
->
or
-------------------------------------------------------------------------------
ㄴ. 값을 temp에 저장