형변환
형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다.
형변환의 방법은 간단하다. 형변환하고자 하는 변수나 *리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주면된다.
서로 다른 타입간의 대입 또는 연산을 할 떄, 편의상의 이유로 형변환을 생략할 수 있다. 이를 '자동 형변환'이라고 한다.
자동형변환은 기존의 값을 최대한 보존할 수 있는 타입으로 변환한다.
표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중 표현범위가 더 넓은 쪽으로 형변환이 이루어진다.
boolean을 제외한 기본형 7개의 자동형변환은 그림과 같이 왼쪽에서 부터 오른쪽으로 자동형변환 되며, 오른쪽에서 왼쪽으로의 변환은 명시적으로 형변환연산자를 써줘야 한다.
* 기본형과 참조형은 서로 형변환할 수 없다.
실수형은 정수형과 값을 표현하는 방식이 다르므로 같은 크기여도 실수형이 정수형보다 큰 표현 범위를 갖기 때문에 오른쪽에 위치한다.
단, 정수형을 실수형으로 변환하는 경우 오차가 생길 수 있다.
- 정수형을 실수형으로 변환
정수형을 실수형으로 변환할 때에는 정수를 2진수로 변환한 다음 정규화해서 실수의 저장형식에 맞게 저장한다.
오차가 생길 수 있다는 것은 예를 들어 int의 최대값은 약 20억이고 최대 10자리의 정밀도를 요구한다.
반면 float은 10진수로 약 7자리의 정밀도를 제공하기 떄문에 8자리 이상의 값을 실수형으로 변환할 떄 float으로 변환하면 오차가 생길 수 있다.
따라서 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 double로 형변환을 해야 오차없이 변환이 가능하다.
(double의 정밀도는 약 15자리)
- 실수형을 정수형으로 변환
실수형을 정수형으로 변환하면 실수형의 소수점이하 값은 버려진다. 정수형의 표현형식으로 소수점 이하의 값은 표현불가하기 때문이다.
만약 실수형을 정수형으로 변환했을시 소수점이하 값을 버리고 남은 정수가 정수형의 저장범위를 넘어선다면 *오버플로우(overflow)가 발생하게 된다.
* 리터럴(literal) : 프로그래밍에서 상수는 값을 한 번 저장하면 변경할 수 없는 저장공간을 뜻한다. 그래서 흔히 우리가 변수를 선언한 후 값을 지정하는 것을 다르게 불러야 해서 리터럴이라는 다른 이름으로 부른다.
즉, 리터럴은 그 자체로 값을 의미한다.
* 오버플로우(overflow) : 타입이 표현할 수 있는 값의 범위를 넘어서는 것. 에러가 발생하지는 않지만 예상과 다른 결과를 얻게된다.
* 언더플로우(underflow) : 실수형에서 실수형으로 표현 불가한 아주 작은 값. 양의 최소값보다 작은 값이 되는 경우이고, 이때 변수의 값은 0이 된다.
[참고 : Java의 정석]
'언어 > Java' 카테고리의 다른 글
[Java] JVM이란? (0) | 2019.09.25 |
---|---|
[Java] wrapper class (0) | 2019.09.17 |
[Java] 변수 - 타입 (0) | 2019.09.04 |
[Java] 변수 - 선언과 초기화 (0) | 2019.09.04 |