Ragged 배열(Array)


Ragged의 의미

'너덜너덜해진', 

'옷이 누더기가 된',

'해진' 이라는 뜻을 갖는다.



그래서, ragged flag라고 하는 것은

위의 그림처럼 끝이 다 해진 깃발을 말한다.


Ragged 배열(array)의 의미

2차원 배열을 생각해 보면,

각 행마다 열의 개수가 모두 똑같다.

Ragged array는 각 행마다 열의 개수가 다른 배열을 의미한다.


아래 그림을 보자.

왼쪽에는 일반 2차원배열이 있다.

3개의 행으로 이루어져 있고, 각 행마다 모두 3개씩의 열을 갖는다.

반면에,

오른쪽을 보면 2차원 배열이긴 한데, 모양새가 예사롭지 않다.

우선 3개의 행이 있으되,

0번 행은 2개의 열,

1번 행은 3개의 열,

2번 행은 4개의 열을 갖는다.

이런 것을 ragged array라고 한다.



Ragged 배열의 생성


Ragged 배열은 각 행마다 열의 개수가 다르기 때문에,

일반적인 이차원 배열처럼 만들 수는 없다.

대신, 각 행마다 필요한 열의 개수만큼 만들어 넣어야 한다.

예를 들어, 위의 그림에 나온 ragged 배열을 만드는 프로그램은 아래와 같다.



line 8

행의 개수만 3으로 정해졌기 때문에, 열의 개수는 공백으로 둔 채 2차원 배열을 만든다.

line 10

0번 행에는 2개의 공간을 만들기 위해 크기 2인 일차원 배열을 만들어 넣는다.

line 11, 12

1번 행과 2번 행에 각각 크기 3과 4인 일차원 배열을 만들어 넣는다.

line 14-16

만들어지 공간에 값을 넣어본다.


3차원 Ragged 배열


3차원 ragged의 경우에는 머리 속에 금방 떠올리기가 쉽진않다.

우선 아래 프로그램은 ragged 배열을 만드는 예를 보여준다.

line 8

전체 3개의 그룹이 있고, 그룹 안을 어떻게 나누어 쓸 것인가는 그룹별로 결정할 것이므로 나머지는 공백으로 둔다.

line 10-12

그룹안에 서브그룹을 만드는 것이다. 이것은 2차원 배열로 한다. 0번 그룹은 2개의 서브그룹을 만들고, 각 서브그룹마다 공간의 개수가 다르므로 공백으로 둔다.

line 14-22

가장 안쪽에 실제 데이터를 저장하는 공간을 만드는 것이다.


위의 코드 수행에 따른 ragged배열 생성을

그림으로 그려보면 다음과 같다.

실제 데이터가 저장되는 공간은 굵은 점으로 표시하였다. 


반응형
LIST


배열 (Array)에 대한 복습

데이터구조에서 

배열을 많이 사용하기 때문에

이쯤에서 한 번쯤

복습해 보는 것이 좋겠다.


배열은,

같은 데이터형 (data type)을 갖는 

여러 개의 변수들을 손 쉽게 만들 수 있는 방법이다.


int a[6];

배열을 선언할 때는

맨 앞에 데이터형을 쓰고,; 위에서는 int

그 다음에 그 배열의 이름을 붙이고; 위에서는 a

마지막에 몇 개를 만들 것인가를 [ ] 안에 지정한다.; 위에서는 6개


이 때 생기는 6개 배열변수들의

이름은 아래와 같다.

이렇게 번호를 이름삼아 부르는 데, 이 번호를 index 라고 한다.

a[0], a[1], ... a[5]


index는 0부터 시작

이걸 절대 잊지 말아야 한다.

사람들이 물건을 셀 때는

첫 번째, 두 번째, ... 이렇게 1을 기준으로 하지만,

C언어에서는

0  번째, 1 번째,... 이렇게 0이 기준이 된다.


index는 n-1에서 끝

이것도 절대 잊지 말아야 한다.

배열 크기가 n일 때,

마지막 index는 당연히 n-1이 된다.

왜냐면, 0부터 시작했으니.


배열 (Array) 해부

배열은 메모리 상의 연속된 공간에 위치하게 된다.

쉽게 얘기하면,

크기 n인 배열을 선언하면,

n개의 배열변수들이

메모리 상의 연속된 위치에 생기게 된다는 것이다.

서로 서로 떨어질 수가 없다.

일심동체인 것이다.

아래 프로그램을 보자.

크기 6인 int 배열을 만들고,

각 배열변수들의 주소를 출력해보면

'4' 바이트 간격으로 모두 연속된 것을 볼 수 있다.

예를 들어,

a[0]는 16진수 주소 279138에 있고, 4 바이트를 차지한다. 왜냐면 int니까.

그러면

a[1]은 16진수 주소 27913c부터 시작한다. 이런 식이다.


이번에는 char배열을 예로 프로그램을 보자

크기 6인 char배열을 만들었고,

각 배열변수의 주소를 이번에는 10진수로 출력해 보았다. 

1바이트 단위로 증가하는 것을 볼 수 있다.

왜냐면, char가 1바이트이니까.


정리하자면,

배열을 선언하면, 각 배열변수들은 연속된 메모리 공간에 위치한다.

바꿔 말하면,

배열은 메모리에 그 만한 연속공간이 있을 때만 만들 수 있다. 


다차원 배열 (Multi-dimensional Array)

2차원 배열을 생각해보면

다차원 배열이 뭔지 금방 알 수 있다.

2차원 배열은 지도를 떠올리면 금방 이해된다.

또는 지뢰찾기 같은거,,,



2차원 배열은 행과 열 개수만큼의 공간이 만들어진다.

예를 들어, 2x2 배열이면 모두 4개의 배열변수가 만들어진다.

