C - 배열의 성질

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C 언어의 흥미로운 세계인 배열에 대해 깊이 알아보겠습니다. 여러분의 친절한 이웃 컴퓨터 선생님이자 저는 이 여정을 안내해 드리게 되어 매우 기쁩니다. 배열의 미스터리를 함께 풀어보겠습니다!

C - Properties of Array

동일 데이터 타입의 모음

C 언어의 배열은 같은 타입의 여러 항목을 저장할 수 있는 정리된 상자 같은 것입니다. 상자에 사과를 넣고 오렌지나 바나나를 넣지 않는 것처럼, 배열도 정확하게 동작합니다!

간단한 예제를 보겠습니다:

int numbers[5] = {10, 20, 30, 40, 50};

여기서 우리는 5개의 정수를 저장할 수 있는 numbers 배열을 생성했습니다. 마치 5개의 자리에 각각 숫자를 넣는 것과 같습니다.

연속 메모리 할당

배열의 멋진 점 중 하나는 메모리가 연속적으로 할당된다는 것입니다. 도미노 라인처럼 서로 이어져 있습니다. 이를 "연속 메모리 할당"이라고 합니다.

이를 시각화해 보겠습니다:

int numbers[5] = {10, 20, 30, 40, 50};

printf("첫 번째 요소의 주소: %p\n", (void*)&numbers[0]);
printf("두 번째 요소의 주소: %p\n", (void*)&numbers[1]);

이를 실행하면 주소가 매우 가까운 것을 볼 수 있습니다!

고정 크기

C 언어의 배열은 고정된 객실 수를 가진 호텔처럼 됩니다. 크기를 선언한 후에는 변경할 수 없습니다. 갑자기 더 많은 객실을 추가하거나 제거할 수 없습니다.

int fixed_array[10];  // 이 배열은 항상 10개의 요소를 가집니다

타입에 따른 길이

배열이 사용하는 메모리의 총량은 그 타입과 크기에 따라 다릅니다. 다양한 종류의 과일이 상자에 차지하는 공간이 다른 것과 같습니다.

int int_array[5];     // sizeof(int) * 5 바이트를 차지합니다
char char_array[5];   // sizeof(char) * 5 바이트를 차지합니다

printf("int_array의 크기: %lu 바이트\n", sizeof(int_array));
printf("char_array의 크기: %lu 바이트\n", sizeof(char_array));

인덱싱

배열은 0부터 시작하여 요소에 접근하는 인덱싱을 사용합니다. 마치 거리의 집을 번호를 매기는 것처럼, 하지만 우리는 1번 대신 0번에서 시작합니다.

int numbers[5] = {10, 20, 30, 40, 50};
printf("세 번째 요소: %d\n", numbers[2]);  // 30을 출력합니다

포인터와의 관계

배열과 포인터는 C에서 최고의 친구입니다. 배열의 이름은 실제로는 그 첫 번째 요소를 가리키는 포인터입니다!

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;  // ptr는 numbers의 첫 번째 요소를 가리킵니다

printf("배열 표기법을 사용한 첫 번째 요소: %d\n", numbers[0]);
printf("포인터를 사용한 첫 번째 요소: %d\n", *ptr);

하한과 상한

배열은 한계가 있습니다 - 하한(보통 0)과 상한(크기 - 1). 이를 벗어나면 실제로 존재하지 않는 주차 공간에 주차하려는 것과 같습니다!

int numbers[5] = {10, 20, 30, 40, 50};
printf("첫 번째 요소(하한): %d\n", numbers[0]);
printf("마지막 요소(상한): %d\n", numbers[4]);

// 주의: 이 작업은 위험합니다!
// printf("상한을 벗어나는 요소: %d\n", numbers[5]);

다차원 배열

배열은 여러 차원을 가질 수 있습니다. 체스 보드나 루비크 정이 그와 같습니다!

int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

printf("1행 2열의 요소: %d\n", matrix[1][2]);  // 6을 출력합니다

복잡 데이터 구조의 구현

배열은 더 복잡한 데이터 구조를 구현하는 기반입니다. 이는 레고 블록처럼 놀이물을 만들기 위한 도구입니다!

간단한 스택 구현 예제를 보겠습니다:

#define MAX_SIZE 100

int stack[MAX_SIZE];
int top = -1;

void push(int x) {
if (top < MAX_SIZE - 1) {
stack[++top] = x;
}
}

int pop() {
if (top >= 0) {
return stack[top--];
}
return -1;  // 스택 하한流水
}

// 사용
push(10);
push(20);
printf("제거된 요소: %d\n", pop());  // 20을 출력합니다

이제 우리가 논의한 주요 메서드를 편리한 표로 요약해 보겠습니다:

메서드 설명 예제
선언 배열 선언 int numbers[5];
초기화 배열 초기화 int numbers[5] = {10, 20, 30, 40, 50};
요소 접근 인덱스를 사용하여 요소 접근 numbers[2]
배열 크기 구하기 배열의 크기 구하기 sizeof(numbers) / sizeof(numbers[0])
포인터 접근 포인터 산술을 사용하여 요소 접근 *(numbers + 2)
다차원 배열 다차원 배열 생성 및 접근 matrix[1][2]

기억하세요, 배열은 여러분의 프로그래밍 도구箱에서 강력한 도구입니다. 처음에는 어려울 수 있지만, 연습을 통해 빠르게 익숙해질 것입니다! (죄송합니다, 조금만 프로그래머 유머를 해봤습니다!)

계속 코딩하고, 계속 배우고, 가장 중요한 것은 즐겁게 만들어가세요! 배열은 C 프로그래밍 세계로의 흥미로운 여정의 시작입니다. 행복하게 코딩하세요!

Credits: Image by storyset