배열 선언
string[] game = new string[3];
간단….하지만 기존 언어와 비교해봤을 때 굉장히 많은 것이 보인다.
일단 string[]
, int[]
같이 자료형에 배열이라고 명시를 해준다.
이런 점은 확실히 좋다.
C#에서도 나중에 char[]
와 string
의 차이를 찾아보는 것이 좋겠다.
가장 당황했던 점은 처음부터 new
, 즉 동적할당을 사용했다는 것이다.
찾아보니 배열을 정적할당하는 것은 불가능한가보다.
이래서 알고리즘 문제 풀이 때 C#을 잘 안쓰는건지.
참고) 스택(Stack)과 힙(Heap)
정적할당 vs 동적할당, 스택(Stack) vs 힙(Heap), 값 형식(Value Type) vs 참조 형식(Reference Type)
나도 리마인드 겸 구글링을 하다가 야무지게 설명해주는 좋은 글을 찾았다.
처음에는 무지막지하게 헷갈릴 수 있지만, 넘어가자. 이제 너무 많이 보니까 구분이 안될 수가 없는 정도이다.
이들에 대해선 객체에 대해 다룰 때 더욱더 자세하게 이야기해보도록 하겠다.
배열의 저장과 활용
string[] game = new game[3];
game[0] = "Leage of Legends"
game[1] = "메이플 스토리"
Console.WriteLine(game[0]);
Console.WriteLine(game[1]);
선언을 한 뒤에는 저장하고 활용하는 건 가뿐하다.
배열이 보다 강력한 기능을 할 때는 반복문과 결합될 때이다.
int[] year = new int[4]
for(int i = 0 ; i < 4 ; i++)
{
year[i] = 2020 + i;
Console.WriteLine(year[i]);
}
foreach
배열과 반복문을 같이 사용할 때 for
대신 foreach
라는 것을 쓸 수 있다.
string[] games = new string[3] {"League of Legends", "메이플 스토리", "디아블로"}
foreach(string game in games)
{
// 0번째 반복시 game : League of Legends
// 1번째 반복시 game : 메이플 스토리
// 2번째 반복시 game : 디아블로
Console.WriteLine(game);
}
C++에도 for를 비슷하게 사용할 수 있었는데,
C#은 foreach
와 in
을 사용해서 그런가 훨씬 더 직관적.
다차원 배열
배열은 일종의 한 줄짜리 데이터라고 생각하면 된다.
하지만 지도의 좌표 같은 데이터들을 보면 2차원으로 이루어져 있기 때문에 데이터를 2차원으로 저장할 필요성이 느껴지는 경우가 있다.
이를 위해 배열을 다차원으로 선언할 수 있는 기능 역시 지원한다.
int[,] arr = new int[2, 3];
arr[0, 1] = 1;
선언과 접근 역시 기존의 배열과 매우 유사하다.
int[,] pattern = new int[5,5]
{
{ 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 0 },
{ 0, 0, 1, 0, 0 },
{ 0, 1, 0, 1, 0 },
{ 1, 0, 0, 0, 1 }
};
for(int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
Console.Write(pattern[i, j]);
Console.WriteLine();
}
역시 중첩 for문과 연계해서 사용하기 좋다.
List
배열이 참 유용하지만 불편한 부분이 좀 있다.
처음에 크기를 정해줘야 하고, 그 크기를 도중에 변경할 수 없다는 것이다.
크기를 유동적으로 바꿀 수 있는 형태의 배열이 필요한 것이다.
당연히 C#에 구현이 되어 있고,
List
라는 이름의 동적 배열이 바로 그것이다.
처음에 작은 크기를 선언해도, 공간이 부족한 상황이 발생해 크기를 증가해야 하면, 더 큰 새로운 배열을 선언해서 그곳에 기존의 데이터를 모두 옮기는 방식을 사용하게 된다.
using System.Collections.Generic;
List<int> list = new List<int>();
List
역시 클래스이기 때문에 new
를 사용한다.
여기서 System.Collections.Generic;을 추가해야 List의 사용이 가능한데, Generic은 어떤 타입이든 넣을 수 있게 만들어주는 문법이다.
자세한 건 나중의 게시글에서 다루도록 하자.
List<int> list = new List<int>();
for (int i = 0; i < 5; i++)
{
list.Add(i);
Console.WriteLine(list[i]);
}
배열과 같이 접근할 수 있고,
요소 추가는 Add()
라는 함수를 사용할 수 있다.
다른 언어의 Append와 똑같다.
다른 기능들은 다음과 같다.
list.Insert(2, 999); // 2번째 인덱스에 999를 집어넣음
bool success = list.Remove(3); // 처음 만나는 3을 제거함
list.RemoveAt(3); // 3번째 인덱스의 데이터를 제거함
list.Clear(); // 리스트의 내용 전체 삭제
하지만 해당 Insert()
와 Remove()
같은 내용들은 시간복잡도 상 그렇게 효율적이지 못하다.
삽입과 삭제 시 뒤의 데이터들을 이동해줘야 하는 데에서 발생하는 문제이다.
Dictionary
배열은 정수 인덱스를 이용해서만 접근이 가능하다는 사실이 때로는 번거로울 때가 있다.
어느 인덱스에는 이름을 붙여줘야할 필요성이 있다는 것이다.
그래서 존재하는 것이 Dictionary이다.
Dictionary는 Key와 Value의 쌍으로 데이터를 저장하게 된다.
Dictionary<string, float> dic = new Dictionary<string, float>();
Dictionary 역시 Key와 Value로 자료형을 다 받을 수 있다.
class 역시 받을 수 있다.
참고로 Dictionary는 Hashtable이라는 것을 사용한다.
메모리를 추가로 사용해 빠른 접근을 구현한 것인데, 크기가 매우 커져도 데이터를 빠르게 찾을 수 있는 이유이다.
Uploaded by N2T
'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글
[내일배움단] 사전캠프 C# TIL 7. 클래스와 객체 (0) | 2023.07.21 |
---|---|
[내일배움단] 사전캠프 C# TIL 6. 함수 (0) | 2023.07.21 |
[내일배움단] 사전캠프 C# TIL 4. 제어문 (1) | 2023.07.20 |
[내일배움단] 사전캠프 C# TIL 3. 연산자 (0) | 2023.07.19 |
[내일배움단] 사전캠프 C# TIL 2. 데이터 다루기 (0) | 2023.07.18 |