[닷넷동영상]1-5. C# 자료형(Value Type, Reference Type)

오라클왕 0 43 04.30 11:13

 

1-5. C# 자료형(Value Type, Reference Type)

 

C#의 데이터 타입은 실제 그 값을 가지고 있는 Value-Type과 가지고 있는 것이 값이 아니고 무언가를 참조하는 변수(C언어의 포인터 변수) Reference-Type 두 가지로 구분한다.

 

CTS

 

CTS는 닷넷 프레임워크에서 동작하는 모든 프로그래밍 언어(C#, VB.Net, J#)들이 똑같은 데이터형식을 사용하도록 해주는 것이다. (System.Int32라는 클래스는 CTS에서 제공하는 int형인데 이것은 닷넷의 어떠한 개발언어에서도 사용이 가능하다.)

 

모든 데이터형식들은 기본적으로 객체에서 파생되었으며 Value-Type은 객체 형식을 포장 (sealing)해 놓은 개념이다.

 

Value-Type, Reference-Type

 

Value-Type

 

CTS 에서는 value type reference type 을 지원하는데 value type 변수들은 데이터를 직접 가지고 있다. 예를 들어 int i=10 이라고 쓰면 변수 i에는 10이 직접 들어 있는 것이다. int j=i 라고 하면 i의 값이 j에 복사되어 들어 가는 것이다. Value-Type Built-in Type User-Defined Type 두 가지가 있는데 int, long, float, double 등은 Built-in Type이고 struct, enum 등은 User-Defined Value Type이다.

 

기본 제공 데이터 형식 중 string 데이터 형식은 예외적으로 참조 형식이다.

Value-Type은 스택에 할당된 메모리에 값을 저장하는데 아래 경우에는 스택영역에 4바이트 공간을 확보 후 100이 저장된다.

 

void Sum {

int i = 100;

……

}

 

i 변수가 정의된 Sum메소드의 실행이 종료되어 변수가 범위를 벗어나면 값이 스택에서 삭제된다.

즉 스택을 사용하면 효율적이고 성능 상 장점도 있지만 값 형식의 수명이 제한되므로 서로 다른 클래스 간에 데이터를 공유하는 데는 적합하지 않다.

 

[정수형]

sbyte  System.Sbyte  8  -128~127 

byte  System.Byte  8  0~255 

short  System.Int16  16  -32,768~32,767 

ushort  System.UInt16  16  0~65,535 

int  System.Int32  32  -2,147,483,648 ~2,147,483,647 

uint  Systen.UInt32  32  0~4,294,967,295 

long  System.Int64  64  -(2^63) ~ 2^63-1 

ulong  System.UInt64  64  0~ 2^64-1 

 

[실수형]

float  System.Single  32  1.5x10^-46 ~3.4x10^38 

double  System.Double  64  5.0x10^-324 ~1.7x10^308 

decimal  System.Decimal  128  1.0x10^-28 ~7.9x10^28 

기타 

char  System.UInt16  16  유니코드 1  

bool  System.Int32  1  0 또는 1 

 

[Boolean]

boolean type이 가질 수 있는 값은 true false ) bool b = true --> true 1 과는 다르며 마찬가지로 false 0과는 다르다. (C 에서는 TRUE, FALSE #define을 통해 정의하여 사용했었는데 이는 정수를 암묵적으로 boolean형으로 사용한 것이다.) true false로 산술 연산을 할 수 없으며 오로지 논리 연산자를 가진 수식에 대해서만 사용 가능하다.

 

[Value Type의 초기화]

- 로컬변수는 반드시 초기화가 되어야 한다.

 

int onj;  //로컬변수로 선언되었다면 이 변수는 사용 전 반드시 초기화 돼야 한다.

onj = new int();  // Invoke default constructor for int type.

onj = 0;         // Assign an initial value, 0 in this example.

 

위 두 문장은 같은 결과를 나타내며 다음처럼 한 줄로 표시하면 된다.

int onj = 0;

 

Reference-Type

 

데이터를 직접 저장하는 것이 아니라 레퍼런스(참조값)를 저장한다.(Store references to their data) 그러므로 두 개의 레퍼런스형 변수는 같은 데이터(오브젝트)를 가리키는 것이 가능하다.( Two reference variables can reference same object). 물론 같은 것을 서로 참조할 수 있으므로 한 쪽에서 변경을 하면 다른 쪽에서 변경을 안 했더라도 나중에 값을 꺼내 보면 바뀌어져 있다.(Operations on one can affect another)


클래스 또는 배열의 인스턴스와 같은 참조 형식은 힙(Heap)이라는 다른 메모리 영역에 할당된다. 아래 예문에서는 배열을 구성하는 5개의 정수에 필요한 공간이 힙에 할당된다.

 

void Sum {

int[] numbers = new int[5];

……

}

 

이때 힙에 할당된 메모리는 메소드가 종료 되더라도 힙에 반환되지 않으며, C#의 가비지 수집 시스템에서 이 메모리가 더 이상 필요하지 않다고 판단할 때에만 회수된다. 참조 형식을 선언하면 오버헤드가 커지지만 참조 형식은 다른 클래스에서 액세스할 수 있다는 장점이 있다.


 

Comments