스택 메모리
- 값 형식을 저장하는 영역
- 코드 블록 안에서 생성된 변수들은 블록이 닫히면 메모리에서 제거됨
힙 메모리
- 참조 형식을 저장하는 영역
- 자동으로 제거되지 않으며, 가비지 컬렉터가 수거함
- 코드 블록이 사라지는 시점과 관계없이 데이터를 유지하고 싶을 때 사용
값 형식의 변수
- 스택 영역에 값을 저장함.
{
int variable = 1;
}
참조 형식의 변수
- 힙과 스택을 동시에 사용함.
- 힙 영역에는 데이터를 저장
- 스택 영역에는 데이터가 저장되어있는 힙 메모리의 주소를 저장
{
object temp = 1;
}
- 힙에는 1을 저장하고, temp는 값이 저장된 힙의 주소만 스택에 저장함
- 코드 블록이 끝나면 주소 값을 저장한 스택 영역은 사라진다.
- 참조가 없어진 1은 힙에 남아있다가 GC가 수거해감.
데이터 형식
byte | 1바이트 | 8비트 |
short | 2바이트 | 16비트 |
int | 4바이트 | 32비트 |
long | 8바이트 | 64비트 |
char | 2바이트 | 16비트 |
- 각각의 unsigned 형식은 표현 범위가 양수 쪽으로 2배.
float | 4바이트 | 32비트 | 유효숫자 소수점 7자리 |
double | 8바이트 | 64비트 | 유효숫자 소수점 15~16자리 |
decimal | 16바이트 | 128비트 | 유효숫자 소수점 28~29자리 |
bool | 1바이트 | 8비트 | 데이터의 최소단위가 1바이트! |
Object 형식
- 모든 데이터 형식의 부모
- 참조 형식의 데이터라 힙에 데이터를 할당함
박싱
- 값을 힙에 저장하고, 해당 메모리의 주소를 스택에 저장함
- 스택에 있는 데이터가 힙으로 복사되며, 할당 작업보다 최대 20배의 시간이 걸림.
object temp = 1;
언박싱
- 힙에 저장된 데이터를 복사하여 값 형식 변수에 저장.
- 힙에 있는 데이터가 스택으로 복사되며, 캐스팅 과정에 할당 작업보다 최대 4배의 시간이 걸림.
object a = 20;
int b = (int)a;
데이터 변환
- 부동소수점은 캐스팅 후 데이터가 부정확하기 때문에 == 비교가 false 가 나올 수 있다.
- Double.Epsilon 등을 사용하여 오차범위로 계산해야 함.
- 유니티는 Mathf.Epsilon을 제공함.
- docs.unity3d.com/ScriptReference/Mathf.Epsilon.html
if (a >= b - Mathf.Epsilon && a <= b + Mathf.Epsilon)
- 문자열 -> 숫자는 각각의 형식의 Parse(), TryParse() 메서드를 사용하여 변환 가능.
string temp = "12345"; // 불가능
string temp2 = int.Parse("12345"); // 가능
Nullable 형식
- 값을 가지고 있는지 여부까지 저장하는 형식. 할당하지 않고 사용하면 null오류가 난다.
int? a = null;
float? b = null;
if(a.HasValue) // null확인가능
if(a != null) // null 확인가능
'🌍 C# Study > C# 기초' 카테고리의 다른 글
C# 복습하기 6) 클래스 (0) | 2021.04.09 |
---|---|
C# 복습하기 5) 메소드 (0) | 2021.04.09 |
C# 복습하기 4) 코드의 흐름 제어 (역 for문, 역 반복문) (0) | 2021.04.09 |
C# 복습하기 3) 데이터 가공 (0) | 2021.04.09 |
C# 복습하기 2) 문자열 다루기 (0) | 2021.04.08 |