foreach 문에 대해 공부해보자.
foreach는 반복문에 배열을 곁들인 무언가이다.
형식은 foreach(자료형 변수명 in 배열) { 필드 } 로 구성되며
배열의 길이만큼 변수명을 출력한다. 라고 하면 잘 이해가 안되니
using System;
string[] inventory = { "sword", "shield", "ruby", "sapphire" };
foreach (string a in inventory)
{
Console.WriteLine(a);
}
스크립트를 작성해보자.
인벤토리라는 문자열형 배열 안에는 4가지의 물건들이 들어있다.
foreach를 통해 string a라는 물건들은 inventory배열의 길이만큼 반복하게 될 것이다.
이 경우에는 4회다.
실행해보면?
이런 식으로 동작하게 된다.
이번엔 다차원 배열에 대해 배워보자.
여태 많은 배열들을 사용해왔는데 모두 자료형[] 변수명으로 선언해왔었다.
크게 다르지는 않은데 이번에는 자료형[,] 변수명으로 선언을 한다면?
int [,] arr2D = new int{5,5}; 라는 방식으로 선언해보자.
이 배열은 여태 배열과 다른 점이 있다
바로 표 형식이라고도 볼 수 있는데 표를 삽입해서 알아보자.
0,0 | 0,1 | 0,2 | 0,3 | 0,4 |
1,0 | 1,1 | 1,2 | 1,3 | 1,4 |
2,0 | 2,1 | 2,2 | 2,3 | 2,4 |
3,0 | 3,1 | 3,2 | 3,3 | 3,4 |
4,0 | 4,1 | 4,2 | 4,3 | 4,4 |
즉 지금 만든 배열은 5 * 5의 크기를 가지고 있다
마찬가지로 int[,,] arr3D = new int[5,5,5]를 사용한다면 125의 크기를 가지는 배열이 만들어진다.
유니티에서의 position이나 rotation등 3d값도 모두 3차원 배열의 일종이다.
색상은 무려 4차원이다. (R*G*B*A)
이런 식으로 많은 정보량을 단 하나의 변수 이름으로 심어둘 수 있다. 참고하자. 참고하라고 ㅋㅋㅋ
2차원 배열을 이용해서 단순한 게임 맵을 콘솔로 구현해보자.
이런 식으로 2D 데이터로 다뤄줄 수도 있다.
나중에 캐릭터를 추가해주고 w를 입력한다면 4,2에서 3,2로 전진하게 만들어준다면
충분히 맵의 기능을 하고있다고 할 수 있지 않을까?
자 이번엔 리스트에 대해서 알아보자.
리스트 또한 일종의 배열이지만 크기가 정해져있지 않다.
배열은 선언 시에 int[] arr = new int[3]; 이런 식으로 선언 시에 크기를 정해야만 생성이 가능한데 비해
리스트의 경우에는 크기가 가변적으로 Add나 Remove를 사용하여 리스트에 데이터를 추가 및 삭제가 가능하다.
선언 시에는 배열과 비슷하다.
List<자료형> 리스트이름 = new List<자료형>(); 이며 예시를 들자면
List<int> numbers = new List<int>(); 이런 식으로 작성할 수 있다.
안에 들어있는 데이터들은 foreach문을 통해 접근 할 수 있으며
일반적인 다른 반복문으로 접근할 수도 있다.
하지만 List는 Length가 없어서 Count라는 크기를 가진다.
이런 식으로 접근 할 수 있다.
다음
Dictionary라는 구조형도 있다.
키와 값으로 구성된 데이터를 저장하는데 이는 데이터베이스의 PK와 값들의 관계와 유사하다.
Dictionary는 중복된 키를 가질 수 없으며, 키와 값은 한 쌍을 이룬다.
데이터베이스의 Primary Key와 거의 같다.
선언법은 Dictionary<자료형,자료형> 변수명 = new Dictionary<자료형,자료형>; 이며
예시를 들자면
Dictionary<int,string> itemcode = new Dictionary<int,string>(); 이런 식이다.
게임에 모드질 좀 해본 사람은 모드 충돌로 인해 게임 이미지가 깨지거나 하는 경우가 있을텐데
대부분 모드로 추가된 itemcode가 다른 모드의 itemcode와 겹치거나 하는 방식이기 때문이다.
List와 마찬가지로 Add나 Remove를 통해 값을 추가하거나 삭제할 수 있으며
foreach나 for문을 통해 접근할 수도 있다.
Dictionary<int,string> itemcode = new Dictionary<int,string>();
itemcode.Add(001, "water");
itemcode.Add(002, "wood");
itemcode.Add(003, "steel");
foreach(KeyValuePair<int,string> pair in itemcode)
{
Console.WriteLine(pair.Key + pair.Value);
}
근데 출력은 쪼금 다르다.
foreach(KeyValuePair<자료형,자료형> 변수명 in Dictionary명)인데
접근할때도 보면 Key와 Value가 나눠진 것을 볼 수 있다.
다음은 Stack과 Queue이다.
Stack은 후입선출 구조를 가진 자료이며
Queue는 선입선출의 구조를 가진다.
뭔 소리냐면 Stack의 경우 foreach로 출력시 마지막으로 Add된 순서대로 출력되고
Queue는 처음 Add된 순서대로 출력된다.
리스트는 동적으로 크기를 조정할 수 있어서 배열과 다르게 그 때 그 때 추가하는 식으로 사용하기 편하지만
반대로 메모리 사용량이 배열에 비해 굉장히 크며
메모리 한 군데에 몰려있는 배열과 다르게 여기저기 흩어져있는 리스트는 접근 시간도 오래걸리고
코드를 작성하는 중에 여기저기서 리스트에 추가한다면 직관적이지 못해지는 결과가 나온다.
즉 꼭 필요하지 않은 상황이라면 배열을 사용하는게 옳다.
오늘 TIL 여기까지!
0920 TIL - C#으로 텍스트 게임 만들기 1 (0) | 2024.09.20 |
---|---|
0919 TIL - C# 기초 문법 심화2 (4) | 2024.09.19 |
0912 TIL - 미니 프로젝트 완성! (0) | 2024.09.12 |
0911 TIL - 하다가 막힘... (0) | 2024.09.11 |
0910 TIL - C# 접근 지정자, 클래스, 상속 (2) | 2024.09.10 |