C#.

이것이 C# 이다 10장) 배열 Array [1]

Muru 2023. 8. 31. 22:47

배열의 선언 방식

데이터_형식[] 배열_이름 = new 데이터_형식[용량];
Ex) int [] scores = new int[5];

배열의 각 요소에 데이터를 저장하거나 읽어올 때는 배열 이름 뒤 대괄호와 []를 붙여주고, index를 적어주면 된다.
참고로 배열은 1이 아니라 0부터 시작한다. 여기서 for 문이나 foreach 문과 함께 사용하면 코드를 간결하게 만들 수 있다.

int[] scores = new int[5]
scores[0] = 100;
scores[1] = 90;
scores[2] = 80;
scores[3] = 70;
scores[4] = 60;

배열을 이용한 코드는 변경사항이 생겨도 바꿔줄 것이 없어 코드 관리가 쉽다. 다음 예제를 통해 알아보도록 하자.

namespace ArraySample
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] scores = new int[5];
            scores[0] = 100;
            scores[1] = 90;
            scores[2] = 80;
            scores[3] = 70;
            scores[4] = 60;

            foreach(int score in scores)
                Console.WriteLine(score);
                
            int sum = 0;
            foreach(int score in scores)
                sum += score;
                
            int average = sum / scores.Length;  //배열 객체의 Lengh 프로퍼티는 배열의 용량을 나타냅니다.
            Console.WriteLine($"Average Score : {average}");
        }
    }
}
100, 90, 80, 70, 60
Average Score : 80

배열이 0부터 시작한 다는 것을 알게된 우리는 기억만 해두면 접근할 때 큰 불편은 없지만, 마지막 요소를 기준으로 접근하고싶다면 다른 방법을 사용해야합니다. 마지막 요소를 위해선 아래와 같이 '배열의 길이'에서 -1을 해야합니다.

int[]scores = new int[5]
scores[scores.Length - 1] = 34;

C# 8.0부턴 이런 불편함을 없애기 위해 System.Index형식과 '^' 연산자가 생겼습니다. ^ 연산자는 컬렉션의 마지막부터 역순으로 인덱스를 지정하는 기능을 갖고 있습니다. ^1은 컬렉션의 마지막 요소, ^2 마지막에서 두번쨰, ^3 는마지막에서 세 번째를 나타내고 있죠. ^연산자의 연산 결과는 System.Index 형식의 인스턴스로 나타납니다. 예제까지 같이봅시다.


[기본]
System.Index last = ^1;
scores[last] = 34; // scores[scores.Length -1] = 34와 같습니다. 아시죠?
[간결하게]
scores[^1] = 34; // scores[scores.Length -1] = 34
namespace ArraySample
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] scores = new int[5];
            scores[0] = 100;
            scores[1] = 90;
            scores[2] = 80;
            scores[^2] = 70;
            scores[^1] = 60;

            foreach(int score in scores)
                Console.WriteLine(score);
                
            int sum = 0;
            foreach(int score in scores)
                sum += score;
                
            int average = sum / scores.Length;  //배열 객체의 Lengh 프로퍼티는 배열의 용량을 나타냅니다.
            Console.WriteLine($"Average Score : {average}");
        }
    }
}

결과값은 아까와 똑같이 100, 90, 80, 70, 60입니다.

배열을 초기화하는 세 가지 방법

이번엔 배열을 초기화하는 방법 세 가지입니다. 첫 번째는 배열의 원소 개수를 명시하고, 뒤에 중괄호와 { } 블록을 붙인뒤, 블록 사이에 배열의 각 원소에 입력될 데이터를 입력합니다.  이렇듯 배열 객체를 초기화하는 { } 블록을 일컬어 컬렉션 초기자(Collection Initalizer)라 한다나 뭐라나...

[배열의 용량 명시]
string[] array1 = new string[3] { "안녕", "Hello", "Konnichiwa" };
[배열의 용량 생략]
string[] array2 = new string[] { "안녕", "Hello", "Konnichiwa" };
[전부 생략]
string[] array3 = { "안녕", "Hello", "Konnichiwa" };

세 가지 배열의 초기화 방법만 보면 "당연히 3번 사용해야 하는 거 아님?ㅋㅋ" 이라 할수 있지만 꼭 그렇진 않습니다. 코드를 다른 사람이 물려받거나 동료들과 공유할 때는 상대방이 읽기 편해야 하니까 첫 번째 방법을 쓰는게 좋다고 하네요. 물론 취향차이지만 말이죠. 자 이제 예제 프로그램입니다.

using System;

namespace InitiallizeArray
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] array1 = new string[3] { "안녕", "Hello", "Konnichiwa" };
            Console.WriteLine("array1 ...");
            foreach(string greeting in array1)
                Console.WriteLine($"{greeting}");
			
            string[] array2 = new string[] { "안녕", "Hello", "Konnichiwa" };
            Console.WriteLine("\narray2 ...");
            foreach (string greeting in array2)
                Console.WriteLine($"{greeting}");

            string[] array3 = { "안녕", "Hello", "Konnichiwa" };
            Console.WriteLine("\narray3 ...");
            foreach (string greeting in array3)
                Console.WriteLine($"{greeting}");
        }
    }
}
array1...
안녕
Hello
Konnichiwa

array2...
안녕
Hello
Konnichiwa

array3...
안녕
Hello
Konnichiwa