자료구조, 알고리즘

DS03 - 배열(Array)

0verc10ck 2018. 5. 12. 03:29
반응형

배열(Array)의 개념                       

  배열(Array)은 자료형이 같은 자료를 나열하여 메모리에 연속으로 저장하여 만든 자료의 그룹이다.

예를 들어 요일을 나타내는 월 ~ 일요일을 각각 하나의 변수로 선언하면 변수를 7번이나 선언해야 한다.

하지만, 요일을 나타내는 배열을 만들어 사용하면 배열만을 선언하기 때문에 변수선언 횟수가 줄어든다.


  배열은 각 요소들을 구별하기 위해 번호를 사용하는데 이 번호를 인덱스(Index)라고 한다.

C/C++에서 인덱스는 항상 0부터 시작한다. 특정 배열 요소를 사용할 경우 "배열이름[인덱스]"의 형태를 

이용하여 변수처럼 사용할 수 있다. 모든 자료형은 배열로 구성할 수 있고, 구성형태에 따라 1차원 배열 뿐만 

아니라 2차 3차 4차 등의 다차원 배열도 구성할 수 있다.


1차원 배열(1-Dimensional Array)

  1차원 배열은 1차원 이라는 말에서 알 수 있듯이 배열의 요소들이 선의 형태로 이루어진 배열이다.

1차원 배열을 선언하는 형식은 다음과 같다.


   int array[10];
//자료형 배열이름[배열 요소의 개수];


- 1. 자료형 선언(배열 요소는 모두 자료형이 같아야하고 배열 요소의 자료형이 배열의 자료형이 된다.)

- 2. 배열의 이름 선언

- 3. 대괄호([])를 이용하여 배열 요소의 개수를 표시, 배열 요소 개수가 배열의 크기이다. 배열을 선언하면 메모리에 배열에 대한 공간이 할당되고 그 크기는 "자료형의 크기 * 배열 요소의 개수" 이다.


배열 이름 선언 규칙은 변수 이름 선언 규칙과 같다.

- 영문자, 숫자, 밑줄(_)만을 사용한다.

- 첫 글자는 숫자를 사용할 수 없다.

- 알파벳 대문자와 소문자를 구분한다.

- 키워드나 예약어는 사용할 수 없다.



  배열의 크기는 자료형의 종류와 배열 요소에 따라 결정된다.

다음 사진은 각 자료형에 따른 배열의 크기를 나타낸 것이다. 배열요소의 개수는 100개로 통일하였다.



다음 사진은 요소의 개수가 10인 int형 배열의 예시이다.



C/C++에서 배열의 첫번째 인덱스는 0이므로 크기가 10 인 배열은 0 - 9까지의 인덱스를 가지고 배열의 각 요소는 배열의 자료형의 크기를 따른다. 

따라서, 배열 전체의 크기는 "요소의 개수 * 자료형의 크기" => 10 * 4 = 40byte의 크기를 가진다.


 지금까지 1차원 배열을 선언하는 방법을 알아보았다. 배열또한 변수와 마찬가지로 선언과 초기화를 동시에 진행할 수 있다. 1차원 배열을 선언하면서 초기화 하는 방법은 다음과 같다.


int array[5] = {1,2,3};
//자료형 배열이름[배열크기] = {초기화 값 리스트};



  배열을 선언하는 방법은 기존의 방식과 같고, 초깃값 리스트에는 초깃값들을 쉼표로 구분하여 나열한다.

초깃값들은 각 배열의 요소에 순서대로 지정된다.


만약 배열을 선언할 때 배열의 크기를 지정하지 않고  초기화만을 진행해준다면 배열의 크기는 초기화 값들의 

갯수만큼 지정된다.





배열의 크기보다 초기화 값의 개수가 적다면 배열의 첫번째 인덱스에서 부터 순서대로 초기화값들이 저장되고

배열의 나머지 부분에는 0이 저장된다.



반대로 배열의 크기보다 초기화 값의 개수가 많다면 배열의 크기만큼 초기화값들이 저장되고 나머지 값들은 메모리에는 할당되지만 배열 영역 밖에 저장되기 때문에 사용할 수 없는 값이 된다.






  앞선 글인 자료의 표현에서 다루었던 자료의 종류 중 문자열이라는 자료형이 있었다. 문자열은 문자를 나열한

것을 의미한다. 문자하나는 작은따음표('')안에 'A'와 같이 표시하고 문자열은 큰따음표("")안에 "ABC"의 형태와 같이 표시된다.

문자와 달리 문자열은 문자를 연속적으로 저장해야 하기 때문에 문자열은 배열을 이용하여 저장된다.

