본문 바로가기
<개인공부>/[C#]

[C#] 배열 초기화, 다차원배열, 가변배열에 대해서 (array, jagged array)

by 사용자 BlockDMask 2019. 1. 10.
반응형

안녕하세요 BlockDMask 입니다.

오늘은 배열에 대해서 알아보겠습니다.

C#의 배열, 다차원 배열을 알아보고 그 다음에 가변배열이라는 것 까지 배워보겠습니다.

1. C# 배열의 선언 초기화 사용방법 (Array)

-> 배열이란 ? 

: 배열이란 관련있는, 비슷한 데이터를 효과적으로 관리하기 위한 자료구조입니다.

: 배열을 이용하면 연관되어있는 데이터들을 for문과 결합하여 손쉽게 순회 할 수 있습니다.


-> C#에서의 배열 선언 방법

(0) 기본 모양

 자료형[] 변수이름 = new 자료형[N] { 초기화 하거나 안하거나}; 

(1) 배열의 요소 개수를 지정하고 선언과 동시에 초기화 하는 방법

- int[] arr1 = new int[5] { 11, 12, 13, 14, 15 };

- 위 코드를 보면 new int[N] 대괄호 사이에 배열의 사이즈를 N으로 지정하고, 초기화 까지 하는 것을 볼 수 있습니다.


(2) 배열의 요소 개수를 지정하지 않고 선언과 동시에 초기화 하는 방법

- int[] arr1 = new int[] { 11, 12, 13, 14, 15 };

- 위 코드를 보면 new int[] 대괄호 사이에 배열의 사이즈를 지정하지 않고, 초기화 까지 하는 것을 볼 수 있습니다.


(3) 배열의 요소 개수를 지정하고, 추후에 배열의 인자들을 초기화 하는 방법

int[] arr3 = new int[5];

  for(int i=0; i<5; ++i)
  
{
      arr3[i] = i + 11;

  }

- 위 코드를 보면 배열의 사이즈를 N으로 지정해 놓고 나중에 반복문 for를 이용하여 배열의 값을 초기화 하는 것을 볼 수 있습니다.


-> 배열의 생김새와 접근 방법

- 위에서 선언한 배열을 보면 컴퓨터에 아래와 같이 저장이 됩니다.

- 이렇게 메모리에 순서대로 값들이 저장이 됩니다.

- 배열에 저장한 값에 접근을 하기위해서 우리는 index라는 것을 이용할 것인데요.

- "배열의이름[index]"을 이용하여 접근을 할 것입니다. 위에서 보시는바와 같이 index는 0부터 시작해서 N-1번 까지 존재합니다. 즉 여기서 사이즈가 5인 배열을 선언을 했으면 index는 0, 1, 2, 3, 4 까지 존재할 수 있는 것 입니다.


-> 실제 코드에서 배열을 사용해보자.

- 보통 배열의 필요성을 이야기하면서, 배열에 대한 예시를 들때 보통 시험 점수를 이야기 합니다.

- 예를들어 배열을 사용하지 않고 '국어' '영어' '수학' '과학' '역사' 점수를 입력하고 평균을 출력한다고 하면. 아래와 같을 것 입니다.

1) 배열을 사용하지 않았을때,

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
    int korean = 60;
    int english = 50;
    int math = 90;
    int science = 80;
    int history = 30;
 
    int sum = korean + english + math + science + history; //여기!
    float average = average = sum / 5;
    Console.WriteLine("평균 : " + average);
}
cs

: 이렇게 배열을 사용하지 않았을때 평균을 구한다고 하면, 모든 과목을 더해야하는 상황이 오게 됩니다. 이때 저렇게 모든 과목들을 일일히 더해주는 방법이 과연 효율적일까요?

: 만약에 과목이 10개 20개 100개 라고 하면.... 누가 저렇게 노가다로 코드를 짜고싶을까요?


2) 배열을 사용했을때.

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
    int[] scoreArr = new int[] { 6050908030 };
    int sum = 0;
    for (int i = 0; i < 5++i)
    {
        sum += scoreArr[i]; 
        //배열은 "변수명[index]"를 통해 접근합니다.
    }
    float average = average = sum / 5;
    Console.WriteLine("평균 : " + average);
}
cs

: 이렇게 배열을 사용하게되면, for문을 이용해서 한번에 해결 할 수 있습니다.


3) 결과

- 결과는 동일합니다 


2. C# 다차원 배열의 선언과 사용방법 (Multi-dimensional Arrays)

-> 다차원 배열이란?

: 2차원 배열은 1차원 배열이 n개가 있는것이고

: 3차원 배열은 2차원 배열이 m개가 있는 것이라 생각하면 됩니다.

: 게임같은데서는 5x5 같은걸 이용해서 빙고판? 같은걸 생각하거나

: 위에서 예를 들었던 성적표를 철수 성적표, 영희 성적표 해서 똑같은게 두세개 있다고 생각하면 됩니다.


-> C#에서 다차원 배열 선언방법

(0) 기본 모양

