언어/Java

[Java] 변수 - 형변환(Casting)

JJangGu 2019. 9. 5. 00:52

형변환

형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다.

 

형변환의 방법은 간단하다. 형변환하고자 하는 변수나 *리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주면된다.

 

형변환 연산자 예시

 

 

 서로 다른 타입간의 대입 또는 연산을 할 떄, 편의상의 이유로 형변환을 생략할 수 있다. 이를 '자동 형변환'이라고 한다.

자동형변환은 기존의 값을 최대한 보존할 수 있는 타입으로 변환한다.

표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중 표현범위가 더 넓은 쪽으로 형변환이 이루어진다.

 

기본형의 자동 형변환이 가능한 방향

 

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