본문 바로가기

C# 공부/C# 기본 문법

배열 (선언 및 사용, 초기화, System.Array 클래스, 2차원/다차원 배열, 가변배열)

A. 배열의 선언 및 사용법

int[] array = new int[5];
int sum;

foreach(int score in array)
	sum+=score;

int average= sum/array.length();

 

B. 배열의 초기화방법 3가지

//1번째 : 기본
string[] array1 = new string[3]{"a","b","c"}; 
                             //배열 객체를 초기화하는 {}블록을 컬렉션 초기자(Collection Initializer)라고 한다.

//2번째 : 배열의 용량생략
string[] array2 = new string[]{"a","b","c"};

//3번째 : new 연산자, 배열의 용량 모두를 생략
string[] array3 = {"a","b","c"}

* 작성시 3번째 방법이 편하지만, 다른 사람과 공유를 해야할경우 첫번째 방법이 읽기편하다.

 

C. System.Array 클래스

.NET 프레임워크의 CTS(Common Type System)에서  배열은 System.Array 클래스에 대응된다.

1. System.Array 클래스에서 자주사옹하게 될 메소드와 프로퍼티

분류 이름 설명
정적 메소드 Sort() 배열을 정렬한다.
BinarySearch<T>() 이진 탐색을 수행한다.
IndexOf() 배열에서 찾고자하는 특정 데이터의 인덱스를 반환한다.
TrueForAll<T>() 배열의 모든 요소가 지정한 조건에 부합하는지 여부를 반환한다.
FindIndex<T>() 배열에서 지정한 조건에 부합하는 첫 번째 요소의 인덱스를 반환한다. 
IndexOf() 메소드가 특정 값을 찾는데 비해, FindIndex<T>() 메소드는 지정한 조건에 바탕하여 값을 찾는다.
Resize<T>() 배열의 크기를 재조정한다.
Clear() 배열의 모든 요소를 초기화한다. 배열이 숫자형식 기반이면 0으로, 논리형식 기반이면 False로, 참조형식 기반이면 null로 초기화한다.
ForEach<T>() 배열의 모든 요소에 대해 동일한 작업을 수행한다.
인스턴스 메소드 GetLength() 배열에서 지정한 차원의 길이를 반환한다. 다차원배열에서 유용하게 사용됨.
프로퍼티 Length 배열의 길이를 반환한다.
Rank 배열의 차원을 반환한다.

* <T>는 형식 매개 변수(Type Parameter)라고 하는데, 이 메소드를 호출할때는 T대신 배열의 기반 자료형을 매개 변수로 입력하면 해당형식에 맞춰 동작하도록 위의 메소드들을 컴파일한다.

class MainApp
{
    private static bool CheckPass(int score)
    {
        if (score >= 60)
            return true;
        else
            return false;
    }

    private static void Print(int value)
    {
        Console.Write($"{value} ");
    }

    static void Main(string[] args)
    {
        int[] scores = new int[] { 80, 74, 81, 90, 34 };
        foreach (int score in scores)
            Console.Write($"{score} ");
        Console.WriteLine();

        Array.Sort(scores);
        Array.ForEach<int>(scores, new Action<int>(Print));
        Console.WriteLine();

        Console.WriteLine($"Number of dimensions : {scores.Rank}");

        Console.WriteLine($"Binary Search : 81 is at {Array.BinarySearch<int>(scores, 81)}");
        Console.WriteLine($"Linear Search : 90 is at {Array.IndexOf(scores,90)}");

        Console.WriteLine($"Everyone passed? :{Array.TrueForAll<int>(scores,CheckPass)}");

        int index = Array.FindIndex<int>(scores,
            delegate (int score) //**익명메소드는 추후에 문법 정리**
            {
                if (score < 60)
                    return true;
                else
                    return false;
            });
        scores[index] = 61;

        Console.WriteLine($"Everyone passed?:{Array.TrueForAll<int>(scores,CheckPass)}");

        Console.WriteLine($"Old length of scores : {scores.GetLength(0)}");

        Array.Resize<int>(ref scores, 10);//배열의 용량을 재조정해야하므로, 기본배열의 참조형을 매개변수로 준다.

        Console.WriteLine($"New length of scores : {scores.GetLength(0)}");

        Array.ForEach<int>(scores, new Action<int>(Print)); //**Action 대리자는 추후에 문법정리**
        Console.WriteLine();

        Array.Clear(scores, 3, 7);

        Array.ForEach<int>(scores, new Action<int>(Print));//**Action 대리자는 추후에 문법정리**
        Console.WriteLine();
    }
}

 

D. 2차원 배열

- 선언과 초기화

int[ , ] array = new int[2,3]; // [2차원길이],[1차원길이]

//초기화 방법 3가지
int[,] arr = new int[2,3]{{1,2,3},{4,5,6}};
int[,] arr2 = new int[,]{{1,2,3},{4,5,6}};
int[,] arr3 = {{1,2,3},{4,5,6}};

 

E. 다차원 배열

- 선언과 초기화

int[,,] array = new int[4,3,2]
{
    {{1,2},{3,4},{5,6}},
    {{1,4},{2,5},{3,6}},
    {{6,5},{4,3},{2,1}},
    {{6,3},{5,2},{4,1}},
};

 

F. 가변 배열(Jagged Array)

다양한 길이의 배열을 요소로 가지는 다차원배열로 이용된다. 

* 배열의 길이를 늘였다 줄였다 하는것이 아닌, 들쭉날쭉한(Jagged)의 의미로 해석필요.

int[][] jagged = new int[3][];
jagged[0]=new int[5]{1,2,3,4,5}; //0번요소 길이 5
jagged[1]=new int[]{10,20,30};//1번요소 길이 3
jagged[2]=new int[]{100,200}; //2번요소 길이 2