값(value) 형 변수가 실제 데이터 값을 직접 가지고 있는 경우
값(value) 형은 스택(stack) 메모리 공간에 저장되며, 할당 연산을 했을 때 별도의 메모리 영역에 할당
레퍼런스(reference) 형 변수가 실제 데이터 값이 있는 곳을 가리키는 값을 갖는 경우
레퍼런스(reference) 형은 힙(heap) 메모리 공간에 저장
할당 연산을 했을 때 힙 메모리 공간을 가리키는 레퍼런스 변수 값 사이에서 할당이 일어남
IntObj r1 = new IntObj();
스택(Stack)데이터 값을 임시로 저장하는 메모리 영역으로, 보통 메서드의 인자, 메서드 안에 선언한 변수들이 스택 공간에 할당
힙(Heap)일반적인 데이터 값을 할당하는 메모리 영역으로, 변수에 바로 데이터 값이 있는 것이 아니라 new 연산
자를 사용해서 메모리를 할당하고 값을 저장
class
Test {
static void Main()
{ int
v1 = 100; int
v2 = v1;
Console.WriteLine(
"v1 : {0} v2 : {1}", v1, v2 ); // 100, 100
v2 = 200;
Console.WriteLine(
"v1 : {0} v2 : {1}", v1, v2 ); // 100, 200
} }
레퍼런스(Reference) 형
int 형 멤버를 갖는 클래스를 하나 정의멤버 값을 바꾸게 되면 해당 변수뿐만
아니라 다른 변수에도 영향을 준다
r2에 값을 할당하는 경우, r1과 r2가 값이 동시에 바뀌며, 이유는 같은 힙 메모리 공간
을 가리키고 있기 때
using System;
class IntObj
{
public int val = 100;
}
exam)
using System;
class IntObj
{
public int val = 100;
}
class test
{
static void Main()
{
IntObj r1 = new IntObj();
IntObj r2 = r1;
Console.WriteLine( "r1 : {0} r2 : {1}", r1.val, r2.val ); // 100, 100
r2.val = 200;
Console.WriteLine( "r1 : {0} r2 : {1}", r1.val, r2.val ); // 200, 200
}
}
출처 : http://ssogarif.tistory.com/entry/C%EC%97%90%EC%84%9C%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%98%95
'소프트웨어 > C# & ASP.NET' 카테고리의 다른 글
연산자 오버로딩 - 인덱스 (0) | 2009.08.06 |
---|---|
C# 디버깅 (0) | 2009.08.06 |
닷넷 3.5를 이용한 디자인 패턴의 구현 (4) (0) | 2009.08.05 |
ILMerge - 닷넷 어셈블리를 하나의 파일로 묶어주는 툴 (0) | 2009.07.29 |
MSDN 웹 캐스트 시리즈 (0) | 2009.07.29 |