[Java] 캐스팅

Bam·2024년 2월 21일
0

Java

목록 보기
6/98
post-thumbnail

캐스팅

프로그래밍을 하다보면 꽤 자주 다른 타입 간에 데이터 연산을 수행해야하는 경우가 있습니다.(ex) int형 정수와 double형 실수의 연산 등) 그러나 데이터 연산은 같은 데이터 타입끼리만 수행할 수 있는데요. 이때 다른 타입 간에 연산을 위해서 하나의 데이터 타입으로 만들어주어야하는 과정이 필요합니다.

캐스팅(Casting, 형변환)은 어떤 변수(또는 리터럴)의 타입을 다른 타입으로 변화시키는 것을 의미합니다. 캐스팅은 기본형-기본형, 참조형-참조형끼리만 가능하고 기본형-참조형의 캐스팅은 불가능합니다.

캐스팅은 캐스팅을 하고자하는 변수나, 리터럴의 앞에 괄호를 넣고 그 괄호 안에 캐스팅하고자하는 타입을 써서 사용합니다.

타입 변수명 = (타입)리터럴;
//또는
(타입)변수명

정수형인 int에 다음 코드처럼 실수를 넣으려고 하면 오류가 발생합니다.
이때 어떻게 해서든 int형에 3.14라는 실수를 넣고 싶다면 다음과 같이 캐스팅을 통해서 강제로 리터럴을 int형으로 바꿔주어야합니다.

int number = (int)3.14;

이때 변수 number에는 정수형인 int형 변수이기 때문에 실수부분은 다 잘리고 정수부분만 취하게 됩니다.

int num1 = 10;
double num2 = 1.1;
int result = num1 + (int)num2;

참고로 캐스팅을 수행해도 변수에 담겨있던 데이터에는 영향을 주지 않습니다.

int num1 = 10;
double num2 = 1.1;
int result = num1 + (int)num2;

System.out.println(num2);

캐스팅의 주의점

캐스팅할 때 주의점이 있는데 바로 크기가 큰 타입에서 작은 타입으로 형변환시 데이터 손실이 발생할 수도 있다라는 것 입니다.

당장 위에서 들은 예시인 double(8바이트)의 int(4바이트) 캐스팅에서 소수점 이하의 숫자들이 모두 사라진 채로 연산이 수행된 것이 그 예입니다.
따라서 각 타입이 표현할 수 있는 값의 범위를 유의해두고 캐스팅을 사용하는 것이 좋습니다.

자동 캐스팅

큰 타입에서 작은 타입으로 캐스팅을 했을 경우엔 메모리 공간의 부족으로 데이터 손실이 발생할 수 있다고 했는데요. 반대로 작은 타입에서 큰 타입으로 캐스팅을 하는 경우엔 메모리 공간이 남기 때문에 데이터 손실은 발생하지 않습니다.

그래서 편의성을 위해서 작은 타입에서 큰 타입으로 캐스팅을 하는 경우에는 캐스팅 연산자를 생략할 수도 있습니다.
위 사진처럼 큰 타입인 double(8바이트)에서 작은 타입인 float(4바이트)로 캐스팅을 수행하는 경우 캐스팅을 생략하면 오류가 뜹니다.캐스팅을 적어주면 오류가 사라집니다.반대로 더 작은 타입인 float에서 더 큰 타입인 double로 캐스팅하는 경우에는 캐스팅을 생략하여도 오류가 발생하지 않습니다.

같은 4byte의 int와 float는 크기가 다르다?

같은 4byte 메모리 크기를 갖는 정수 타입int와 실수 타입 float는 같은 메모리 크기를 사용하지만 실제로 표현하게 될 수의 범위는 floatint보다 넒고 심지어는 long보다도 더 넒습니다.

이러한 결과가 나오는 이유는 지난번에도 언급한대로 자바에서는 실수를 부동소수점방식으로 표기하기 때문입니다.

간단히 말해서 지수부와 가수부로 나누고 가수부엔 실제 값을 적고 지수부에는 2제곱이 얼마나 들어가는 지를 적습니다.따라서 부동소수점수 표현이 더 많은 범위의 수를 표현할 수 있게 되는 것 입니다.

실제로도 float를 int로 캐스팅할 때는 캐스팅을 생략하면 오류가 뜨지만 반대로 int를 float로 캐스팅하는 경우에는 오류가 발생하지 않습니다.

0개의 댓글