상세 컨텐츠

본문 제목

0913 TIL - C# 기초 문법 심화

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 9. 13. 21:30

본문

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 여기까지!

관련글 더보기