업캐스팅 / 다운캐스팅

업캐스팅 : 자식클래스의 객체를 부모클래스의 객체로 형변환 (묵시적)

String a = "hello";
Object b = a;  => 이 경우 데이터의 손실은 없으나 부모클래스에 있는 속성과 메소드만 접근할 수 있다.
                    => 업캐스팅 된 상태에서 캐스팅 전 하위 클래스의 메서드를 사용하고 싶다면
                        상위클래스를 추상클래스로 작성, 하위클래스의 메서드를 추상메서드로 정의해놓자.
                        추상클래스는 객체만 못만들 뿐 데이터 타입으로 정의 가능하다.

String c = (String)b ; => 원래 b가 가지고 있던 자식클래스의 정보를 다시 사용 가능

데이터 타입의 업캐스팅

int a = 3;
double b = a; => 묵시적으로 형변환이 가능하며 데이터 손실 없음


다운캐스팅 : 부모클래스의 객체를 자식클래스로 형변환(명식적)

Object a  = new Object();
String b = (String)a;

데이터타입의 다운캐스팅

double a = 3.3;
int b = (int)a; => 명시적으로 형변환을 해주어야 하며 소수점이하가 버려짐과 같은 데이터 손실 주의



박싱/언박싱
: 데이터는 value(값)형 데이터와 reference(참조)형 데이터로 나뉨.
 값형 데이터는 스텍영역에, 참조형 데이터는 힙 영역에 저장되어 사용된다.

박싱 : 값형 데이터를 참조형 데이터로 변환, 즉 스텍영역의 데이터를 힙 영역으로 옮긴다.
         묵시적으로 형변환이 가능하며 데이터 손실은 없다.

int a = 3;
Object b = a ;  or Integer c = a; 

언박싱 : 참조형 데이터를 값형 데이터로 변환, 즉 힙영역의 데이터를 스택영역으로 옮긴다.
            박싱 된 참조형 데이터를 다시 값 형 데이터로 되돌리기 위해 사용된다.

int d = (int)b;


결국 메모리 위치를 변화 시켜 가는 박싱과 언박싱은 비용이 많이 든다.
대표적으로 ArrayList 와 같은 object 형 컬렉션에 대량의 값 타입을 넣고 빼고 하여

발생하는 박싱,언박싱은 실제로 많은 속도 저하를 유발하는 원인이기도 하다.

(실제로 닷넷 2.0에서는 박싱,언박싱 (업캐스팅,다운캐스팅)의 비용을 줄이기 위해 지네릭이라는
 
새로운 개념이 도입되었다)


박싱/언박싱을 사용하는 코드는 런티임 에러를 발생하기 쉬우므로 사용시 주의하도록 

직렬화(Serialization) : 객체의 메모리를 통재로 저장할 수 있는 기법. 
역직렬(Deserialization) : 저장된 데이터를 이용하여 다시 복원하는 기술.

'~ 2014 > 기본개념' 카테고리의 다른 글

운영체제 스케쥴링 정책  (0) 2014.06.15
처리장치 속도  (0) 2014.06.15
RGB 색상 수  (0) 2014.06.12
프로그래밍(절차지향, 객체지향, 모듈)  (0) 2014.06.12

+ Recent posts