모든 변수와 리터럴에는 타입이 있다. 프로그램을 작성하다 보면 같은 타입뿐만 아니라 서로 다른 타입 간의 연산을 수행해야 하는 경우도 있다. 이럴 때는 연산을 수행하기 전엔 타입을 일치시켜야 하는데, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형 변환(Casting)이라고 한다.
예를 들어 int타입과 float타입의 값을 더하는 경우, 먼저 두 값을 같은 타입으로 즉, 둘 다 float타입으로 변환한 다음 더해야 한다.
형변환 방법: 형 변환을 하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다.
타입(피연산자)
여기에 사용되는 괄호()는 캐스트 연산자 또는 형 변환 연산자라고 하며, 형 변환을 캐스팅이라고 한다.
예를 들면 다음과 같다.
double d =14.1;
int score = (int)d // double 타입의 변수 d를 int 타입으로 형변환
이때 변수 d의 값을 읽어와서 int 형으로 형 변환을 하고, 형 변환의 결과 값인 14를 score라는 변수에 저장한다.
기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형 변환이 가능하다. 다만 참 조형 간의 형 변환은 불가능하다. 기본형끼리의 형변환은 다음과 같다.
변환 | 수식 | 결과 |
int → char | (char)65 | 'A' |
char → int | (int)'A' | 65 |
float → int | (int)1.6f | 1 |
int → float | (float)10 | 10.f |
이때 주의점은 float에서 int형으로 형 변환을 할 경우에는 반올림이 아닌 버림으로 처리된다는 점이다.
1. 정수형간의 형변환
큰 타입에서 작은 타입으로의 변환, 예를 들어 int타입(4byte)의 값을 byte타입(1byte)으로 변환하는 경우는 크기의 차이만큼 잘려나간다. 그래서 경우에 따라 '값 손실'이 발생할 수 있다.
반대로 작은 타입에서 큰 타입으로의 변환, 예를 들어 byte타입(1byte)의 값을 int타입(4byte)로 변환하는 경우는 저장공간의 부족으로 잘려나가는 일이 없으므로 값 손실이 발생하지 않는다. 그리고 나머지 빈 공간은 0 또는 1로 채워진다.
Integer.toBunaryString(int i)라는 메소드는 10진 정수를 2진 정수로 변환한 문자열을 얻을 수 있다.
2. 실수형간의 형변환
3. 정수형과 실수형 간의 형변환
정수형과 실수형은 저장형식이 완전히 다르다. 때문에 같은 형간의 형변환보다 더 복잡한 과정을 거쳐야 한다.
1) 정수형을 실수형으로 변환
정수는 소수점 이하의 값이 없으므로 비교적 변환이 간단하다. 그저 정수를 2진수로 변환한 다음 정규화를 거쳐 실수의 저장형식으로 저장된다.
예)
0 | 0000000 00000000 00000000 00000111 |
▼
111 → 1.11 x 2(^2 + 127)
▼
0 | 10000001 | 11000000 00000000 000000 |
**정수 7이 float 타입으로 형변환 되는 과정
실수형은 정수형보다 훨씬 큰 저장범위를 갖기 때문에, 정수형을 실수형으로 형변환 하는 것은 별 무리가 없다. 정수를 2진수로 변환한 다음 정규화해서 실수의 저장형식에 맞게 저장할 뿐이다. 한 가지 주의할 점은 실수형의 정밀도의 제한으로 인한 오차가 발생할 수 있다는 것이다.
예를 들어 int의 최대값은 약 20억으로 최대 10자리 정밀도를 요구한다. 그러나 float는 10진수로 약 7자리의 정밀도만을 제공하므로, int를 float로 변활할 때 정밀도 차이에 이ㅡ한 오차가 발생할 수 있다. 그래서 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 float가 아닌 double로 형변환 해야 오차가 발생하지 않을 수 있다.
2) 실수형을 정수형으로 변환
실수형을 정수형으로 변환하면, 실수형의 소수점이하 값은 버려진다. 정수형의 표현형식으로 소수점 이하의 값은 표현할 수 없기 때문이다. 예를 들어 float 타입의 상수 9.1234567f를 int 타입으로 형변환 하면 9가 된다.
0 | 10000010 | 001000111111001101011101 → 10진수로 9.1234567 |
▼
1001.000111111001101011101 → 1001 소수점 이하는 버려진다.
▼
0 | 0000000 00000000 00000000 00001001 → 10진수로 9 |
그래서 실수형을 정수형으로 형변환할 때 반올림이 발생하지 않는다. 예를 들어 실수 1.666을 int형으로 변환하면 1이 된다. 만일 실수의 소수점을 버리고 남은 정수가 정수형의 저장범위를 넘는 경우에는 정수의 오버플로우가 발생한 결과를 얻는다.
'JAVA > Basic' 카테고리의 다른 글
변수/상수, 자료형, 자료형 변환 (0) | 2020.07.10 |
---|---|
클래스, 자바소스코드, 컴파일, cmd명령어 (0) | 2020.07.10 |
Java의 개요 (0) | 2020.07.09 |
Java Applet (0) | 2020.06.26 |
댓글