본문 바로가기

.NET/C#

C# value타입 vs Reference타입

728x90
반응형

제목을 이렇게 정하는게 맞는지 고민되네요. 저 두타입을 심도깊게 비교하자는게 아니고 기초적으로 알아보고자 합니다

저도 자세히는 알지 못하는지라(그러면서 왜 글을써 올려 라고 말씀하신다면 저...충격 ㅜㅜ) 아는 범위 안에서 써보겠습니다.

우선 메모리에 관련해서 이야기를 해보아야 할꺼같네요

자세히는 모르겠지만(또또 이러고 있네요 ㅜㅜ) code, data(static), stack(지역), heap(동적)으로 나눌 수 있습니다.

여기서 봐야될 것은 stack과 heap입니다.

stack은 생성, 소멸시 메모리가 자동으로 관리가 이루어집니다. 메모리의 이름을 지정할 수 있습니다.즉 메모리 자체를 하나의 변수의 지정 메모리로 생각하는 것이지요. 컴파일시에 크기가 결정되는 특징을 가지고 있습니다. 일명 value type이라고도 하지요~

heap의 경우는 동적으로 활당을 받게 됩니다. 생성, 소멸시 수동으로 관리를 해주어야 하죠. 그래서 heap의 경우 open을 하였다면 꼭 close를 해주어야 메모리 관리가 제대로 이루어 지게 됩니다. 혹시 해주지 않을시에는 작은 프로그램에서는 큰 상관이 없을지도 모르겠지만 좀만 큰 프로그램이 돌아간다면 그때는 메모리의 부하가 심해질 수 있으니 주의 해야겠지요. 그리고 이름의 사용이 불가능 하다는 특징이 있습니다. 값 자체를 메모리에 담는게 아니고 그 값을 가지고 있는 곳의 주소를 간직하고 있는 것이지요. 요놈은 Refernce type이라고 불립니다~

value type에는 struct, enum이 있고 heap type에는 class가 있습니다~

이론은 우선 여기서 살짝 그만 하고 테스트를 통해 알아보도록 하겠습니다. 솔직히 이부분은 이론과 테스트만으로는 쉽게 알 수 있는 부분은 아니라고 생각됩니다. 어느정도 프로그래밍의 경험이 필요한 부분이라고 생각이 들지요.

간단히 struct와 class의 차이를 봐보도록 할게요~

간단한 테스트를 위해서 따로 class를 생성하지 않고 한 곳에 모아 테스트를 해보도록 할게요
type이라는 프로젝트를 생성을 하고 코드를 넣어보도록 하겠습니다

    1 using System;

    2 using System.Collections.Generic;

    3 using System.Linq;

    4 using System.Text;

    5 

    6 namespace type

    7 {

    8     class Program

    9     {

   10         struct TheStruct //Value Type

   11         {

   12             public int Data;

   13         }

   14 

   15         class TheClass //Reference Type

   16         {

   17             public int Data;

   18         }

   19 

   20         static void Main(string[] args)

   21         {

   22             TheStruct st = new TheStruct();

   23             st.Data = 10;

   24             TheStruct st2 = st;

   25             st2.Data = 20;

   26             Console.WriteLine("st.Data : {0}", st.Data);

   27 

   28             TheClass cl = new TheClass();

   29             cl.Data = 10;

   30             TheClass cl2 = cl;

   31             cl2.Data = 20;

   32             Console.WriteLine("cl.Data : {0}", cl.Data);

   33         }

   34     }

   35 }

다음과 같이 넣고 실행을 시켯을때 (Ctrl + F5) 결과를 보면 '얘 왜이래' 라는 생각을 하시는 분들도 있을겁니다. 결과는

위에 같이 나옵니다. 결과를 보면 st의 값은 변하지 않았는데 cl의 값은 변한 것을 볼 수 가 있지요 이런 결과가 나오는 것은 바로 value 타입과 Reference 타입의 차이점이라고 할 수 있습니다.

struct는 value 타입이므로 st2가 변한다 하더라도 st에는 영향을 미칠수 없던 것이고 cl을 cl2에 대입했을 때 cl의 값을 넘긴게 아니고 cl의 주소값을 넘긴것이지요 그래서 cl2를 변경했을 때 cl이 가지고 있는 주소의 값이 같이 변경이 되는 것입니다. 그래서 결과가 다음과 같이 나오게 된것이지요.

허접한 설명이었지만 두 타입에 대해서 어느정도 이해가셨으면 하는 바램입니다~^ㅡ^

지루한 글 봐주시느라 수고하셨고 감사합니다~~

728x90
반응형

'.NET > C#' 카테고리의 다른 글

Class(2)  (0) 2009.12.16
Class(1)  (0) 2009.12.16
C# enum, struct  (0) 2009.12.16
C# Array 에 대해서...  (2) 2009.12.16
C# 메소드  (0) 2009.12.15
C# 반복문  (0) 2009.12.15
C# 성적 관리 프로그램(단순 학점 부여)  (0) 2009.12.15
C# 기초 계산기  (0) 2009.12.15
C# 타입  (0) 2009.12.15
시샵 기초중에 기초 Hello world 시작하기  (0) 2009.12.15