이 때도 index는 0부터 시작이다.

그리고 각 배열변수의 이름은 

두 개 index의 조합으로 나타내어 진다.

int a[2][2];

a[0][0], a[0][1], a[1][0], a[1][1]


3차원 배열

이거는 큐브를 생각하면 된다.

그리고,

3차원 배열은 x, y, z축으로 이루어진 공간을

생각하면 되는데,

예를 들어, 2x2x2 배열이면 모두 8 개의 배열변수가

만들어지고,

배열변수는 3개 index의 조합으로 이름이 지어진다.


int a[2][2][2];

a[0][0][0], a[0][0][1], ...., a[1][1][1] : 모두 8개


다차원배열의 비밀

2차원 배열이면 메모리 상에 2차원으로 생길 줄 알았지?

3차원 배열이면 메모리 상에 3차원이 만들어 지고,,

그러면 4차원은 어떻게 하려고,,


다차원 배열은 

다 뻥이다.

몇 차원이고 간에

메모리상에는 1차원 배열처럼 생긴다.

증명이 필요하다구? 


아래 프로그램을 보자.

3차원 배열 a[2][2][2]를 만들었다.

만약, 이게 진짜로 3차원이면,

주소가 연속이면 안되고, 위층, 아래층 이렇게 나와야 한다.

그런데,

결과를 보면 모두 1바이트 단위로 인접해 있음을 알 수 있다.


다차원 배열, 다 소용없는기라.

그기 다 사기인기라.

결국 1차원 짜릴, 그리 뻥치고 다닌기라.





배열에 대해서 설명합니다.



반응형
LIST

다차원 배열 (Multi dimensional array)

2차원 이상의 배열을 다차원 배열이라고 한다.
행렬 같은 것을 생각하면 2차원 배열을 쉽게 이해할 수 있고,
입체공간을 생각하면 3차원 배열이 머리속에 그려질 것이다.

2차원 배열의 선언

1차원 배열과 비슷하지만, 배열을 나타내는 [] 표시를
하나 더 사용해서 아래와 같이 나타낸다.
int[][] a = new int[3][3];

2차원 배열선언과 동시에 값을 할당하는 것은 아래와 같이 한다.

눈여겨 볼 것은, 2차원 배열이기 때문에 행별로 { }로 감싸서 표시해야 하다.

만약, { } 표시를 하지 않을 경우에는 다음과 같이 컴파일 오류로 표시된다.


선언된 2차원 배열의 각 요소에 접근하는 것은 for-loop을 2번 중첩하면 된다.



2차원 배열의 길이


2차원 배열의 길이는 1차원 배열과는 조금 다르다.

예를 들어 아래와 같은 3x3 배열을 예를 들어보자.

전체적인 공간은 9개이다.


int[][] a = new int[3][3];


하지만, a.length는 행의 개수를 의미하여, 3이 되다.

전체 공간의 개수 9가 아님에 유의하자.

각 행에 들어있는 열의 개수는 각 행별로 확인해야 한다.

예를 들어, 0번 행의 경우에는 a[0].length와 같다.

아래는 2차원 배열에 .length를 사용했을 때의 출력결과를 보여준다.


이렇게 되는 이유는 아래 그림을 보면 다소나마 쉽게 이해할 수 있다.

a.length는 a안에 있는 요소의 개수 이므로 3이 되고,

a[0].length는 그 안에 있는 요소의 개수이므로 3이 되는 이치이다.




3차원 배열의 선언


2차원배열 보다 [] 를 하나 더 붙이면 3차원 배열을 만들 수 잇다

이것을 그림으로 표시해 보면 아래와 같은 입체를 생각해볼 수 있다.

모두 12개( = 3*2*2)의 사각형으로 구성된 입체이다. 

3차원 배열에 대한 초기화는 조금 신경써서 해야 한다.

c[3][2][2]의 경우에,

우선 { }으로 3등분을 한다.

그리고, 각 { }안에서, { }으로 다시 2등분을 한다.

가장 안 쪽의 { }안에, 숫자 2개씩을 쓰면 된다.

이것을 그림으로 보여주면 아래와 같다.


실제로 초기화 한 예는 아래와 같다.


그리고, 3차원 배열의 각 요소를 접근하는 것은 

2차원 배열과 마찬가지지만, for-loop을 한 번 더, 즉 3번을 중첩하여야 한다.



3차원 배열의 길이


위에서 2차원 배열의 길이를 설명했다.

3차원 배열의 길이도 아래 그림과 같은 의미를 같는다. 

배열 이름에다가 .length를 붙이면, 가장 큰 그룹의 개수를 의미하며,

차원이 하나씩 들어갈 수록 그 안에 있는 서브그룹의 개수들을 의미하게 된다.


아래 그림에서 a.length는 가장 큰 그룹의 개수이므로 3이 되고,

a[0].length는 그 안에서의 서브그룹의 개수이므로 2,

마지막으로 a[0][0]는 또 다시 그안에서의 서브그룹의 개수이므로 2가 되는 것이다.

따라서, 전체 공간의 개수를 알려면 각 단계별 개수를 모두 곱한 값이 된다.


3차원 배열의 크기를 출력해 보는 아래 예제를 살펴보자.

c는 3*2*2 크기를 갖는 3차원 배열이다.

이 때, c.length는 가장 큰 그룹의 개수를 의미한다.

그리고 c[0]은 0번째 그룹 안에서의 서브그룹의 개수, 2를 의미한다.

마지막으로 c[0][0]는 가장 안쪽 그룹에 있는 숫자의 개수이므로 2가 된다.




위의 내용을 동영상에서 보다 자세하게 설명합니다. 


반응형
LIST

+ Recent posts