본문 바로가기
Data Structure

C# 2차원 배열 & 가변 배열 정리

by SuldenLion 2023. 4. 2.
반응형

C#으로 2차원 배열을 만들어 쓰는 법을 알아보겠다.

 

C#에서는 다차원 배열을 만들때 특이한 syntax를 쓰는데, 바로 배열 [] 사이에다 ','를 넣는것이다.

2차원배열 선언시, 필요한 row와 col 값만큼을 ','로 구분지어서 명시해주면 그 사이즈 만큼의 2차원 배열이 할당된다.

 

 

코드를 보면서 직접 사용해 보겠다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSArray2Test
{
    class Program
    {
        static int getSum(int[,] p)
        {
            int sum = 0;

            for (int i = 0; i < p.GetLength(0); i++)
                for (int j = 0; j < p.GetLength(1); j++)
                    sum += p[i, j];

            return sum;
        }
        
        static void print(int[,] p)
        {
            for (int i = 0; i < p.GetLength(0); i++)
            {
                for (int j = 0; j < p.GetLength(1); j++)
                {
                    Console.Write(p[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
        
        static void Main(string[] args)
        {
            int[,] x;
            String line;
            int n, m;

            Console.Write("Type row and col : ");
            line = Console.ReadLine();
            char split = ' ';
            String[] data = line.Split(split);
            n = int.Parse(data[0]);
            m = int.Parse(data[1]);

            x = new int[n, m];

            Random r = new Random();
            for (int i = 0; i < n; i++)        
                for (int j = 0; j < m; j++)                
                    x[i, j] = r.Next()%100;

            int sum = getSum(x);

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

            print(x);
        }
    }
}

 

2차원 배열을 만들어 랜덤값을 넣고 값들의 합계와 테이블 내용을 출력해보는 프로그램이다.

 

2차원 배열 선언 방식이다.

 

6과 7을 입력받아 6행 7열짜리 2차원배열을 만들어 보겠다.

"6 7"이라는 문자열을 입력받고 split을 둬서 6과 7을 각각 parse 후 사이즈로 하고 배열을 선언해준다.

 

그럼 테이블 모양의 2차원배열이 Heap 메모리에 할당이 될 것이고 Random 값을 채워넣어준다.

 

그 다음, x를 가지고 getSum()을 해준다.

 

함수 구현시 넘겨받는 parameter의 type은 '[,]'가 된다.

 

마찬가지의 print()를 만들고 컴파일 해보면 다음 결과가 나온다.

 

 

 

다음은 위 프로그램과 비슷하지만 다른 "int[][] y"를 하여 2차원 형태의 배열을 만드는 것을 알아보겠다.

이 방법은 일반적인 Java의 동적 할당 방식과 같다.

 

우선 코드부터 보겠다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSArray2Test
{
    class Program
    {
        static int getSum(int[][] p)
        {
            int sum = 0;

            for (int i = 0; i < p.Length; i++)
                for (int j = 0; j < p[i].Length; j++)
                    sum += p[i][j];

            return sum;
        }

        static void print(int[][] p)
        {
            for (int i = 0; i < p.Length; i++)
            {
                for (int j = 0; j < p[i].Length; j++)
                {
                    Console.Write(p[i][j] + " ");
                }
                Console.WriteLine();
            }
        }
        
        static void Main(string[] args)
        {
            int[][] y;
            String line;
            int n, m;

            Console.Write("Type row and col : ");
            line = Console.ReadLine();
            char split = ' ';
            String[] data = line.Split(split);
            n = int.Parse(data[0]);
            m = int.Parse(data[1]);

            y = new int[n][];
            for (int i = 0; i < n; i++)
                y[i] = new int[m];

            Random r = new Random();
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    y[i][j] = r.Next() % 100;

            int sum = getSum(y);

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

            print(y);
        }
    }
}

 

흔히 자바에서 2차원배열을 만드는 방식이다.

 

row와 col을 입력받고(row n = 7, col m = 3 이라고 가정)  y에 new int[n][]을 하여 각 행을 의미할 기억공간을 할당해준다.

 

그다음 loop를 row번 돌면서 각 cell에 new int[n] 한 만큼 기억장소를 할당해주면 된다.

 

이런식으로 할당받아 이차원 배열로써 쓸 수 있는 것이다.

 

배열을 갖다쓰는 함수의 argument type은 int[][]가 된다.

 

위 코드의 실행 결과이다.

 

 

첫 번째 2차원 배열 생성 방식인 "int[ , ]"와 두 번째 방식 "int[][]"에는 큰 차이가 하나 있는데 정리해보고 마무리하겠다.

 

첫 번째 방식은 배열 선언과 동시에 행과 열의 size를 고정시키는 것이며 만약 열 마다 행의 개수가 다르다면 행의 개수가 적은 열은 메모리 낭비가 생길 수 있다는 것이다. 

하지만 두 번째 방식은 각 행에 따른 열의 size를 각각 따로 생성해주기 때문에 기억장소를 완전히 필요한 만큼만 할당받을 수 있으므로 메모리 낭비를 없앨 수 있다.

 

row, col로 3, 4를 입력받고 1 열은 4 행짜리, 2 열은 3 행, 3 열은 2 행 과 같은 식으로 행을 하나씩 줄여가며 테이블을 만들어 쓰고 싶은 경우

두 번째 방식으로 배열을 할당하여 쓰면 된다. 이것을 이제 배열의 길이를 바꿀 수 있다는 의미인 가변 배열이라고 한다.

 

가변 배열 방식의 코드에서 이런식으로 수정해주고 컴파일 해본다면

 

 

이런식의 원하는 테이블을 얻어낼 수 있다.

반응형

댓글