2020년 7월 22일 수요일

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

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

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=382

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#의 가비지 수집 시스템에서 이 메모리가 더 이상 필요하지 않다고 판단할 때에만 회수된다. 참조 형식을 선언하면 오버헤드가 커지지만 참조 형식은 다른 클래스에서 액세스할 수 있다는 장점이 있다.

[Reference Type 예제]

using System;

namespace ConsoleApplication1

{

class Rtype

{

public object Value;

}

class Program

{

static void Main(string[] args)

{

Rtype a = new Rtype ();

Rtype b = new Rtype ();

a.Value = 1; b = a; //a가 참조하는 것을 b도 참조한다.

Console.WriteLine(a.Value); Console.WriteLine(b.Value);

b.Value = 2;

Console.WriteLine(a.Value); Console.WriteLine(b.Value);

}

}

}

[결과]

1

1

2

2

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...