Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 가변 배열 본문

Programming/C#

[Programming/C#] 가변 배열

scii 2020. 9. 14. 22:52

2차원 배열이나 3차원 배열 같은 다차원 배열을 "배열을 요소로 갖는 배열" 이다. 허나 진정한 의미에서의 배열을 요소로 갖는 배열은 "가변 배열 (Jagged Array)" 이다.
가변 배열은 다양한 길이의 배열을 요소로 가지는 다차원 배열로 이용될 수 있다. 2차원 배열의 요소에 접근할 때 반드시 첨자 두 개를 사용해야 했다. 하나만 사용해서 1차원 배열에 접근한다거나 하는 일은 불가능하다. 아래의 예를 보자.

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

// 2차원 배열이면 첨자 2개가 필히 들어가야 한다.
arr2d[1, 2];

// 2차원 배열이면 첨자가 1개 뿐이라면 에러 발생. 1차원 배열에 접근할 수 없다...
arr2d[1];

가변 배열은 이러한 다차원 배열과는 달리 배열을 요소로써 접근할 수 있다.

// 데이터형식[][] 배열이름 = new 데이터형식[가변 배열의 크기][];

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

// 접근 OK!
arr2d[1][2];

// 1차원 배열에 접근 OK!
arr2d[1];

2차원 배열과 닮았지만 2차원 배열은 아니다. 2차원 배열은 []괄호를 하나만 쓰고 그 안에 첨자를 두 개 사용한 반면, 가변 배열은 [] 괄호가 두 개이다. 가변 배열의 요소로 입력되는 배열은 그 길이가 모두 같을 필요가 없다. 그래서 Jagged 배열이라고 한다.

using System;

namespace test
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            // [C언어 해석]: int** jagged = (int**)malloc(sizeof(int*) * 3);
            int[][] jagged = new int[3][];
            // [C언어 해석]: *(jagged+0) = (int*)malloc(sizeof(int) * 5);
            jagged[0] = new int[5] {1, 2, 3, 4, 5};
            // [C언어 해석]: *(jagged+1) = (int*)malloc(sizeof(int) * 3);
            jagged[1] = new int[] {10, 20, 30};
            // [C언어 해석]: *(jagged+2) = (int*)malloc(sizeof(int) * 2);
            jagged[2] = new int[] {100, 200};
            
            foreach(int[] arr in jagged)
            {
                Console.WriteLine($"Length : {arr.Length}");
                foreach (int ele in arr)
                {
                    Console.Write($"{ele} ");
                }
                Console.WriteLine();
            }
            
            Console.WriteLine();

            int[][] jagged2 = new int[][]
            {
                new int[] {1000, 2000},
                new int[4] {1, 2, 3, 4}
            };
            foreach (int[] arr in jagged2)
            {
                Console.Write($"Length : {arr.Length}, ");
                foreach (int ele in arr)
                {
                    Console.Write($"{ele} ");
                }
                Console.WriteLine();
            }
        }
    }
}

/* 결과

Length : 5
1 2 3 4 5 
Length : 3
10 20 30 
Length : 2
100 200 

Length : 2, 1000 2000 
Length : 4, 1 2 3 4 

*/

C#의 가변 배열을 알아보았다. C#은 가변적인 배열을 손쉽게 쓸 수 있도록 해 놓아서 편리하지만 그 원리를 알 지 못하기에 아래에 C언어로 구현한 가변적인 배열 링크를 걸어 놓았다.

* C언어로 구현한 가변 배열 *

2020/06/13 - [Programming/C] - [C] 2차원 배열 같은 2차원 포인터의 동적 할당

 

[C] 2차원 배열 같은 2차원 포인터의 동적 할당

열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메�

nomad-programmer.tistory.com

2020/06/13 - [Programming/C] - [C] 3차원 배열 같은 3차원 포인터의 동적 할당

 

[C] 3차원 배열 같은 3차원 포인터의 동적 할당

https://nomad-programmer.tistory.com/87 [C] 2차원 배열 같은 2차원 포인터의 동적 할당 열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 ��

nomad-programmer.tistory.com

Comments