이때 배열의 자료형은 문자의 자료형인 char이 된다.


  문자 배열은 문자열을 그대로 지정하여 초기화 하거나 초깃값 문자 리스트를 이용하여 초기화 할 수 있다.





  위의 사진은 문자열을 저장한은 두가지 방법을 나타낸 것이다.


첫번째 방식은 문자열을 그대로 지정하여 초기화하는 방식이다.

이 방법의 경우 문자열의 마지막에 \0이라는 널문자(Null Character)가 들어가 있다. 널 문자는 문자열의 끝을 

나타내는 역할을 한다.

이 널 문자 때문에 문자열 지정 방식은 문자열의 크기보다 1byte 큰 배열을 필요로 한다.


두번째 방식은 초깃값 문자 리스트를 사용한 초기화 방식이다.

이 방법의 경우 문자열의 요소들을 하나씩 배열에 저장한다. 이렇기 때문에 문자열 지정 방식과 달리 문자열이

아닌 각각의 문자를 저장하기 때문에 문자열의 끝을 나타내는 널문자를 필요로 하지 않는다.




다차원 배열(Multi-dementional)

 배열은 배열의 요소들을 2,3차원으로 구성하여 2차원 배열, 3차원 배열로 나타낼 수 있다.

즉, 2차원 배열은 1차원을 요소로하는 배열이고, 3차원 배열은 2차원 배열을 요소로하는 배열이다.

이처럼 배열을 요소로 가지는 배열을 다차원 배열(Multi-demetional Array)라고 한다.

이러한 정의에 따라 컴퓨터는 현재 우리가 사는 세계인 3차원을 벗어난 4차원, 5차원 배열등의 고차원 배열도 

논리적으로 구성 가능하다. 하지만 이글에서는 2,3차원 배열만을 다루려고 한다.


  다차원 배열을 선언하는 방법은 다음과 같다.


   
//2차원 배열
int array[10][10];
//자료형 배열이름[행 개수][열 개수];

//3차원 배열
int array2[2][3][3];
//자료형 배열이름[면 개수][행 개수][열 개수];



  2차원 배열의 경우 면으로 이루어져 있어, 행과 열의 크기를 지정해 주어야 한다.





위 사진은 2차원 배열의 선언과 논리적, 물리적 구조이다.

논리적으로는 아래의 그림과 같이 2개의 행과 3개의 열로 이루어져 있지만 물리적 구조는 메모리에 순차적으로

요소의 총 개수만큼 저장된다.



3차원 배열의 경우 입체 구조이기 때문에 면의 개수, 행과 열의 크기를 지정해 주어야한다.






위 사진은 3차원 배열의 선언과 논리적, 물리적 구조이다.

논리적으로는 아래의 그림과 같이 2개의 면과 3개의 행, 4개의 열로 이루어져 있지만 물리적으로는 메모리에 

순차적으로 요소의 총 개수 만큼 저장된다.




  지금까지 다차원 배열을 선언하는 방법과 그 구조에 대햐여 알아보았다.

다차원 배열 또한 1차원 배열 처럼 선언과 동시에 초기화를 진행할 수 있다.


다차원 배열의 초기화를 진행할 때에는 다차원 배열이 배열의 배열이라는 점을 고려하여 초깃값을 배열의 형태로 구분지어 지정하거나 1차원 배열처럼 단순하게 초깃값의 리스트를 지정하여 초깃값을 선언 할 수 있다.


또한 1차원 배열과 마찬가지로 배열의 크기를 생략하고 초깃값을 지정할 수 있는데, 다차원 배열의 경우에는

첫번째 배열(2차원의 경우 행의크기, 3차원의 경우 면의 크기)만을 생략 할 수 있다.


//배열의 형태  고려
int d2_1[2][3] = {{1,2,3}, {4,5,6}};
int d2_2[][3] = {{1,2,3},{4,5,6}};
int d3_1[2][2][3] = {{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};
int d3_2[][2][3] = {{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};

//초깃값 리스트
int d2_1[2][3] = {1,2,3, 4,5,6};
int d2_2[][3] = {1,2,3,4,5,6};
int d3_1[2][2][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
int d3_2[][2][3] = {1,2,3,4,5,6,7,8,9,10,11,12};





  문자 배열 역시 1차원의 문자를 묶어 다차원 배열로 구성할 수 있다.

다차원 배열에 문자열을 저장할 때에는 배열을 선언할 때 초기화를 이용하여 문자를 저장하거나

strcpy함수를 이용하여 문자열을 저장할 수 있다.




반응형

'자료구조, 알고리즘' 카테고리의 다른 글

DS05 - 구조체  (0) 2018.05.15
DS04 - 포인터  (0) 2018.05.13
AL02 - 알고리즘의 성능 분석  (0) 2018.05.07
AL01 - 알고리즘의 이해  (0) 2018.05.07
DS02 - 다양한 자료의 표현  (0) 2018.05.07