▣ 언박싱(UnBoxing)
-. UnBoxing은 Boxing된 참조차입을 다시 값타입으로 변환하는 것을 말한다.
▣ UnBoxing의 순서
-. 해당 객체가 지정한 값타입을 Boxing한 값인지 확인
-. Boxing된 객체라면 객체의 값을 값타입 변수에 복사한다.
-. Boxing한 메모리와 UnBoxing한 메모리 두 개가 존재한다.
▣ UnBoxing의 예
-. int p = 123;
-. object o = p; // Boxing 묵시적으로 이루어진다.
-. int j = (int)o; // UnBoxing 명시적으로 캐스팅해주어야 함.
-. Console.WriteLine("j = " + j);
-. Console.WriteLine("p = " + p);
-. Console.WriteLine("o = " + o);
일단 UnBoxing을 하려 하면 참조타입 객체가 Boxing된 것인지를 확인한다. 확인이 되면 값타입의 메모리에 값만을 복사하게 된다. 이 때 값타입의 메모리와 힙에 있는 메모리는 전혀 별개의 메모리이다. 즉 UnBoxing된 것과 Boxing된 것은 전혀 별개의 메모리라는 것이다.(중요)
UnBoxing은 반드시 명시적으로 이루어지며, Boxing된 변수의 공간과는 별도의 메모리 공간에 값이 저장된다. 지정한 값타입의 UnBoxing 변환이 런타임에 성공적으로 수행하려면 Boxing된 object o의 값을 값타입의 변수에 할당하면 된다. 이 때 반드시 명시적으로 Boxing된 데이터 타입에 맞는 형으로 변환을 해주어야 한다. 만약 잘못된 형식으로 형변환을 한다면 System.InvalidCastException에러가 발생한다.
값타입을 참조타입으로 변환할 수 있으며, 참조타입이 값타입으로 변환할 수 있다는 것은 아주 많은 장점을 가지고 있다. 하지만 이러한 변환은 너무나도 쉽게 그리고 자주 발생하면 많은 부하를 동반하기 때문에 주의해서 사용해야 한다.
◈ 참조타입 매개변수
public class Top
{
public static void Say(Object obj)
{
//...
}
}
◈ Object형
-. 모든 클래스가 기본적으로 상속받는 최상위 클래스 형
◈ 참조타입 매개변수
-. Top.Say(new Object());
-. Top.Say("Hello World");
◈ 값타입 매개변수
-. Top.Say(3); // 3은 값타입이다. 참조타입이 아니다.
◈ Boxing과 UnBoxing
-. Boxing: 값타입을 참조타입으로 변환하는 기법
-. UnBoxing: 참조타입을 값타입으로 변환하는 기법
Top클래스의 Say()함수는 Object형 매개변수를 가지고 있기 때문에 참조타입의 객체라면 어떠한 형이든 상관하지 않는다.
하지만 매개변수가 값타입일 경우 문제가 발생한다. 참조타입만 가능하며 값타입은 참조타입이 아니기 때문에 매개변수로 할당되는 것이 불가능하다.
값타입을 참조타입으로 바꾸어 주지 않으면 Say()함수에 값타입의 데이터를 할당할 수 없다.
그러나 걱정할 것은 없다. Say()에 3이라는 매개변수를 할당하고 호출하게 되면 내부에서 자동으로 3을 참조타입의 객체로 변환해서 할당하게 된다. 이것을 우리는 박싱이라고 한다. 역으로 박싱된 참조타입의 객체를 다시 값타입으로 변환하는 것은 언박싱이라고 한다.
◈ 정의
강제형변환을 해주는 연산자
◈ 설명
강제형변환이라하면 그냥 (double)a; 라고 하면 되지 굳이 as 연산자를 사용할 필요가 있을성싶다.
보통 형변환이라고 하면 낮은형에서 높은형으로 변환하는 것을 말한다.(ex: int->double)
강제형변환이라고 하는 것은 높은형에서 낮은형으로 변환하거나 에러가 날 수 있는 형변환을 말한다.(ex:double->int , int->string)
일반적인 형식으로 강제형변환을 하게 되면 예외가 발생하게 된다.
하지만, as 연산자를 사용하게 되면, 불가능한 형변환(문제가 제기될 수 있는)시 예외가 발생하는 것이 아니라.
Null값이 대입된다.
1) 식을 지정한 데이터형으로 변환됩니다.
2) (String) 형변환에서는 변환할 수 없을 때 오류(예외)를 반환, as는 null을 반환하는 점이 다릅니다.
3) is 연산자의 작업을 단순화하고 실행 성능을 향상.
4) 형 변환 시 예외 발생하지 않음(null을 반환).
5) as 연산자는 캐스트 연산과 비슷합니다.
6) 참조 변환가 boxing 변환만을 수행합니다.
* 참조 변환과 boxing 이란?
: boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스입니다.
int i = 123;
object o = (object)i; boxing
즉 as를 사용하여 변환을 하였다면 그 값이 null인지를 체크하여 제대로 변환 여부를 따져보면 됩니다. 또한 as를 사용하기전 가능여부는 is를 사용하여 확인하고 변환을 시도하면 됩니다.
◈ 예제
1)
Money money = obj as Money;
if(money != null)
{
...
}
=> 객체의 타입을 한번 검사.
2)
int a = 10;
double b = 20;
b = a as double;
'C#' 카테고리의 다른 글
[C#] MemberwiseClone() 함수 (0) | 2018.07.16 |
---|---|
[C#] enum의 Flag 연산 (0) | 2018.07.16 |
[C#] Delegate (0) | 2018.07.16 |
[C#] 서로 다른 3가지 Timer (0) | 2018.07.11 |
[C#] 마샬링이란(marshalling) (0) | 2018.07.10 |