C # 에서의 객체의 의미
- C#은 객체 지향 프로그래밍(OOP)
- 객체는 메모리에서 구조화된 데이터 덩어리로, 데이터를 저장하고 조작할 수 있는 단위.
- 클래스, 배열, 문자열 등 참조형 데이터를 저장하거나 다룰 때 사용하는 기본 단위
- C에선 문자열, 배열 둘 다 단순 데이터로써 메모리에 저장되었음
- 하지만 C#에선 다음의 정보들도 함께 저장하여 다루기에 문자열, 배열 둘 다 객체로 정의
- 문자열, 배열의 길이
- 특정 메서드 (length, sort...)
- 관련 metadata
- 이러한 객체들은 프로그램이 실행되는 도중인 runtime에 생성된다
배열
이전 장의 내용에 이어서...
배열 메모리
int, float 같은 값 형식의 배열
- int[] myArray = {0, 1, 2};
- stack에 저장된 참조 변수 myArray는 heap에 생성된 배열 객체를 참조
- myArray가 배열객체의 주소의 시작점을 값으로 가짐
- heap에 존재하는 배열 객체는 다음의 정보를 관리
1) 배열의 길이 : 3
2) 배열의 요소 : 0, 1, 2라는 값을 저장
3) 여러 관련 정보
- 이렇듯 값 형식의 배열은 배열 내부에 값을 직접 저장

string 같은 참조형식의 배열
- string[] monsters = { "fly", "womb", "crab" };
- stack에 저장된 참조 변수 monsters가 heap에 생성된 배열 객체의 시작 주소를 값으로 가짐(참조)
- heap에 존재하는 배열 객체는 여러 관련 정보를 관리
1) 배열의 길이
2) 배열의 요소 : 주소값
3) 여러 관련 정보
- 참조형식의 배열은 배열의 요소에서 문자열을 저장하지 않고 문자열객체가 저장되어 있는 heap 주소를 가리킴

배열의 성질
- C처럼 값 형식 배열의 경우 data끼리 붙어있어 pointer로 접근 용이

- fixed size로 사용. 요소의 개수가 변하는 data의 집합으로써는 효율적이지는 않음.
1) 실제 data가 모자르면 메모리 낭비
2) data가 넘치면 에러
배열 iteration(순회)
string[] monsters = { "fly", "womb", "crab" };
for (int i = 0; i < monsters.Length; i++) {
Debug.Log($"{i + 1}단계 몬스터 : {monsters[i]}");
}

foreach : 요소의 각 값을 변수로 받아 사용
- read-only. 순회하면서 값 수정 불가능
- 부분 순회 불가능. 무조건 전체 순회
foreach (var monster in monsters) {
Debug.Log($"{monster}");
}

다차원 배열
float[,] temperatures = new float[12, 31];
temperatures[5, 14] = 20.5f;
Debug.Log(temperatures[5, 14]);

int[,,] dim3 = {
{ { 0, 1 }, { 2, 3 } },
{ { 4, 5 }, { 6, 7 } },
{ { 8, 9 }, { 10, 11 } }
};
Debug.Log(dim3[1, 1, 0]);

다차원에서의 for, foreach는 C에서와 마찬가지로 nested loop를 통해 해주면 된다
What's Next
References