java&spring

[Java] 형변환 (Casting)

sungjine 2017. 2. 7. 19:11
반응형

형변환이란 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();

}

반응형