- 자료형 [ , , ...] 변수이름 = new 자료형[ , , ...] { 초기화 하거나 안하거나};

(1) 2차원 배열 - 선언과 동시에 초기화 하기

- int [ , ] arr1 = new int[2,3] { {31, 32, 33}, {34, 35, 36} };

- 빨간색으로 표시한 수를 보고 말씀을 드리면 "사이즈가 3인 1차원 배열이 2개"가 존재한다. 라고 보면됩니다.

- 자세한 것은 아래 사용법을 보시면됩니다.


(2) 2차원 배열 선언방법 - 선언 후에 초기화 하기.

- int[,] arr1 = new int[2, 3];
  int num = 30;

  for (int i = 0; i < 2; ++i)

  {

      for(int j=0; j<3; ++j)

      {

          arr1[i, j] = num + 1;

      }

  }

- 이런 방식으로도 사용할 수 있습니다.


(3) 3차원 배열도 비슷하게 선언하면 됩니다. (n차원 배열도 마찬가지 입니다.)

- int [, ,] arr3 = new int[2,3,4];


-> 2차원 배열의 생김새와 접근방법

- 위에서 선언 후 초기화한 배열을 보면 아래와 같습니다. 

- 실제 메모리에서는 2차원 배열이라 하더라도 연속적으로 저장이 됩니다만, 사람이 보기 편하게 아래와 같이 표현을 합니다.

- 배열에 접근하는 방법은 1차원 배열과 마찬가지로 index를 이용해서 접근하는데 2차원 배열이기 때문에 index가 두개가 있습니다.

- arr[n, m] 입니다. 우리가 위에서 배열을 선언하길 arr[2,3]으로 선언을 했기 때문에

: n의 범위는 0~2 이고

: m의 범위는 0~3 입니다.

- 실제로 코드에서 2차원 배열의 값에 접근할때는 arr[0,1] 이런식으로 접근하며 이중 for문을 이용해서 많이 접근합니다.


-> 2차원 배열 코드 예제

- 철수와 영희의 중간고사 평균을 구해야하는 코드를 작성해야 한다면,

- 철수와 영희는 2명이고 과목은 각각 5개 씩이라 생각해봅니다.

1) 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static void Main(string[] args)
{
    int[,] arrScore = new int[25] { { 9080704230 },
                                    {24501005270} };
    int[] arrSum = new int[2] { 00 };
 
    //arrSum 배열에 철수와 영희의 시험점수의 합을 넣습니다.
    //arrSum[0] 철수
    //arrSum[1] 영희
    for(int n=0; n<2++n)
    {
        for(int m=0; m<5++m)
        {
            arrSum[n] += arrScore[n, m];
        }
    }
 
    //평균을 출력합니다.
    for(int i=0; i<2++i)
    {
        float average = arrSum[i] / 5;
        Console.WriteLine("평균[" + i + "] : " + average);
    }
}
cs

: 위처럼 2차원 배열을 이용해서 철수와 영희의 성적을 표현해 보았고, 평균까지 구했습니다.

: 또한 2중 반복문을 이용해서 2차원 배열을 순회하는것을 확인할 수 있습니다.


2) 결과


3. C# 가변 배열의 선언과 사용 방법 (Jagged array)

(와 드디어 가변배열이네요, 사실 가변 배열때문에 C#의 배열을 포스팅 한건데 글을 쓰다보니 위에설명이 길어졌네요. 부디 도움이 되었길 희망합니다.)

-> 가변배열이란 ?

: 다차원 배열과 비슷하지만 비슷하지 않은 그런 썸과 같은 배열입니다.

: 기본 가변배열을 생각하면 길이가 다양한 1차원 배열들을 가지고 있는 배열이라고 생각하면 됩니다.

: 막대그래프를 눕혀둔 느낌이랄까요?

: 보통 "배열의 배열"이라는 표현을 합니다.


-> C#에서 가변배열을 선언하는 방법

(1) 가변배열의 기본 모양

- 자료형 [][] 변수이름 new 자료형[N][];

: 위와 같으며, N은 1차원 배열들의 개수를 말하고 뒤의 대괄호는 표기하지 않습니다.

: 그 이유는 1차원 배열의 길이가 다 다르기 때문에 표기할 수 없기 때문입니다.


(2) 가변배열을 선언과 동시에 초기화 하는 방법.

- int [][] jaggedArr = new int[3][] 

{

new int[] {31, 32, 33},

new int[] {41, 42, 43, 44, 45, 46, 48, 70, 71, 72, 74, 76},

new int[] {0, 1, 5, 7, 2, 1} 

};

- 위와 같은 방법로 가변배열을 선언과 동시에 초기화를 할 수 있습니다.


(3) 가변배열을 선언 후에 따로 초기화 하는 방법.

- int [][] jaggedArr = new int[3][];

- 위와 같이 정의를 한 후에 아래 코드처럼 따로따로 초기화를 해줍니다.

- jaggedArr[0] = new int[] {31, 32, 33};

- jaggedArr[1] = new int[] {41, 42, 43, 44, 45, 46, 48, 70, 71, 72, 74, 76};

- jaggedArr[2] = new int[] {0, 1, 5, 7, 2, 1};


(4) 다차원 배열을 가지고 있는 가변 배열을 선언과 동시에 초기화 하는 방법

- 만약에 2차원 배열을 가지고 있는 가변배열을 선언해주고 싶다면, 아래와 같이 하시면 됩니다.

(복잡하네요)

- int [][ , ] jaggedArr2 = new int[3][ , ] 

{

new int[ , ] { { 31, 32} , {33, 34}, {35, 36} },

new int[ , ] { { 1, 2, 3, 4} , {5, 6, 7, 8} },

new int[ , ] { { 11, 12, 13, 14}, {15, 16, 17, 18}, {19, 20, 21, 22}, {23,24,25,26} } 

};


(5) 다차원 배열을 가지고 있는 가변 배열을 선언하고, 따로 초기화 하는 방법

- 2차원 배열을 가지고 있는 가변배열을 선언해보겠습니다.

- int [][ , ] jaggedArr2 = new int[3][ , ];

- jaggedArr2[0] = new int[,] { { 31, 32 }, { 33, 34 }, { 35, 36 } };

- jaggedArr2[1] = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } };

