[Java] 형변환 (Casting)
형변환이란 Type을 바꿔주는 것으로 두 가지가 있는데 업 캐스팅과 다운 캐스팅이다. 먼저 기본형에 대한 형변환을
* 업 캐스팅(작은 Type -> 큰 Type) : 작은 Type을 큰 Type으로 Type을 바꾸는 경우로 Type이 바뀌면서 데이터의 손실이 발생하지 않음으로 묵시적 형변환이 가능하다.
ex) double d1 = 1;
ex) double d2 = 1.0F;
* 다운 캐스팅(큰 Type -> 작은 Type) : 큰 Type을 작은 Type으로 Type을 바꾸는 경우로 Type이 바뀌면서 데이터의 손실이 발생하기 때문에 명시적 형변환을 해야한다.
ex) int i = (int)1.7; // i에는 0.7의 손실이 발생하여 1만 남는다.
* 만약 기본형 끼리의 연산을 한다면 연산에 사용된 기본형 중 가장 큰 Type으로 Type이 정해진다. 즉 가장 큰 Type으로 형변환이 자동으로 이루어진 후 연산이 되는 것이다.
(double > float > long > int > char > short > byte)
위는 기본형을 가지고 형변환을 알아봤다. 이제 객체의 형변환을 알아보면 형변환이 두 가지가 있는 것은 똑같다.
* 업 캐스팅(자식 클래스 -> 부모 클래스) : 자식 클래스를 부모 클래스로 Type을 바꾸는 경우로 부모 클래스의 데이터만 사용할 수 있고 묵시적 형변환이 가능하다.
* 다운 캐스팅(부모 클래스 -> 자식 클래스) : 부모 클래스를 자식 클래스로 Type을 바꾸는 경우로 업 캐스팅한 내용을 다시 되돌린다고 생각하면되고 명시적 형변환을 해야한다.
ex)
class Parent {
void b(){
System.out.println("b");
}
}
class Child extends Parent {
void c(){
System.out.println("c");
}
}
{
Parent p = new Child(); // 업 캐스팅
p.b();
// p.c(); 는 Parent 클래스에 c매소드가 없기 때문에 안된다.
Child c = (Child) new Parent(); // 다운 캐스팅, 런타임 에러
c.b();
c.c();
}
위에 작성한 예제는 컴파일 에러는 나지 않는다. 하지만 실행을 해보면 ClassCastException이 발생한다. 이유는 new Parent()는 Child로 데이터를 바꾸지 못하기 때문이다. 때문에 객체의 다운 캐스팅을 하기위해서는 아래 예제와 같이 하면 된다.
ex)
{
Parent p = new Child(); // 업 캐스팅
p.b();
Child c = (Child) p; // 다운 캐스팅
c.b();
c.c();
}