1. Introduction
C 언어는 오늘날에도 시스템 프로그래밍 및 임베디드 프로그래밍 분야에서 여전히 널리 사용됩니다. 이 언어에서 문자열과 배열은 데이터를 관리하기 위한 핵심 요소입니다. C를 배우면서 문자열이 “문자들의 배열”로 취급된다는 고유한 규격을 이해하는 것은 피할 수 없습니다.
이 글에서는 C에서 문자열과 배열의 기본 개념을 깊이 있게 살펴보고, 초급 및 중급 프로그래머가 흔히 갖는 “문자열과 배열의 차이점 및 관계”에 대한 질문을 해결하고자 합니다.
실제 프로그램 예제를 통해 배열과 문자열 선언 방법, 문자열 조작을 위한 기본 함수, 메모리 관리 시 주의할 점 등을 다룰 것입니다. 이를 통해 C에서 문자열을 보다 안전하고 효율적으로 사용할 수 있게 됩니다.
2. Basics of Arrays
C에서 배열을 이해하는 것은 문자열 조작의 기반이 됩니다. 이 섹션에서는 배열의 개념과 사용법을 설명합니다.
What is an Array?
배열은 같은 타입의 데이터를 연속된 메모리 위치에 저장하는 구조입니다. 예를 들어 int 배열을 선언하면 여러 정수를 한 번에 다룰 수 있습니다. C에서 배열은 다음과 같이 선언합니다.
int numbers[5]; // An array to store 5 integers
이 코드는 numbers라는 이름의 정수 배열을 선언하고, 5개의 정수를 저장할 메모리를 할당합니다. 각 요소는 인덱스를 사용해 접근합니다.
Declaring and Initializing Arrays
배열을 선언하면서 동시에 초기화할 수 있습니다. 초기화란 선언 시 초기값을 설정하는 것을 의미합니다.
int numbers[5] = {1, 2, 3, 4, 5}; // Declaration and initialization of an array
여기서는 numbers 배열이 1부터 5까지의 정수를 순서대로 저장합니다. 초기화를 생략하면 배열은 정의되지 않은 값(메모리의 쓰레기 데이터)을 포함하게 됩니다.
Memory Layout and Access of Arrays
C에서 배열은 연속된 메모리에 저장됩니다. 예를 들어 int numbers[5]를 선언하면 numbers[0]부터 numbers[4]까지 연속된 메모리 위치가 할당됩니다.
요소는 0부터 시작해 크기‑1까지의 인덱스로 접근합니다.
printf("%d", numbers[0]); // Print the first element of the array
배열을 사용하면 같은 타입의 여러 데이터를 하나의 변수 아래에 모아 관리하고, 효율적으로 연산할 수 있습니다.
3. Basics of Strings
C에서 문자열은 단순히 문자들의 나열이 아니라 특수한 배열로 취급됩니다. 이 섹션에서는 C 문자열의 구성 요소와 조작 방법을 설명합니다.
What is a String?
C에서 문자열은 끝에 널 문자('\0')가 붙은 문자 배열로 표현됩니다. 이 널 문자는 문자열의 끝을 표시하며, 문자열 연산에서 중요한 역할을 합니다.
예를 들어 다음과 같이 문자열을 정의할 수 있습니다.
char greeting[6] = {'H', 'e', 'l', 'l', 'o', ' '};
여기서 greeting 배열은 5개의 문자 “Hello”와 그 뒤에 널 문자를 저장합니다. C에서는 문자열이 끝에 '\0'을 가지고 있으면 문자열로 인식합니다.
Declaring and Initializing Strings
문자열은 문자 배열로 직접 초기화할 수 있습니다. 일반적으로 문자열 리터럴을 사용해 선언 및 초기화를 수행합니다.
char greeting[] = "Hello";
이 형태에서는 컴파일러가 자동으로 널 문자를 추가하므로 greeting 배열의 크기는 6(문자 5개 + 널 문자)입니다. 널 문자를 무시하면 잘못된 결과가 발생할 수 있습니다.
String Literals vs. Character Arrays
C에서 문자열 리터럴과 문자 배열은 비슷하지만 차이가 있습니다. 문자열 리터럴은 const char*로 선언되며, 변경할 수 없는(read‑only) 데이터입니다.
const char *greeting = "Hello"; // String literal
반면 문자 배열은 일반 배열처럼 수정이 가능합니다. 예를 들어 char greeting[] = "Hello";는 요소들을 자유롭게 바꿀 수 있습니다.
greeting[0] = 'h'; // Change "Hello" to "hello"
두 형태의 차이를 이해하면 메모리 관리와 오류 방지에 큰 도움이 됩니다.



