타입(Type)이란?
- 값이 메모리에 저장되고, 어떻게 처리하는지 나타내준다.
- 메모리 저장 영역은 크게 4단계이다.
- Code : 기계어 코드가 들어가며, 읽기 전용의 데이터이다. CPU가 명령을 읽고 처리한다.
- Data : 전역, 정적 변수가 들어간다, 프로그램의 시작에 할당되고, 종료 시점에 소멸한다.
- Heap : 프로그래머가 직접 할당, 해제하는 메모리이다, 메모리 위쪽 주소부터 할당된다.
스택 영역을 침범하게 되는 경우를 힙 오버 플로우(Heap over flow)라고 한다.
- Stack : 잠시 동안 사용될 임시 메모리 영역이다, 메모리 아래쪽 주소부터 할당된다.
힙 영역을 침범하게 되는 경우를 스택 오버 플로우라고(Stack over flow) 한다.
- 리터럴 데이터
- 변수에 직접 써주는 값들을 리터럴이라고 한다.
- 예 : ) int a = 10;
위의 예제에서 10이 리터럴 값이다.
값 타입(value type)과 참조 타입(reference type)
- 값 타입(value type) : 실제 데이터가 아닌 그 사본을 가리킨다. null값을 가질 수 없다.
- 값 자체가 변수명과 함께 스택에 저장이 된다.
- 예 : ) int, float, bool…
- 참조 타입(reference type) : 저장된 실제 데이터를 가리킨다. 두 개 이상의 변수가 하나의 값을 가리킬 수 있다.
- 값을 별도의 힙(Heap)에 저장을 하고, 값을 가리키는 메모리 주소를 변수명과 함께 스택(Stack)에 저장한다.
- 예 : ) Vector3, Array, String…
값 타입(value type)과 참조 타입(reference type)의 구분
- 값을 직접 가리키고 있는지, 혹은 참조를 통해서 값을 가리키고 있는 지에 따라서 구분된다.
- 변수의 생성과 동시에 메모리가 생기는지, 혹은 변수가 생성되고 new 키워드로 메모리가 생성되는 지에 따라서 구분된다.
필드 타입(field type)
- 구조체나 클래스 내에 선언된 변수의 타입을 의미한다.
클래스 타입(class type)
- 사용자가 필요로 하는 값을 담기 위한 사용자 정의 타입이다.
Null과 Nullable Type
- Null : 어떠한 데이터도 가지고 있지 않음을 의미한다.
- Nullable Type : null값을 가질 수 없는 타입에서, null값을 가질 수 있게 해준 타입이다.
int a, b;
a = 10;
b = a;
a++;
Debug.Log(a);
Debug.Log(b);
//a와 b의 결과값이 다르게 나온다.
// a와 b의 값은 같지만, a와 b가 하나의 값을 가리키는 것이 아닌,
//a = b를 통해서 두 변수 각각 10이라는 값을 가지고 있는 것이다.
Vector3 a, b;
a = GameObject.Find("Player").transform.position;//Player.transform.position = new Vector3(0, 0, 0);
b = a;
a += new Vector3(0, 1, 2);
Debug.Log(a);
Debug.Log(b);
//a와 b의 결과값이 같게 나온다.
// b = a는 a와 b가 같은 값을 가지게 되는 것이 아니다, a는 값을 저장하는 것이 아닌 값의 주소로, b = a를 해주는 과정에서 서로 같은 값의 주소를 가리키게 된 것이다.
//그렇기에 한쪽의 값이 바뀌면, 같은 주소를 가리키던 변수 모두에 영향이 있다.
//위와 같은 현상을 부수효과라고 한다.