04
08

스택 메모리

 - 값 형식을 저장하는 영역

 - 코드 블록 안에서 생성된 변수들은 블록이 닫히면 메모리에서 제거됨

 

힙 메모리

 - 참조 형식을 저장하는 영역

 - 자동으로 제거되지 않으며, 가비지 컬렉터가 수거함

 - 코드 블록이 사라지는 시점과 관계없이 데이터를 유지하고 싶을 때 사용

 

값 형식의 변수

 - 스택 영역에 값을 저장함.

{
    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 확인가능



 

COMMENT