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 (변경되지 않음)
이외에도 인터페이스, 델리게이트가 참조 타입에 속한다.
'C# > TIL(Today I Learned)' 카테고리의 다른 글
2025-03-24 <C# 스택 클래스와 성능 최적화> (0) | 2025.03.24 |
---|---|
2025-03-21 <해시 테이블(Hashtable)이란?> (0) | 2025.03.21 |
2025-03-20 (2) <함수의 매개변수화 - 콜백함수와 delegate> (1) | 2025.03.20 |
2025-03-20(1) <내가 만든 데이터, Stack과 Heap 중 어디에 저장될까?> (0) | 2025.03.20 |
2025-03-18 <ref와 out> (0) | 2025.03.18 |
댓글