hamlet-story
자료구조 - [개념] 차원 배열에 대해서 알아보자 본문
개인적으로 컴퓨터를 하면 컴퓨터 과학의 기본적인 개념에 대해서는 알아야 한다고 생각이 들어 예전에 공부하였던 내용을 토대로 간단하게 작성하려고 합니다.
설명은 아래와 같이 이루어집니다.
1. 배열 (Array)
2. 1차원 배열 (One-Dimensional Array)
3. 다차원 배열 (Multi-Dimensional Array)
3. 배열이 차지하는 메모리 크기구하기
History
배열 (Array) 이 생기기 이전에는 과연 어떻게 사용을 해왔을까 생각을 해보겠습니다.
그때는 변수를 선언한다는 개념만 있었을 것이기 때문에 만약 다양한 그룹에 해당하는 값을 저장한다고 하면 다양한 변수들이 필요했을 것이고, 각각의 변수 사용은 서로 다른 이름을 사용해야 하기 때문에 다른 연산이나 데이터 교환에서도 처리가 힘들 것 입니다.
그렇기에 위의 문제를 해결하고자 데이터를 연속된 공간에 저장하는 구조로 접근하여 생긴 것이 배열 (array)가 아니까 생각 합니다.
배열 (Array)
배열 (array)는 동일한 성격의 자료들을 연속된 공간에 저장하는 가장 간단한 형태의 선형 구조로, 주로 반복적이고 많은 자료를 처리할 때 사용합니다.
여기에서 배열 (array) 는 인덱스와 요소 (element) 쌍의 집합이고, 그 인덱스에 해당 요소 (element)가 대응되는 자료 구조입니다.
그리고 배열 (Array)에서 각 요소 (element)는 연속적인 메모리 공간에 저장이 될 것입니다.
1차원 배열 (One-Dimensional Array)
1차원 배열 (One-Dimensional Array) 은 첨자의 개수가 한 개인 배열(array)을 말합니다.
C Language를 기준으로 설명드리도록 하겠습니다.
int arr[3];
arr[0] = 12;
arr[1] = 2;
만일 배열을 위의 코드처럼 구현하였다고 한다면,
메모리 내에서는 아래와 같이 접근이 될 것입니다.
위의 있는 내용처럼 각각 같은 Integer 형태로 값이 넣어지는 것을 확인하 실 수 있습니다.
그리고 자료를 처리하기 위해서는 사전에 자료가 저장될 공간을 미리 확보해 두어야 하는 것도 있습니다.
요소 삽입
배열 (array)에 새로운 요소 (element) 를 추가하거나 삽입 (insert)을 하게 된다면 만든 배열 (array) 에 여유공간이 있는지 확인해 주어야 합니다.
만일 중간에 요소(element)가 삽입(insert)이 돼 한다면 인덱스를 기준으로 뒤로 하나씩 뒤로 밀려야 합니다.
코드로 나타내면 아래와 같습니다.
#include <stdio.h>
int main() {
int arr[10] = {0}; // 배열 크기 증가
int i, x, pos, n = 3;
arr[0] = 12; // 세미콜론 추가
arr[1] = 2; // 세미콜론 추가
// 새로운 요소와 삽입 위치 설정
x = 50;
pos = 3; // 삽입 위치를 배열 크기 내로 변경
n++;
// 배열 크기를 초과하지 않도록 조건 변경
if (pos > 0 && pos <= n) {
for (i = n - 1; i >= pos; i--)
arr[i] = arr[i - 1];
arr[pos - 1] = x;
}
// 수정된 배열의 내용을 출력 (옵션)
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
위를 통해서 요소를 삽입할 때도 삭제할 때도 위치에 따라서 달라진다는 것을 알 수 있습니다.
다차원 배열 (Multi-Dimensional Array)
다차원 배열 (Multi-Dimensional Array) 은 2개 이상의 인덱스를 사용하여 요소를 저장 합니다.
다차원 배열은 2차원 배열 혹은 3차원 배열을 포함하는 개념이라고 생각해 주시면 될 것 같습니다.
2차원 배열 (2-Dimensional Array)
1차원 배열 (One-Dimensional Array) 이 여러 개 모여서 만들어진 것입니다.
가로줄은 행 (row)를 뜻하고 세로줄은 열 (column)으로 볼 수 있습니다.
2차원 배열을 표현하는 방법에는 행 우선 순서 (row major order)과 열 우선 순서 (column major order)가 있습니다.
행 우선 순서 (row major order) 은 첫 번째 행의 인덱스 번호를 먼저 쓰고 열 번호를 1씩 증가시켜 나갑니다.
열 우선 순서 (column major order)는 첫 번째 열 번호를 먼저 쓴 다음 행 번호를 1씩 증가시켜 마지막 행까지 입력이 완료되면 열 번호를 1씩 증가시켜 나가는 방식입니다.
3차원 배열 (3-Dimensional Array)
2차원 배열을 또 묶은 형태를 보여줍니다.
배열명은 [면의 높이][행의 크기][열의 크기]로 작성할 수 있습니다.
배열이 차지하는 메모리 크기 구하기
C Language에서 배열 (array)를 복사하거나 요소에 특정 작업을 하고 싶을 때는 해당 배열 (array) 이 차지하는 메모리의 크기를 정확히 알고 있어야 합니다.
따라서 배열과 관련된 수식은 아래와 같습니다.
배열이 차지하는 메모리의 크기 = [배열의 길이] * sizeof([타입])
배열의 메모리 주소 = [기본 주소] + [배열의 길이] * sizeof([타입])
결론
만약 처음 설정한 배열 (Array)의 크기가 처리할 요소 (element)의 개수보다 적을 경우에 공간이 부족하여 모든 자료를 다 처리할 수 없게 됩니다.
반대로 적은 개수의 요소 (element) 를 공간이 큰 배열 (array)에 저장할 경우 입력되지 않은 나머지 기억 공간 (memory) 이 불필요하게 낭비될 수 있습니다.
즉, 효율적인 방법은 먼저 처리하고자 하는 요소 (element)의 크기와 개수등을 고려하여 배열 (array)의 크기를 적절하게 설정해 주어야 합니다.
이상입니다.