키위백과의 잡동사니

배열 - 문자열의 정체: char 배열과 NULL 문자 본문

잡동사니/C언어 공부

배열 - 문자열의 정체: char 배열과 NULL 문자

KiwiPedia 2025. 9. 24. 14:00

C언어에서 int, double 등 다양한 자료형을 배웠지만, '문자열(String)'이라는 자료형은 본 기억이 없으실 겁니다. C언어는 다른 최신 언어들과 달리 문자열을 위한 전용 자료형을 제공하지 않기 때문입니다.

대신 C언어는 char 자료형의 배열특별한 마무리 문자를 조합하는 독특한 방식으로 문자열을 다룹니다. 오늘은 C언어 문자열의 진짜 정체와 그 사용법에 대해 자세히 알아보겠습니다.

 

1. 문자(')와 문자열("), 결정적 차이: NULL 문자(\0)

C언어에서 작은따옴표와 큰따옴표는 하늘과 땅 차이입니다.

  • 문자 상수: 'A'처럼 작은따옴표(' ')로 감싼 단 하나의 문자입니다. 메모리에는 아스키코드 값 하나(1바이트)만 저장됩니다.
  • 문자열 상수: "A"처럼 큰따옴표(" ")로 감싼 문자들의 나열입니다.

여기서 가장 중요한 차이점이 등장합니다. 큰따옴표로 감싸인 모든 문자열 상수의 끝에는, 컴파일러가 눈에 보이지 않는 \0 (NULL 문자)를 자동으로 붙여줍니다. 이 NULL 문자는 "여기서 문자열이 끝납니다"라는 마침표 역할을 합니다.

따라서,

  • 'A'는 메모리에 A (1바이트)
  • "A"는 메모리에 A, \0 (2바이트) 로 저장되는 완전히 다른 데이터입니다.

 

2. 배열로 문자열 선언하고 초기화하기

이러한 원리 때문에, C언어에서 문자열을 저장하려면 char형 배열을 사용해야 하며, 배열의 크기는 저장할 글자 수보다 최소 1칸 더 크게 만들어야 합니다. 바로 마지막에 들어갈 NULL 문자를 위한 공간이죠.

  • "Hello" (5글자)를 저장하고 싶다면?
    • H, e, l, l, o, \0 → 총 6개의 문자가 필요!
    • char str[6] = "Hello"; // OK
    • char str[10] = "Hello"; // OK (공간이 남지만 문제없음)
    • char str[5] = "Hello"; // Error! NULL 문자가 들어갈 공간이 없음

메모리 효율

char str[100] = "Hello"; 처럼 배열 크기를 너무 넉넉하게 잡으면 사용되지 않는 메모리 공간이 낭비될 수 있습니다. 따라서 저장할 문자열의 최대 길이를 예측하여 (최대 길이 + 1) 만큼의 크기로 배열을 선언하는 것이 효율적입니다.

 

3. 주의! 선언 이후에는 대입할 수 없다

C언어 배열의 가장 흔한 함정 중 하나입니다. 배열은 선언과 동시에 초기화할 수는 있지만, 선언이 끝난 뒤에 문자열 상수를 대입 연산자(=)로 저장할 수는 없습니다.

✅ 올바른 방법 (선언과 동시에 초기화)

char str[10] = "apple";

❌ 잘못된 방법 (선언 후 대입)

char str[10];
// str = "apple"; // 컴파일 에러 발생!

이유: 배열의 이름(str)은 일반 변수와 달리, 배열이 시작되는 '메모리 주소'를 가리키는 포인터 상수입니다. 이미 정해진 주소를 다른 주소("apple"이라는 문자열 상수가 저장된 새로운 주소)로 바꾸려고 하니 에러가 발생하는 것입니다. 선언 이후에 문자열을 복사하려면 strcpy_s와 같은 별도의 문자열 복사 함수를 사용해야 합니다.

 

4. 예제 코드로 확인하기

sizeof 연산자와 문자열 길이를 세는 strlen() 함수를 통해 문자 'H'와 문자열 "Hi"의 차이를 확인해 보겠습니다.

#include <stdio.h>
#include <string.h> // strlen() 함수를 사용하기 위해 필요

int main(void) {
    char ch = 'H';
    // "Hi" (2글자) + NULL 문자(1글자) = 총 3바이트 필요
    char str[3] = "Hi";

    printf("--- 메모리 크기 비교 (sizeof) ---\n");
    printf("문자 'H'의 크기: %zu 바이트\n", sizeof(ch));
    printf("문자열 \"Hi\"가 담긴 배열의 크기: %zu 바이트\n", sizeof(str));

    printf("\n--- 문자열 길이 비교 (strlen) ---\n");
    // strlen()은 NULL 문자를 만나기 전까지의 문자 개수만 셉니다.
    printf("문자열 \"Hi\"의 길이: %zu\n", strlen(str));

    return 0;
}

 

실행 결과

--- 메모리 크기 비교 (sizeof) ---
문자 'H'의 크기: 1 바이트
문자열 "Hi"가 담긴 배열의 크기: 3 바이트

--- 문자열 길이 비교 (strlen) ---
문자열 "Hi"의 길이: 2

sizeof(str)는 H, i, \0을 모두 포함한 배열의 전체 메모리 크기(3바이트)를, strlen(str)은 \0을 제외한 순수 문자열의 길이(2)를 반환하는 것을 통해 NULL 문자의 존재를 다시 한번 확인할 수 있습니다.

 

마무리

오늘은 C언어에서 문자열을 다루는 핵심 원리에 대해 알아보았습니다.

  • C언어의 문자열은 NULL 문자로 끝나는 char 배열입니다.
  • 문자(' ')와 문자열(" ")은 저장 방식이 완전히 다릅니다.
  • 문자열을 저장할 배열의 크기는 항상 (글자 수 + 1) 이상으로 선언해야 합니다.
  • 배열 선언 이후에는 = 연산자로 문자열을 대입할 수 없습니다.
Comments