삽질의 현장/- .NET

#017_닷넷(.NET)_.Net Framework 기본 - 다차원 배열(사각, 가변)

shovelman 2015. 10. 23. 16:29



안녕하세요 삽잡이입니다.


이번 시간에는 다차원 배열에 대해서 알아보려고합니다.

다차원 배열에는 '사각 배열'과 '가변 배열'이 있습니다.

즉, 이전 시간에 인덱스 '하나'를 가지고 놀던 배열은 1차원 배열이라 부르는데,

이번 시간부터는 인덱스 '두 개 이상'을 가지고 노는 배열에 대해서 알아본다는 것입니다.


우선 사각 배열은 C/C++에서 우리가 알던 다차원 배열을 말하는 것입니다.

그런데 '가변 배열'은 C/C++에서 제공하지 않았지요...

따라서 가변 배열은 C/C++에서 따로 사용자가 직접 만들어서 썼었습니다.


아무튼... 사각배열부터 알아보도록 하겠습니다.

사각 배열은 배열은 배열인데 '두 개 이상'의 인덱스를 갖는 배열을 말합니다.

어떻게 접근할 수 있느냐... 



이와 같이 접근할 수 있습니다...

위의 예제에서는 2x2 배열을 사용하고 있습니다.


그림을 한번 그려볼까요...



객체는 단 하나입니다.

단지, 이 객체의 메모리를 네개로 나눠서 arr이 가리킬 뿐입니다.

arr이라는 참조자를 통해서 두개의 인덱스를 사용해 접근하는 것입니다.

그런데, 논리적으로 볼 때에는 큐브처럼 들어가있는 것과 같이 그릴 수 있는 것이구요...


형식의 이름은 'int[ , ]' 라고 부릅니다. 즉, '사각 배열'이라고 부르는 것입니다.

실제 이름은 예제 코드에서 주석 처리 한 


int[,] arr = new int[2, 2] { { 10, 20 }, { 30, 40 } };


이렇게 부를 수 있지요...


그런데... for문을 돌리며 출력을 하려고 하는데 정수 '2'를 사용하며 

반복문을 돌리기에는 뭔가 아쉬움이 있지 않습니까...

배열의 크기를 확장한다면 일일히 수정을 해줘야하니...


우리는 지난 시간에 Lengh라는 Property(속성)을 배웠습니다.

그런데 해당 속성은 원소의 개수를 알려줍니다.

따라서 행, 렬에 대한 2, 2 를 알려주는 것이 아닌 원소의 개수인 '4'를 알려준다 이겁니다...


따라서 C#에서는 행과 열의 개수를 알려주는 'GetLength()' 메서드를 제공해줍니다.

매개변수로 '차원'을 넘겨주면 됩니다.



이런식으로 말입니다...


만약, 삼차 사각 배열 int [3, 2, 3]이 있다고 가정해봅시다.

이때에 arr.GetLength(0) 의 값은 '3'.

arr.GetLength(1)은 '2', arr.GetLength(3)은 '3'이라고 얘기해줄 것입니다.


지금 까지 알아본 배열이 사각 배열입니다.

주의해야할 것은

int[ , ] arr 이라는 참조자는 객체 하나에 대한 참조자입니다!

반드시 기억하시길 바랍니다.



자... 그렇다면 이제는... 가변 배열에 대해서 알아보겠습니다.

우선, 예제 코드를 확인해보시겠습니다.



해당 예제코드는 5x5 가변 배열을 만든 것입니다.

가변 배열은 '배열의 배열'이라는 뜻을 가지고 있습니다.


개념적으로 객체가 있는데 5x5 짜리 배열이 만들어진다는 소리입니다.

접근할 때에는 'arr[1][3]' 이처럼 접근할 수 있지요...


이것도 사각 배열과 같습니다. 단시 객체 하나일 뿐입니다.

이놈의 형식은 int[][] 즉, int형 배열의 배열이라는 의미를 가지고 있습니다.

그리고 참조자는 arr입니다. 단지 참조자일뿐입니다...


그런데, 이 참조자는 또 int[]... 즉, int형 배열의 참조자입니다.

즉, int[]을 보관하는 배열이 또 있는 것입니다.

즉, 참조가 다섯개 더 만들어 진것이지요...



결론적으로 arr[0] = new int[5];가 된 것이지요...

즉, arr 뿐만 아니라 arr[0]도 참조자입니다.

참조자로 배열의 원소를 접근할 때 인덱스로 접근하니 arr[0][0] 과 같이 접근할 수 있겠지요...


이와 같은 배열을 가변 배열이라고 부릅니다.

각 객체의 내용물을 가져다가 사용할 수 있는 장점이 있습니다.

그런데 가변 배열이라고 부르는 이유는 '정적이지 않기 때문'입니다.




이런식으로 할 수 있기 때문입니다.


아무튼... 사각배열과 가변 배열은 다릅니다. C++은 가변 배열이 없습니다.

하지만, 사용자 정의 형식을 통해서 가변 배열처럼 사용을 할 수 있었습니다.


int** arr[] = {new int[5], new int[2]};

이와같이 사용할 수 있었지요...


또 다른 방법이 있긴 합니다... 이래서 C++이 유연하다고 하는 것입니다.


int** parr = new int*[2];

parr[0] = new int[5];

parr[1] = new int[2];


뭐... 아무튼 C++에서는 이와 같이 포인터의 정의와 연산을 통해

C#처럼 사용할 수 있었습니다.


하지만, C#에서는 가변 배열로써 이런 기능을 보다 쉽게 사용할 수 있게 되었지요...

 

참고로

모든 배열은 Array로 부터 상속을 받습니다.

그런데 이 Array에는 유용한 메서드들이 많이 존재하지요...

대표적으로 Array.Sort() 메서드가 있습니다.

정렬 메서드이지요... 아무튼...


 

이번 시간에는 C#에서 제공하는

다차원 배열인 '사각 배열', '가변 배열'에 대해서 알아봤습니다.


이상 삽잡이였습니다!