전체 페이지뷰

2016년 12월 21일 수요일

C# Array

C나 C++ 에서도 익히 보아온 배열에 대해서 먼저 알아봅니다.
아시다시피 배열은 동일한 형식의 여러 데이터를 하나의 변수명에 저장하여 인덱스로 접근할 수 있게 하는 방법입니다.



먼저 일차원 배열 형식은

type[] 배열이름;

으로 선언 가능하며 초기화하는 방법은 세가지가 있습니다.
정수형 배열을 예로 들어 설명하겠습니다.

int[] array1 = new int[5] { 1, 3, 5, 7, 9 };  //배열개수 명시
int[] array2 = new int[] { 1, 3, 5, 7, 9 };    //배열 개수 생략
int[] array3 = { 1, 2, 3, 4, 5, 6 };             // new 생략

배열 원소의 개수를 명시할수도, 안 할 수도 있고, 아예 "new"를 생략해도 모두 같은 결과를 보여줍니다. 가독성과 스타일에 따라 어느쪽을 사용해도 좋습니다.

지금은 1차원 배열의 예를 들었지만 배열은 1차원, 다차원 또는 가변 배열일 수 있습니다.
그리고, 차원 수와 각 차원의 길이는 배열 인스턴스가 생성될 때 만들어집니다. 또한 이러한 값은 인스턴스의 수명 동안 변경할 수 없습니다.

숫자 배열 요소에는 0이, 참조 요소에는 null이 기본값으로 설정되며, 가변 배열은 배열의 배열이므로, 각 요소는 참조 형식이고 null로 초기화됩니다.

대부분의 언어와 마찬가지로, 배열의 인덱스는 0부터 시작합니다(n개의 요소가 있는 배열의 인덱스는 0부터 n-1까지입니다). 그리고, 배열 요소는 배열 형식을 포함하여 모든 형식이 될 수 있습니다.

배열 형식은 Array 추상 기본 형식에서 파생된 참조 형식입니다. 따라서 이 형식은 IEnumerable 및 IEnumerable<T>을 구현하므로 C#의 모든 배열에 foreach 반복을 사용할 수 있습니다. 이러한 형식은 .Net 프레임워크 CTS(Common Type System)에서 System.Array에 정의되어 있는데, 이 쯤에서 System.Array의 메소드와 프로퍼티 중 몇몇을 살펴봅시다. 참고

속성
Length 모든 차원의 요소의 총 수
Rank 배열의 차원 수(1차원은 1, 2차원은 2)

정적메소드
BinarySearch<T>() 이진 탐색을 수행
Clear() 배열의 모든 요소 초기화.(array, int, int) 인자로 초기화할 범위 지정 가능.
FindIndex<T>() 조건에 부합하는 첫 요소의 인덱스 반환
FindLastIndex<T>() 조건에 일치하는 마지막 요소의 인덱스 반환
ForEach<T>() 지정한 모든 요소에 대해 동일 작업 수행
IndexOf() 지정한 개체를 검색하여 1차원 배열에서 처음 검색된 인덱스
LastIndexOf() 1차원 배열에서 마지막 겸색된 인덱스
Resize<T>() 배열 요소 수를 지정된 크기로 변환
Reverse() 순서를 역순으로
Sort() 배열 정렬
TrueForAll<T>() 모든 요소가 지정한 조건에 부합하는지 여부 반환

인스턴스 메소드
GetLength() 지정한 차원의 길이 반환
GetType() 현재 인스턴스의 타입 반환


예제로 사용법을 알아보겠습니다.

using System;
namespace ArrayExample
{
    class MainApp
    {
        private static bool CheckHeight(int score)
        {
            if (score >= 165)
                return true;
            else
                return false;
        }
        private static void Print(int value)
        {
            Console.Write("{0} ", value);
        }
        static void Main(string[] args)
        {
            //일차원 배열 선언 및 초기화
            int[] heights = new int[] { 180174165158194 };
            // foreach로 일차원 배열 순회 출력
            foreach (int height in heights)
                Console.Write("{0} ", height);
            Console.WriteLine();
            //정렬
            Array.Sort(heights);
            Array.ForEach<int>(heights, new Action<int>(Print));
            Console.WriteLine();
            // 차원 수
            Console.WriteLine("배열의 차원 수: {0}", heights.Rank);
            // BinarySearch와 IndexOf
            Console.WriteLine("Binary Search : 165의 인덱스 {0}", Array.BinarySearch<int>(heights, 165));
            Console.WriteLine("Linear Search : 194의 인덱스 {0}", Array.IndexOf(heights, 194));
            // TrueForAll
            Console.WriteLine("모두 165cm이상입니까? : {0}", Array.TrueForAll<int>(heights, CheckHeight));
            // Findindex
            int index = Array.FindIndex<int>(heights, 
                delegate (int height)
                {
                    if (height < 165)
                        return true;
                    else
                        return false;
                });
            heights[index] = 166;
            Console.WriteLine("이젠 모두 165 이상입니까? : {0}", Array.TrueForAll<int>(heights, CheckHeight));
            // GetLength
            Console.WriteLine("원래 배열 길이 : {0}", heights.GetLength(0));
            // resize
            Array.Resize<int>(ref heights, 10);
            Console.WriteLine("바뀐 배열 길리 : {0}", heights.Length);
            // ForEach
            Array.ForEach<int>(heights, new Action<int>(Print));
            Console.WriteLine();
            // Clear
            Array.Clear(heights, 37);
            Array.ForEach<int>(heights, new Action<int>(Print));
            Console.WriteLine();
        }
    }
}
cs



2차원 배열

C언어에서와 마찬가지로 [2,3]의 배열이라 하는 것은
[0,0]
[0,1]
[0,2]
[1,0]
[1,1]
[1,2]
와 같습니다.

2차원 배열의 선언 및 초기화도 1차원의 경우와 같습니다.

int[,] arr1 = 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 } };           //길이와 new 모두 생략

3차원, 4차원 배열도 가능하나 그다지 쓸모가 없으니 넘어가겠습니다.

가변 배열(Jagged Array)

가변 배열이란 배열의 요소로 배열을 갖는 배열입니다. 배열의 요소가 되는 배열의 길이가 다를 수 있다보니 '울퉁불퉁' 하다고 하여 jagged란 이름이 붙었습니다.

type[ ][ ] 배열명 = new type[가변배열 용량][ ];
의 형식으로 선언합니다.

int[][] jaggedArray = new int[3][];
jaggedArray[0= new int[] { 13579 };
jaggedArray[1= new int[] { 0246 };
jaggedArray[2= new int[] { 1122 };
cs
와 같이 따로따로 배열을 할당해 주거나,

int[][] jaggedArray2 = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};
cs
와 같이 선언과 동시에 초기화 가능합니다.

사용 예를 보겠습니다.

using System;
namespace JaggedArray
    class MainApp
    {
        static void Main(string[] args)
        {
            int[][] jaggedArray = new int[3][];
            jaggedArray[0= new int[] { 13579 };
            jaggedArray[1= new int[] { 0246 };
            jaggedArray[2= new int[] { 1122 };
            foreach(int [] arr in jaggedArray)
            {
                foreach (int e in arr)
                {
                    Console.Write("{0} ", e);
                }
                Console.WriteLine(0);
            }
        }
    }
}
cs

댓글 없음:

댓글 쓰기