프로그래밍을 하다보면 꽤 자주 다른 타입 간에 데이터 연산을 수행해야하는 경우가 있습니다.(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
는 같은 메모리 크기를 사용하지만 실제로 표현하게 될 수의 범위는 float
가 int
보다 넒고 심지어는 long
보다도 더 넒습니다.
이러한 결과가 나오는 이유는 지난번에도 언급한대로 자바에서는 실수를 부동소수점방식으로 표기하기 때문입니다.
간단히 말해서 지수부와 가수부로 나누고 가수부엔 실제 값을 적고 지수부에는 2제곱이 얼마나 들어가는 지를 적습니다.따라서 부동소수점수 표현이 더 많은 범위의 수를 표현할 수 있게 되는 것 입니다.
실제로도 float를 int로 캐스팅할 때는 캐스팅을 생략하면 오류가 뜨지만 반대로 int를 float로 캐스팅하는 경우에는 오류가 발생하지 않습니다.