모종닷컴

Value Type/Reference Type 본문

카테고리 없음

Value Type/Reference Type

모종 2017. 10. 31. 12:53
반응형

오늘은 C#에서 Value Type/Reference Type에 대하여 알아보도록 하겠습니다.

 

 

□값 형식(Value Type)

먼저 기본 자료형(string을 제외한)과 사용자 정의 구조체의 변수는 값 형식이며 스택에 저장됩니다.

 

ex) int x  = 10; // 변수 x는 스택에 저장.

 

값 형식으로 저장된 변수들은 범위 밖을 나가면 스택에서 제거됩니다.

 

 

□참조 형식(Reference Type)

이번엔 참조형식인데 인스턴스 변수(클래스,배열)들은 참조 형식이며 힙 영역에 저장됩니다.

 

ex) Student stu = new Student();    // 인스턴스 변수 stu는 힙 영역에 저장.

 

참조 형식으로 저장된 변수들은 C#에서 효율적인 메모리 관리를 위해 가비지 컬렉터란 것이 소멸 되는 시점을 판단하여 객체를 수거해갑니다.

 

이 두개의 차이점은 엑세스에 있는데요. 값 형식은 효율적이지만 수명이 제한되어 서로 다른 클래스 간에 데이터를 공유하는 데 적합하지 않고, 참조 형식은 다른 클래스에서 엑세스하는데 적합하지만 오버헤드가 커진다는 단점있습니다.

 

□값 형식과 참조 형식의 변환

C#에서는 서로 형식을 변환할 수 있게 BoxingUnBoxing 이라는 개념을 제공하는데요.

 

값 형식 → 참조 형식 Boxing(*스택에 있는 데이터가 힙으로 복사)

참조 형식 → 값 형식 UnBoxing(*힙에 있는 데이터가 스택으로 복사)

 

이라고 합니다.

 

여기서 주의할 것은 모든 객체가 값 형식으로 언박싱 되는 것이 아닌 한번 박싱한 객체에 대해서만 가능하다는 점입니다. 또한 언박싱은 박싱하기 전 형식을 준수해야 하는 것입니다.

 

ex) object o = new object();

int j = (int)0; //예외 발생

 

short i =123;

object o = i;

int j = (int)o;    //언박싱 불가능

 

 

□컬렉션에서의 박싱/언박싱

 

박싱 언박싱은 ArrayList 같은 컬렉션에서 자주 일어납니다.

 

컬렉션의 장점으로 어떤 타입의 데이터든지 전부 담을 수 있다는 것인데 이 말은 즉슨 컬렉션에서는 데이터를 받으면 어떤 형식으던지 object형식으로 박싱되어 저장되고 그 데이터를 사용할 때 언박싱이 된다는 것입니다.

 

이 과정 변환되는 과정에 대하여 MSDN 에서는  

 

boxing unboxing 과정에는 많은 처리 작업이 필요합니다. 값 형식을 boxing할 때는 완전히 새로운 개체가 만들어져야 하며, 이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다

 

라고 설명하였습니다.

 

□일반화 컬렉션

 

위에 따라 컬렉션에서는 특별한 경우(다양한 변수를 넣어 관리)를 제외하고 일반화 컬렉션을 사용한다.

 

일반화 컬렉션이랑 컬렉션에 제네릭(컬렉션에 특정한 타입만 넣을 수 있도록 지정)을 더한 것과 같다,

 

ex) List<int> list = new List<int>(); // int 타입만 저장 가능

 

타입을 지정해서 사용하기 때문에 불필요한 형식 변환을 발생시키지 않으며, 잘못된 형식의 객체를 담는 위험을 피할 수 있다.

 

 

 

 

 

 

 

반응형