C#/TIL(Today I Learned)

2025-03-19 <값 타입과 참조 타입>

프린스 알리 2025. 3. 19.

Intro

스택 : 임시 메모장
힙 : 필기 노트

값 타입(Value Type)

스택(Stack)에 저장됨

  • 값 타입 변수는 메모리의 스택 영역에 직접 저장된다.
  • 함수나 블록이 끝나면 자동으로 메모리에서 제거된다.

변수를 복사할 때 값 자체가 복사됨

  • 값 타입 변수를 다른 변수에 할당하면 값 자체가 복사되므로, 두 변수는 독립적인 값을 가진다.
  • 한 변수를 변경해도 다른 변수에는 영향을 주지 않는다.

기본적으로 불변(Immutable)적 성질을 가짐

  • 변수를 다른 변수에 할당하면 복사(copy)되므로, 한쪽 변수를 변경해도 원본 값에는 영향을 주지 않는다.

가비지 컬렉션(GC)의 영향을 받지 않음

  • 값 타입은 스택에 저장되므로 가비지 컬렉션의 대상이 아니다.
  • 스택에서 빠르게 생성 및 해제되므로 성능이 좋다.

값 타입의 종류

기본 데이터 타입(Primitive Types)

  • int, double, float, bool, char
  • 구조체(struct), 열거형(enum)

값 타입 예제

int a = 10;
int b = a; // 값이 복사됨
b = 20;

Console.WriteLine(a); // 10 (a는 변경되지 않음)
Console.WriteLine(b); // 20 (b만 변경됨)

참조 타입(Reference Type)

힙(Heap)에 저장됨

  • 참조 타입 변수는 메모리의 힙 영역에 저장된다.
  • 변수를 선언하면 해당 객체의 참조(메모리 주소)만 스택에 저장된다.

변수를 복사할 때 참조(메모리 주소)가 복사됨

  • 참조 타입 변수를 다른 변수에 할당하면 메모리 주소가 복사되므로, 같은 객체를 가리킨다.
  • 한 변수를 변경하면 다른 변수도 영향을 받는다.

가비지 컬렉션의 영향을 받음

  • 참조 타입 데이터는 힙에 저장되므로, 사용이 끝난 후엔 가비지 컬렉션에 의해 정리된다.
  • 기준은 참조 여부. 더 이상 참조되지 않는 객체는 자동으로 메모리에서 해제된다.

참조 타입의 종류

클래스(class)

class Car {
    public string Model;
}

Car car1 = new Car { Model = "Tesla" };
Car car2 = car1; // 참조 복사
car2.Model = "BMW";

Console.WriteLine(car1.Model); // BMW

배열(array)

int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1; // 참조 복사
arr2[0] = 100;

Console.WriteLine(arr1[0]); // 100 (같은 배열을 가리킴)

문자열(string)

  • 문자열은 조금 특이하다. 참조 타입이지만 불변 속성을 가진다.
string str1 = "hello";
string str2 = str1; // 새로운 문자열을 가리킴
str2 = "world";

Console.WriteLine(str1); // hello (변경되지 않음)

이외에도 인터페이스, 델리게이트가 참조 타입에 속한다.

댓글