프로그래밍 언어/C

배열(Array)

gcreators 2024. 8. 12. 17:32

배열(Array) 이란?

 

같은 형태의 데이터를 연속적으로 저장하고 활용하려는 경우에 사용하는 것 입니다.

 

100개의 데이터가 있다면 100개의 변수를 지정하고 사용해야합니다

하지만 저 100개의 데이터가 같은 종류라면 크기(길이)가 100인 배열을 하나만 선언한다면 100개의 데이터를 쉽게 다룰 수 있습니다.

 

정수형 변수 i는 4byte를 사용합니다

길이가 4인 정수형 배열 arr[4]는 16byte의 크기를 활용 할 수 있습니다.

// 배열(Array)
// arr: 배열의 이름
// [5]: 배열의 길이
int arr[5] = { 1 , 2 , 3 , 4 , 5};

배열의 선언은 다음과 같이

자료형 변수명[길이] = {초기값}; 으로 이루어 집니다

 

배열에는 몇가지 특징이 있는데

배열의 초기화시 배열의 길이를 넘어가는 갯수의 값을 넣는 것은 안됩니다.

위 코드와 같이 길이가 5인 배열에는 5개 까지의 데이터만 들어 갈 수 있습니다.

갯수가 모자라는 것은 상관 하지 않습니다.

 - 왜냐하면 갯수가 모자랄 경우 나머지 공간에 대한 값은 0으로 채워지게 됩니다.

int arrInit[5] = {3};

printf("arrInit[0]: %d\n", arrInit[0]);
printf("arrInit[1]: %d\n", arrInit[1]);
printf("arrInit[2]: %d\n", arrInit[2]);
printf("arrInit[3]: %d\n", arrInit[3]);
printf("arrInit[4]: %d\n", arrInit[4]);

//사실 for문 한번 돌리면 끝납니다.
//	for (int i = 0; i < 5; ++i) {
//		printf("arr[%d]: %d\n", i, arr[i]);
//	}

초기값으로 3 하나만을 입력하였는데 [0]번에만 3으로 초기화 되고 나머지는 그렇지 않은 것을 볼 수 있습니다.


만일

int arrInit[5];

이렇게 배열만 선언 했을 경우 그 값은

이렇게 쓰레기 값만이 들어오게 됩니다.

저렇게 배열이 선언 된 후에는 값을 하나하나 따로 넣는 것은 가능하나(초기값의 유무에 상관 없이)

arrInit[5];

arrInit = { 10,20,30,40,50 };
//이렇게 하지마시오...

이런 형태로 모든 값을 한번에 넣는 것은 불가능하니 가급적 초기값을 잘 넣거나

아니면 값을 따로 하나하나 다 넣어야 함을 기억해야 합니다.

 

배열은 0에서부터 시작됩니다.

가장 앞자리는 0으로 시작되어 크기가 4라면 가장 끝은 3

10이라면 가장 끝은 9 입니다

반드시 기억해둬야 합니다.

 

배열은 [길이] '선언' 때 몇가지 규칙이 있는데

[-5]와 같이 배열의 길이 선언시 음수가 나와선 안되고

[1.5]와 같이 실수가 나와선 안됩니다

무조건 양수인 정수가 나와야하며

 

어 그렇다면 위에서 배열을 활용할때 i값으로 for문을 돌렸으니... 변수가 들어가도 되지 않을까?

int len = 5;
int arrFail[len];

이거도 안 됩니다.

 

배열 '선언시' 에는 무조건 상수가 [길이] 부분에 들어가야 합니다.

const int len = 5;
//상수라고는 해도 얘도 안됩니다.

이유는

int len으로 값이 초기화 되는 것은 실행 되는 동안(Run Time)에 결정되는 것 이기 때문입니다.

배열의 메모리 할당은 Compile Time 때 결정 되는 것 이기 때문에 배열에 얼마만큼의 크기가 할당 되어야 하는지를 알 수 없습니다.

때문에 무조건 상수를 직접 입력 해야 합니다.

 

다만!

