3. 형변환
3.1 형변환 (casting) 이란?
서로 다른 타입의 값으로 연산을 수행해야할 때 사용한다.
형변환이란 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것이다.
3.2 형변환 방법
기본형과 참조형 모두 형변환이 가능하지만, 둘 사이에는 형변환이 성립되지 않는다.
형변환하는 방법은 형변환하고자 하는 변수나 리터럴 앞에 변환하려는 타입을 괄호와 함께 붙여주면 된다.
* 오토박싱 기능이 추가되면서 기본형을 Object, wrapper 클래스 같은 참조형으로 형변환 할 수 있게 되었다.
int score = (int)85.4; //double 형 값을 int 형으로 변환한다.
byte b = (byte)score; //score 에 저장된 값을 byte 형으로 변환
형변환 할 때 사용하는 괄호는 캐스트 연산자나 형변환 연산자라고 한다.
캐스트 연산자는 피연산자의 값을 읽고 지정된 타입으로 형변환 한 후에 그 결과를 반환하기 때문에 피연산자는 형변환 후에도 아무런 변화가 없다.
public class ex2 {
public static void main(String[]args) {
double d = 100.0;
int i = 100;
int result = i+(int)d;
System.out.println(d);
System.out.println(result);
}
}
[실행 결과]
100.0 //형변환 후에도 변화가 없다.
200
형변환한 결과를 덧셈연산에 사용한다.
3.3 기본형의 형변환
boolean 형을 제외한 나머지 기본형 간에는 서로 형변환이 가능하다.
각 자료형마다 표현가능한 값의 범위가 다르기 때문에 큰 자료형에서 범위가 작은 자료형으로의 변환은 값 손실이 일어날 수 있다. 반대의 경우에는 값 손실이 절대 일어나지 않는다.
public class ex2 {
public static void main(String[]args) {
int a = 300;
byte b = (byte)a;
System.out.println(a);
System.out.println(b);
int c = 100;
byte d = (byte)c;
System.out.println(c);
System.out.println(d);
}
}
[실행 결과]
300
44
100
100
int 가 byte 보다 값의 표현 범위가 큰데, byte 값을 int 값으로 변환하게 되면 1 byte에서 4 byte 로 나머지 3 byte(24자리)를 0으로 채워주면 되므로 기존의 값이 그대로 보존된다. 하지만 int 값을 byte 값으로 변환하게 되면 3 byte 를 잘라내서 1 byte 로 만드는 것이기 때문에 기존의 값이 보존될 수도 있고, 안될 수도 있다.
값의 표현 범위가 작은 자료형에서 큰 자료형의 변환은 값의 손실이 없기 때문에 캐스트 연산자의 생략이 가능하다. 이 경우에 JVM 내부에서 형변환이 자동으로 수행된다.
반대의 경우에는 값이 손실될 수 있기 때문에 자동적으로 형변환은 진행되지 않고 캐스트 연산자를 이용하여 명시적 형변환을 하도록 강요한다. 그렇지 않을 경우 컴파일 시 에러가 발생한다.
기본형의 자동형변환이 가능한 방향은 byte → short (char) → int → long → float → double이다.
실수형은 정수형과 값을 표현하는 방식이 다르다. 그래서 같은 크기라도 실수형이 정수형보다 오른쪽에 위치하게 되는 것이다.
char 와 ,short 는 모두 2 byte 이지만 서로 범위가 달라 어느쪽으로 형변환을 하더라도 값 손실이 일어날 수 있기 때문에 자동적인 형변환이 이루어지지 않는다.