오늘은 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 타입만 저장 가능

 

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

 

 

 

 

 

 

 

'' 카테고리의 다른 글

Value Type/Reference Type  (0) 2017.10.31

C# 언어 특징

  • 객체 지향 언어
  • C언어의 기본적인 기능 , C++로부터의 객체지향 특성을 상속받음
  • 사용자 인터페이스를 쉽게 만들 수 있음.

대충 특징만 보아도 java와 매우 흡사한 부분이 있다는 것을 알수 있습니다. 그럴수밖에 없는 것이 MS에서 자바를 잡기 위해 만든 언어가 바로 C#이기 때문입니다. 비슷하긴 하지만 똑같지는 않습니다. 가장 큰 차이점은 C#은 닷넷 프레임워크 환경에서 돌아가죠 (java는 JVM)

 

 

위에서는 C#의 전체적인 특징을 짚어보았는데요 java와 매우 흡사한 만큼 작은 문법적인 부분외에는 거의 비슷하다 보면 되겠습니다. 하지만 위에 말했듯이 C#은 자바보다 뒤에 나와서 java보다 더 많은 기능들을 제공한다고 합니다. 대신 java는 먼저 나온만큼 제공되는 라이브러리나 오픈 소스 자료의 수가 자바 쪽이 좀 더 많은 것 같습니다.

 

프로그래밍 언어가 뭐 거기서 거기겠지유 ㅠ

 

 

 

 

 

 

개미수열을 C#으로 구현한 소스입니다.

 

 

20번만 돌린다는 가정 하에 배열의 크기를 500으로 선언하였습니다.

  1. 베짱이 2017.09.23 21:57

    좋은정보 감사합니다~!

+ Recent posts