- jaggedArr2[2] = new int[,] { { 11, 12, 13, 14 }, { 15, 16, 17, 18 }, { 19, 20, 21, 22 }, { 23, 24, 25, 26 } };


-> C#의 가변 배열 사용법 및 생김새

- int [][] jaggedArr = new int[3][] 

{

new int[] {31, 32, 33},

new int[] {41, 42, 43, 44, 45, 46, 48, 70, 71, 72, 74, 76},

new int[] {0, 1, 5, 7, 2, 1} 

};

- 위 가변배열의 의 모습을 한번 눈에 띄게 표현을 해보면, 아래와 같습니다.

- 이렇게 jaggedarr[n] 은 각각의 1차원 배열을 가리키며, jaggedarr[n][m]은 n번째 배열의 m번째 인덱스를 말합니다.


-> C# 가변배열 예제.


(1) 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
{
    //가변배열 선언과 초기화
    int[][] jaggedArr = new int[3][]
    {
        new int[] {313233},
        new int[] {414243444546487071727476},
        new int[] {015721}
    };
 
    //가변배열 출력
    for(int i=0; i<3++i)
    {
        Console.Write("jaggedArr[" + i + "] : ");
 
        int size = jaggedArr[i].Length; //각 1차원 배열의 길이
        for (int j = 0; j < size; ++j)
        {
            Console.Write(jaggedArr[i][j] + " ");
        }
        Console.WriteLine();    //한줄 띄어쓰기.
    }
}
cs

: 위 코드와 같은 방법으로 가변배열을 선언과 초기화를 할수 있습니다.

: "배열.Lengh"를 이용해서 원하는 인덱스에 해당하는 배열의 길이를 가지고 와서 그 길이만큼 각 배열의 값을 출력합니다.


(2) 결과


마지막으로 한번 더 강조하자면,

2차원배열에서의 접근방법은 arr[1, 2] 이고,

가변배열에서의 접근방법은 arr[1][2] 입니다.

감사합니다. 질문사항이 있으면 편하게 댓글 달아주세요~

반응형

태그

,

댓글4

  • min 2019.10.31 13:43

    안녕하세요 질문이 있습니다.
    하기 코드에서처럼 2차원 배열 안의 1차원 배열들을 통째로 큐에 넣고싶은데
    하다하다 이렇게 어렵게 넣는데는 성공했는데 쉽게 넣을 방법을 혹시 아시는지요...

    class Program
    {
    static void Main(string[] args)
    {
    int[,] sample = { { 0, 3 }, { 1, 9 },{ 2, 6 } };
    int x = solution(sample);
    Console.Read();

    int solution(int[,] jobs)
    {
    int answer = 0;
    int[][] jobsArray = new int[jobs.GetLength(0)][];

    for (int i = 0; i < jobs.GetLength(0); i++)
    {
    jobsArray[i] = new int[] { jobs[i, 0], jobs[i, 1] };
    }

    Queue<int[]> qJobs = new Queue<int[]>();
    foreach( int[] job in jobsArray)
    {
    qJobs.Enqueue(job);
    }

    int counter = 0;
    while (counter < int.MaxValue)
    {
    counter++;
    }
    return answer;
    }
    }
    }
    답글

    • 안녕하세요. 지금 생각나는 방법은 아래와 같습니다

      Queue<int[]> qJobs = new Queue<int[]>();
      for(int i = 0; i < jobs.GetLength(0); ++i)
      {
      int[] arr = new int[jobs.GetLength(1)];
      for(int j =0; j < jobs.GetLength(1); ++j)
      {
      arr[j] = jobs[i,j];
      }

      qJobs.Enqueue(arr);
      }

  • Favicon of https://cargold.tistory.com Cargold 2020.11.30 22:03 신고

    가변 배열 초기화하는 문법을 까먹어서 방문하게 됐습니다 ㅎㅎ 정보 감사합니다.
    답글