#define MAX_LEN 5

//MAX_LEN은 Compile 시 5로 치환된다

void main()
{
	int arr[MAX_LEN];
}

얘는 됩니다

define은 전에 설명을 부족하게 하고 넘어갔습니다.

define은 Compile Time때 지정된 값이 치환이 되기 때문에 배열의 크기를 알 수 있어서 활용이 가능합니다.

 

이렇게 길이를 직접 지정해서 배열을 선언 하는 것을

정적배열 (Static array)

이라고 합니다. 이와 반대 되는 개념인 동적 배열은 그 길이를 지정하지 않아도 되기에 Run Time 시에도 활용이 가능하지만 이에 대해서는 다음에 설명 할 수 있도록 하겠습니다.

 

배열의 요소(Elements)

배열을 구성하는 값들을 배열의 요소 라고 합니다

자료형 배열명[길이] ={요소1, 요소2, 요소3,.....}

 

또한

arr[0], arr[1] 처럼 각 배열에 할당되는 저 숫자들을 배열의 index 라고 합니다.

 

int tmpArr[MAX_LEN] = { 0 };
printf("tmpArr: %p\n", tmpArr);
//배열은 값이 아닌 메모리 주소를 저장하고 있음

배열 그 자체는 메모리 주소를 저장하고 있습니다.

for (int i = 0; i < MAX_LEN; ++i)
{
	printf("tmpArr[%d]: %p\n", i, &tmpArr[i]);
}
//배열의 이름은 배열 첫번째 요소의 주소와 같다

배열의 이름에 있는 메모리 주소는 첫번째 요소[0]의 주소와 같습니다.

 

배열의 index 는 시작 지점부터 몇 칸을 건너 뛸 것인가? 라고 보면 되겠습니다.

이런 특성상 배열의 장점으로는

어디에 접근하던지 속도가 같다는 점이 있으며(내가 어디로 가면 되는지만 알고 있으면 되기 때문)
단점으로는 처음 시작할때 배열의 크기를 미리 정해놓고 시작해야 한다는 점이 있습니다.

 

배열의 길이(Length), 크기(Size)

double sizeArr[5] = { 0 };

printf("sizeArr Size : %d byte\n", (int)sizeof(sizeArr));
//정적 배열인 경우에만 가능

printf("sizeArr Length : %d\n", (int)sizeof(sizeArr) / (int)sizeof(double)); 
//자료형이 바뀌게 되면 문제가 생김

printf("sizeArr Length : %d\n", (int)sizeof(sizeArr) / (int)sizeof(sizeArr[0]));
//배열 요소의 갯수를 알아내는 식
//코드를 짤 때는 나중에 바뀌게 되는 것들도 고려를 해서 짜야한다.

 

 

배열의 크기를 알아내려면 다음과 같이 sizeof를 활용하고

길이를 알아내려면 알아낸 크기 / 배열의 첫 요소를 나눠주면 알 수 있습니다.

 

배열의 값 복사


보통 변수의 값을 복사할때는

	int lhs = 5;
	int rhs = lhs;

이런 형태로 변수의 값을 변수에 집어 넣는 식으로 활용 했었습니다

int destArr[3] = copyArr;
int destArr = copyArr;
//이러한 형태로는 복사가 안된다!

배열은 이런식으로는 사용해서는 되지 않고

 

무조건

배열명[index] = 복사할 배열명[index];

이런식으로 하나하나의 요소를 복사 해줘야 합니다.

int copyArr[3] = { 1, 2, 3 };
int destArr[3] = { 0 };
for (int i = 0; i < 3; ++i) {
    destArr[i] = copyArr[i];
}

두개의 배열을 만든 후 for문을 돌려 쉽게 복사가 가능합니다.

'프로그래밍 언어 > C' 카테고리의 다른 글

함수(Function)  (0) 2024.08.13
포인터(Pointer)  (0) 2024.08.13
반복문(Loop)  (0) 2024.08.09
조건문  (0) 2024.08.09
비교 연산자와 논리 연산자  (0) 2024.08.09