Java 형변환(Casting) - 변수의 데이터 형식 변환

형변환(Casting)

데이터 타입을 변환하는 것을 형변환(Casting, 타입 캐스팅)이라고 한다.

(type)var
  type: 데이터 유형
  var: 변수 이름

일반 타입 형변환

먼저, 기본 형식에서는 작은 형식을 큰 형식으로 할당(예: int 형식의 값을 long 형식으로 할당)할 수 있다. 대는 소를 포용할 수 있다는 것이다. 이를 확대 변환(혹은 묵시적 형 변환) 이라고 한다.

묵시적 형 변환(Wider Conversion)

int i = 10;
double d = i;
long l = i;
float f = 3.14f;
d = f;

그러나, 반대로(축소 변환 혹은 명시적 형 변환)은 그대로는 불가능 하다. long 형의 값이 int 형에 저장할 수 있다고는 항상 할 수 않기 때문이다.
따라서, 명시적으로 long 형의 값을 int 형으로 캐스트(변환)해야 한다. 캐스트에는 대상의 변수의 직전에 “(타입명)“만 부여하면 된다.

명시적 형 변환(Narrow Conversion)

public class Cast {
    public static void main(String[] args) {
        long l = 50;
        int i = (int) l;
        System.out.println(1 + i);
    }
}

클래스/인터페이스 형변환

마찬가지로, 클래스/인터페이스형의 값도 캐스트할 수 있다. 클래스형/인터페이스형이 캐스트할 수 있는 것은 대입하는 형태가 대입처의 형태의 파생 클래스 또는 구현체이어야 한다.

예를 들어, Hamster 클래스가 Animal 클래스 a의 서브 클래스이면 다음과 같은 캐스트가 가능하다.

Animal a = new Hamster();
Hamster h = (Hamster) a;

그러나, 다음과 같은 코드는 불가능하다.

Animal c = new Cat();
Hamster h = (Hamster) c; // 케스팅 에러

변수 c는 Animal 형이지만, 그 실체는 Cat 객체이기 때문이다.
이러한 오류를 방지하려면 instanceof 연산자를 사용해야 한다. instanceof 연산자는 객체가 지정된 클래스인지 슈퍼 클래스의 인스턴스인지를 판단한다. 클래스형의 캐스트에 있어서는 미리 instanceof 연산자로 실제의 형태를 판단하여, 안전하게 캐스트를 실행할 수 있다.

Animal c = new Cat();
if (c instanceof Hamster) {
    Hamster h = (Hamster) c;
}