C# 값 타입, 참조 타입

김현승·2024년 4월 27일
0

C#

목록 보기
1/13

C#에서 데이터 타입은 크게 두 가지 범주로 나눌 수 있습니다: 값 타입(Value Type)과 참조 타입(Reference Type). 이 두 타입의 주된 차이는 데이터가 저장되는 위치와 데이터를 어떻게 할당하고 복사하는지에 있습니다.

값 타입(Value Type)

  • 저장 장소: 값 타입은 데이터를 스택(Stack) 메모리에 직접 저장합니다.
  • 저장 방식: 값 타입의 변수를 할당할 때는 해당 변수에 데이터의 실제 값이 저장됩니다.
  • 해당 타입: 값 타입의 예로는 기본 데이터 타입(int, double, char 등), 구조체(struct), 그리고 열거형(enum)이 있습니다.
  • 상속: 항상 System.ValueType 로부터 상속 받습니다.

특징:

  • 값 타입의 변수를 다른 변수에 할당하면, 해당 값의 복사본이 생성되어 별도의 메모리 공간에 저장됩니다. 따라서 원본 변수와 복사본은 서로 독립적입니다.
  • 값 타입은 메소드에 매개변수로 전달될 때도 복사되어 전달됩니다(값에 의한 전달).

예시:

int a = 10;
int b = a;  // 'b'는 'a'의 복사본을 가짐, 서로 독립적
b = 20;     // 'b'의 값을 변경해도 'a'에는 영향 없음

참조 타입(Reference Type)

  • 저장 장소: 참조 타입은 데이터를 힙(Heap) 메모리에 저장합니다.
  • 저장 방식: 변수에는 데이터가 저장된 힙의 주소(참조)가 저장됩니다.
  • 해당 타입: 참조 타입의 예로는 클래스(class), 배열(array), 대리자(delegate), 인터페이스(interface) 등이 있습니다.
  • 상속: 항상 System.ObjectType 로부터 상속 받습니다.

특징:

  • 참조 타입의 변수를 다른 변수에 할당하면, 힙 메모리 주소의 참조가 복사됩니다. 따라서 두 변수는 같은 객체를 참조하게 됩니다.
  • 참조 타입은 메소드에 매개변수로 전달될 때 참조가 전달됩니다(참조에 의한 전달). 이는 메소드 내에서 객체의 상태가 변경될 경우 원본 객체에도 그 변경사항이 반영된다는 것을 의미합니다.

예시:

class MyClass {
    public int Value { get; set; }
}

MyClass c1 = new MyClass();
c1.Value = 10;

MyClass c2 = c1;  // 'c2'와 'c1'은 같은 객체를 참조
c2.Value = 20;    // 'c2'를 통해 값을 변경하면 'c1'의 'Value'도 20으로 변경됨

성능과 사용

  • 값 타입은 작은 크기의 데이터를 빠르게 복사하고 처리할 때 유용합니다. 스택 메모리를 사용하기 때문에 가비지 컬렉션의 부하가 적습니다.
  • 참조 타입은 크기가 크거나 복잡한 객체를 관리할 때 적합합니다. 힙 메모리를 사용하므로, 메모리 관리는 가비지 컬렉터가 담당하게 됩니다.

0개의 댓글