내일배움캠프 TIL

내일배움캠프 11일차 TIL "배열과 리스트"

Jooglorystar 2024. 9. 26. 22:12

 

 

이전에 3일차에서 게임을 만들며 배열을 가볍게 다룬적이 있었다.

이번엔 배열을 다시 한번 다루고, 추가로 리스트에 대해 알아볼 것이다.

 

 

1. 배열(Array)

 

public static void Main(string[] args)
{
    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    string[] words = { "Apple", "Bee", "Cat", "Dog" };

    Console.Write("nums = ");
    for (int i = 0; i < nums.Length; i++)
    {
        Console.Write(nums[i] + " ");
    }

    Console.WriteLine();

    Console.Write("words = ");
    for (int i = 0; i < words.Length; i++)
    {
        Console.Write(words[i] + " ");
    }
}

 

 

배열은 변수들을 저장할 수 있는 자료구조이다.

처음에 배열한 자료형만 배열에 저장할 수 있으며, 다른 자료형을 저장하려고 할 시에는 빌드오류가 발생한다.

 

위 예시 코드에서 int배열 nums에 문자열을 넣으려 시도한 모습

 

또한 처음에 선언한 크기만큼만 변수들을 저장할 수 있고, 그 이상의 인자에 접근하려 하면 오류가 발생한다.

선언되지 않은 5번째 인수 "Earth"를 넣어보자

 

 

다른 자료형을 저장하려 할 때와 다르게, 빌드는 되지만, 해당 코드가 쓰여진 곳에서 오류가 발생하는 것을 확인할 수 있다.

 

위 예시에서는 배열의 원소를 먼저 부여했지만, 빈 배열을 만드는 것도 가능하다.

 

public static void Main(string[] args)
{
    int[] nums = new int[10];

    Console.Write("nums = ");

    for (int i = 0; i < nums.Length; i++)
    {
        nums[i] = i + 1;
        Console.Write(nums[i] + " ");
    }

    Console.WriteLine();
}

 

 

10개의 원소를 가질 수 있는 정수배열 nums를 만들고, 각 원소를 i+1의 값으로 초기화한 코드이다.

 

 

배열 내부의 원소들을 정렬할 수도 있다.

 

public static void Main(string[] args)
{
    int[] nums = { 0, 3, 7, 3, 5, 4, 2, 9, 1 };

    Array.Sort(nums);

    Console.Write("nums : ");
    foreach (int i in nums)
    {
        Console.Write(i + " ");
    }
}

 

 

Array.Sort() 메서드를 이용하면 배열 내부의 원소를 오름차순으로 정렬할 수 있다.

내림차순 정렬하는 메서드는 따로 없지만, 역순으로 정렬하는 메서드는 있다.

 

public static void Main(string[] args)
{
    int[] nums = { 0, 3, 7, 3, 5, 4, 2, 9, 1 };

    Array.Reverse(nums);

    Console.Write("nums : ");
    foreach (int i in nums)
    {
        Console.Write(i + " ");
    }
}

 

 

Array.Reverse()는 해당 배열을 역순으로 배열한다.

 

만약 역순으로 정렬해야하는 일이 생긴다면, Sort로 오름차순 정렬 후, Reverse로 내림차순 정렬을 시도해볼 수 있다.

 

public static void Main(string[] args)
{
    int[] nums = { 0, 3, 7, 3, 5, 4, 2, 9, 1 };

    int[] newNums = new int[5];

  	Array.Copy(nums, newNums, newNums.Length);
    Array.Reverse(nums);

    Console.Write("nums : ");
    foreach (int i in nums)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();

    Console.Write("newNums : ");
    foreach (int i in newNums)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
}

 

 

Array.Copy(복사할 배열 , 복사받을 배열 , 복사할 크기)를 이용해 배열의 값을 복사할 수도 있다.

만약 복사할 크기가 두 배열 중 어느 것의 크기보다 크다면,

예를들어 예시 코드에서 Array.Copy(nums, newNums, nums.Length); 라고 바꿔 적을 경우 값이 나오지 않으며 오류가 발생한다.

 

 

 

 

이후에 언급하는 리스트는 '컬렉션'이라고 부르며, 배열처럼 변수들을 저장할 수 있는 자료구조이지만, 

처음 정해진 크기만 이용할 수 있는 배열과 다르게 크기를 가변적으로 설정할 수 있다.

C#에서 리스트 외에 이용할 수 있는 컬렉션은 딕셔너리(Dictionary), 큐(Queue), 스택(Stack) 등이 있지만, 오늘은 리스트만 다룰 것이다.

 

2. 리스트(List)

public static void Main(string[] args)
{
    List<int> list = new List<int>();

    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(4);

    Console.Write("list : ");
    for (int i = 0; i < list.Count; i++)
    {
        Console.Write (list[i] + " ");
    }

    Console.WriteLine();

    list.Remove(3);

    Console.Write("list : ");
    for (int i = 0; i < list.Count; i++)
    {
        Console.Write(list[i] + " ");
    }

    Console.WriteLine();

}

 

예시코드는 정수리스트 list에 1, 2, 3, 4를 추가한 다음에 출력하고, 3을 제거한 다음, 다시 출력하는 코드이다.

 

리스트에서는 Add() 메서드를 이용해 원소를 추가할 수 있고, Remove를 이용해 원소를 제거할 수도 있다.

배열에서는 크기를 알기 위해 Length를 이용했지만, 리스트에선 Count를 이용한다.

 

public static void Main(string[] args)
{
    List<string> list = new List<string>();

    list.Add("첫번째");
    list.Add("두번째");
    list.Add("세번째");
    list.Add("네번째");

    list.Insert(1, "첫번째와 두번째 사이에 들어가기");

    foreach (string item in list)
    {
        Console.WriteLine(item);
    }
}

 

Insert() 를 이용하면 해당 인덱스에 특정 값을 삽입할 수 있다.

예시 코드에서 list[0]~ list[3] 에 "첫번째" ~ "네번째"가 값에 들어가 있을 때, "첫번째와 두번째 (생략)" 의 값을 list[1]의 자리에 넣고, 기존의 list[1]~list[3]에 있던 값들은 뒤로 한칸씩 밀게된다.

 

리스트에서도 배열에서 썼던 Sort와 Reverse를 그대로 사용할 수 있다.

public static void Main(string[] args)
{
    List<string> list = new List<string>();

    list.Add("첫번째");
    list.Add("두번째");
    list.Add("세번째");
    list.Add("네번째");

    list.Reverse();

    foreach (string item in list)
    {
        Console.WriteLine(item);
    }

    Console.WriteLine("====================");

    list.Sort();

    foreach (string item in list)
    {
        Console.WriteLine(item);
    }
}

 

 

Reverse로 역순으로 정렬하고, Sort를 하니 예시코드의 문자열의 경우, 가나다 순으로 정렬되는 것을 확인할 수 있다.