프로그래밍/C,C++

배열

수학가형 2022. 1. 30. 15:44

1. 배열

배열(array)는 요소 수가 정해진 동일 자료형 요소의 순차적 집합체이다. 동일한 자료형인 여러 데이터를 다룰 때 쓰인다.

 

 

2. 배열의 선언

배열의 선언방법은 다음과 같다.

(자료형) (배열명)[배열의 길이];

예를 들어 int 와 float 자료형을 가지고 크기가 각각 10,15인 배열을 선언하려면 이렇게 하면 된다.

 
3. 배열의 초기화/원소 접근
배열이 선언되었으면 초기화가 필요하다(C언어에서). 배열 최초 선언시 각 요소에는 쓰레기값이 들어가 있으므로 초기화를 바로바로 해주는것이 좋다.

컴파일 시간 초기화

배열 선언과 동시에 초기화하는 방법이다. 기본적인 문법은 다음과 같다:

(자료형) (배열명)[배열의 길이] = {요소1, 요소2....};

배열 선언문 바로 다음에 대입연산자 = 를 사용하여 초기화하며 오른쪽의 중괄호에는 초기화 값을 적어준다. 이때 선언한 배열의 길이보다 초기화 값의 개수가 적으면 나머지 요소는 0으로 초기화된다. 예를 들어

위 스크린샷과 같이 초기화된 배열의 각 요소는 순서대로 1,2,3,0,0,0... 이다.

+배열의 모든 요소를 0으로 초기화하고 싶다면 이 성질을 이용하여 간단하게 초기화가 가능하다.

첫 번째 데이터를 0으로, 나머지는 0으로 자동 초기화

컴파일 시간 초기화를 할 때 배열의 길이 생략이 가능한데, 이때 배열의 크기는 중괄호 내부의 데이터 양에 맞추어 정해진다. 예를 들어

다음과 같이 배열을 초기화한다면 이 배열의 크기는 3이 된다.

배열에서 데이터 저장

실행시간 초기화를 하기 전에 배열에 각각의 데이터가 어떻게 저장되는지 먼저 정리한다. 예시를 들기 위해 크기 7인 int 배열을 선언하고 동시에 초기화한다.

예를 들어 다음과 같이 선언된 배열의 각 데이터는 다음 표와 같이 저장된다.

위 표에서 보다시피 배열 내부에 각 데이터들은 배열명[인덱스] 형식으로 각각 저장되며 이때 인덱스는 0부터 시작한다.

실행 시간 초기화/배열 요소 접근

배열을 선언하고 난 후 배열 전체의 데이터를 바꾸거나 배열의 일부분을 수정해야 할 경우가 있다. 선언과 동시에 초기화하는것이 아니라면 배열의 각 요소마다 값을 대입해주어야 하며 기본적인 문법은 다음과 같다:

배열명[접근하고자 하는 부분의 인덱스값] //이 자체를 하나의 변수로 생각하면 된다.

아예 배열명[인덱스] 자체를 하나의 변수로 보면 편하다. 일반적인 변수를 다루듯이 사용하면 된다. 아래는 몇 가지 예시이다.

 

 

4. 2차원 배열

2차원 배열의 선언

지금까지는 배열의 크기를 하나만 지정하였고, 따라서 배열의 데이터는 1차원으로 저장되었다고 생각할수 있다. 배열 선언 시 길이 요소를 2개로 설정이 가능한데, 이를 2차원 배열이라고 하며 문법은 다음과 같다:

(자료형) (배열명)[배열의 길이 1][배열의 길이 2];

예시)

이때 2차원 배열을 1차원 배열로 이루어진 배열로 이해하면 좋다. 혹은 2차원 배열에 한해 배열명[row][column] 으로 이해해도 된다. 아래는 1차원 배열과 2차원 배열의 데이터 저장 형식을 정리한 것이다.

<1차원 배열>

<2차원 배열>

2차원 배열의 초기화(컴파일 시간)

2차원 배열의 컴파일 시간 초기화 방법은 두 가지가 있다. 기본적으로 1차원 배열의 초기화 방법이랑 비슷하지만 차원이 다른 만큼 조금 다른 부분도 있다.

첫번째 방법

2차원 배열을 단순한 1차원 배열로 보고 초기화하는 방법이다. 2차원 배열을 선언할 때 메모리 공간의 할당은 각 인덱스를 하나의 숫자로 읽었을 때 낮은 순서로 1열로 배치된다. (이는 3차원 이상 배열에서도 마찬가지이다.) 다음 표를 보면 된다.

(숫자가 증가하는 방향으로 되어 있다.)

그러므로, 1차원 배열과 마찬가지로 단순히 중괄호를 사용하여 원소들을 순서대로 대입하면 초기화가 가능하다. 또한 1차원 배열과 마찬가지로 명시되지 않은 원소들은 모두 0으로 초기화된다. 다음은 그 예시이다.

이때의 출력은

두번째 방법

두번째 방법은 2차원 배열을 1차원 배열로 이루어진 배열로 보고 각 원소(즉 배열을 말한다)를 초기화하는 방법이다. 더 간단히 말하면, 2차원 배열을 행렬로 보고 각 행별로 초기화하는 방법이다. 문법은 다음과 같다:

(자료형) (배열명)[길이 1(row)][길이 2(column)] = { { 0번째 행 데이터} , { 1번째 행 데이터 } , { 2번째 행 데이터 } ... };

이때 데이터의 개수는 모자라도 되며 모자란 경우 명시하지 않은 배열 원소들은 모두 0으로 초기화된다. 단 데이터의 개수가 넘치면 안 된다. 아래에 예시들을 두었다.

첫 번째 배열의 모든 원소를 출력하면 다음과 같은 결과가 나온다:

 

 

5. 다차원 배열

배열은 3차원 이상으로 선언할 수도 있으며 이론적으로는 차원에 한계가 없다. 다만 컴파일러에 따라 7~10차원까지만 제한이 있긴 하다.

3차원 이상 배열이라도 기본적인 원리는 2차원 배열과 똑같기 때문에 간단하게만 정리한다.

다차원 배열 선언

(자료형) (배열명)[배열의 길이 1][배열의 길이 2][배열의 길이 3]....;

그냥 길이만 계속 추가해주면 다차원 배열 선언이 가능하다.

데이터 저장 방식

2차원 배열과 마찬가지로 배열을 원소로 가지는 배열이라고 생각하면 된다. 예를 들어서 3차원 배열 int arrayee[2][3][4] 의 경우 3X4 크기를 가지는 2차원 배열이 2개 있는 배열이라고 생각하면 되며 좀더 일반적으로는 다음과 같다:

각 원소 접근

1차원 배열과 마찬가지로 인덱스만 잘 써주면 된다. 아래에 예시 코드를 첨부함