반응형

C# 값 형식(Value Type)과 참조 형식(Reference Type)

  • C#을 배우다 보면 값 형식(Value Type)과 참조 형식(Reference Type)의 차이에 대해 궁금해하는 경우가 많습니다.
  • 이는 C#뿐만 아니라 대부분의 프로그래밍 언어에서 중요한 개념이며, 성능 및 메모리 관리와도 밀접한 관련이 있습니다.
  • 이번 글에서는 값 형식과 참조 형식의 차이를 이해하고, 이를 올바르게 사용하는 방법을 알아보겠습니다.

1. 값 형식(Value Type)과 참조 형식(Reference Type)의 기본 개념

  • C#에서 데이터 형식은 크게 값 형식참조 형식 으로 나뉩니다.

1.1. 값 형식(Value Type)

  • Stack 메모리 에 저장됩니다.
  • 변수를 할당하면 값 자체를 복사 합니다.
  • 변경 시 원본 데이터에는 영향을 주지 않습니다.
  • 대표적인 값 형식: int, double, char, bool, struct, enum

  • csharp

      int a = 10;
      int b = a; // a의 값을 b에 복사
      b = 20;
      Console.WriteLine(a); // 10
      Console.WriteLine(b); // 20
    
  • 위 코드에서 a의 값을 b에 복사했기 때문에 b의 값을 변경해도 a에는 영향을 주지 않습니다.


1.2. 참조 형식(Reference Type)

  • Heap 메모리 에 저장됩니다.
  • 변수를 할당하면 참조(메모리 주소)를 복사 합니다.
  • 변경 시 원본 데이터에도 영향을 줍니다.
  • 대표적인 참조 형식: string, array, class, interface, delegate

  • csharp

      class Person {
          public string Name;
      }
      
      Person p1 = new Person();
      p1.Name = "Alice";
      Person p2 = p1; // p1의 참조를 p2에 복사
      p2.Name = "Bob";
      Console.WriteLine(p1.Name); // Bob
      Console.WriteLine(p2.Name); // Bob
    

  • 여기서 p1p2는 같은 객체를 참조하므로 p2.Name을 변경하면 p1.Name도 영향을 받습니다.

2. 값 형식과 참조 형식의 메모리 구조

형식 저장 위치 저장 내용
값 형식 Stack 데이터 값 자체
참조 형식 Heap 메모리 주소 (참조)

  • Stack속도가 빠르고 작은 크기의 데이터 를 저장하는 데 적합.
  • Heap크기가 큰 객체를 저장에 적합 하고 가비지 컬렉터(GC)에 의해 관리.

3. 값 형식과 참조 형식의 차이를 활용하는 방법

  • (1) 값 형식은 변경되지 않는 데이터를 저장할 때 사용
    • 예: 좌표 값(struct), 간단한 설정 값(enum)
  • (2) 참조 형식은 크기가 크고 변경이 필요한 데이터를 저장할 때 사용
    • 예: 사용자 정보(class), 데이터 목록(List<T>, Dictionary<K,V>)

4. 구조체(struct)와 클래스(class)의 참조 기능 차이

  • struct는 값 형식, class는 참조 형식입니다.
  • 작은 크기의 데이터는 struct로 만들고, 큰 객체는 class로 사용하는 것이 좋습니다.

  • csharp

      struct Point {
          public int X;
          public int Y;
      }
      
      Point p1 = new Point { X = 10, Y = 20 };
      Point p2 = p1; // 값 복사
      p2.X = 30;
      Console.WriteLine(p1.X); // 10
      Console.WriteLine(p2.X); // 30
    

5. 정리

  • 값 형식과 참조 형식의 차이를 이해하면 성능 최적화 및 버그 방지 에 큰 도움이 됩니다.

  • 값 형식은 독립적인 데이터 복사가 필요할 때 사용합니다.
  • 참조 형식은 공유 및 변경이 필요한 데이터를 관리할 때 사용합니다.
728x90
반응형

+ Recent posts