공부/Java

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

줭♪(´▽`) 2021. 2. 1. 20:39

1. 형변환(캐스팅, casting)이란?

- 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

 

 

2. 형변환 방법

 

(타입)피연산자

 

- 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여줌

- 형변환하고 결과를 반환할 뿐, 피연산자의 값은 변화가 없음

 

ex)

double d = 85.4;

int score = (int)d;

 

-> d는 그대로 85.4의 값을 갖고, score는 d를 int 타입으로 변환한 85의 값을 갖음

 

- 기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능함

- 기본형과 참조형간의 형변환은 불가능

 

변환

수식

결과

int -> char

(char)65

'A'

char -> int

(int)'A'

65

float -> int

(int)1.6f

1 (반올림이 아닌 버림)

int -> float

(float)10

10.0f

 

 

3. 정수형 간의 형변환

- 큰 타입에서 작은 타입으로의 변환은 값 손실(loss of data)이 발생할 수 있음

ex) int 타입 (4 byte) -> byte 타입 (1 byte)

 

- 작은 타입에서 큰 타입으로의 변환은 값 손실이 발생하지 않고 빈공간을 0 또는 1로 채움

ex) byte 타입 (1 byte) -> int 타입 (4 byte)

 

 

4. 실수형 간의 형변환

- 큰 타입에서 작은 타입으로의 변환은 값 손실(loss of data)이 발생할 수 있음

ex) double 타입 (8 byte) -> float 타입 (4 byte)

지수(E) : 1023을 뺀 후 127을 더해서 변환

가수(M) : 52자리 중 23자리만 저장되고 나머지를 버림

 

※ 가수의 24번째 자리에서 반올림이 발생할 수 있음

 

 

- 작은 타입에서 큰 타입으로의 변환은 값 손실이 발생하지 않고 빈공간을 0으로 채움

ex) float 타입 (4 byte) -> double 타입 (8 byte)

지수(E) : 127을 뺀 후 1023을 더해서 변환

가수(M) : 23자리를 채우고 남은 자리를 0으로 채움

 

 float 타입의 범위를 넘는 값을 float로 형변환하는 경우 '±무한대' 또는 '±0'의 결과를 얻음

 

 

5. 정수형과 실수형 간의 형변환

1) 정수형 -> 실수형

① 정수를 2진수로 변환

② 정규화

③ 실수로 저장

 

 정밀도의 제한으로 인한 오차가 발생할 수 있음 (float 대신 double을 사용하여 해결)

 

2) 실수형 -> 정수형

- 실수형의 소수점이하 값을 버림

ex) 9.1234567f를 int 타입으로 형변환하면 9가 됨

 

소수점을 버리고 남은 정수가 정수형의 저장범위를 넘을 경우, 정수의 오버플로우 발생

 

 

6. 자동 형변환

- 서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 일치시키는 것이 원칙이나 경우에 따라 편의상의 이유로 형변환을 생략할 수 있음

- 컴파일러가 생략된 형변환을 자동적으로 추가해 줌

 

ex) float f = 1234;    // float f = (float)1234;

 

 

- 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는 경우에 형변환을 생략하면 에러가 발생

 

ex) byte b = 1000;   // byte의 범위(-128~127)을 넘는 값을 저장

 

 

- 명시적으로 형변환을 할 경우, 프로그래머의 의도라고 간주하고 에러를 발생시키지 않음

 

ex) char ch = (char)1000;

 

 

- 계산식에서 자주 형변환이 생략됨

 

int i = 3;
double d = 1.0 + i;   // double d = 1.0 + (double)i;

 

- 자동 형변환의 규칙

 

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

 

 

기본형의 자동 형변환이 가능한 방향 (단위는 byte)

- 왼쪽부터 오른쪽으로의 변환자동 형변환 가능

- 오른쪽부터 왼쪽으로의 변환형변환 연산자 필요

- 같은 크기라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 가지기 때문에 정수형보다 실수형이 오른쪽에 위치

- char 타입과 short 타입은 같은 2 byte지만 서로 범위가 다르기 때문에 자동 형변환이 수행될 수 없음

 

 

1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능
2. 기본형과 참조형은 서로 형변환할 수 없음
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만,
   값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있음

 

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)