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;
- 자동 형변환의 규칙
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환
- 왼쪽부터 오른쪽으로의 변환은 자동 형변환 가능
- 오른쪽부터 왼쪽으로의 변환은 형변환 연산자 필요
- 같은 크기라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 가지기 때문에 정수형보다 실수형이 오른쪽에 위치
- char 타입과 short 타입은 같은 2 byte지만 서로 범위가 다르기 때문에 자동 형변환이 수행될 수 없음
1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능
2. 기본형과 참조형은 서로 형변환할 수 없음
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만,
값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있음
참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-03] 연산자(Operator) - 비교 연산자, 논리 연산자, 비트 연산자 (0) | 2021.02.08 |
---|---|
[Java-03] 연산자(Operator) - 단항 연산자, 산술 연산자 (0) | 2021.02.02 |
[Java-02] 변수(Variable) - 기본형(Primitive type) (0) | 2021.01.31 |
[Java-02] 변수(Variable) - 진법 (0) | 2021.01.30 |
[Java-02] 변수(Variable) - 변수와 상수, 변수의 타입 (0) | 2020.12.25 |