6.1 문자열과 문자 배열
문자열과 문자 배열, 둘이 같을까요? 비슷해 보여도 실제로는 큰 차이가 있답니다. 지금 제대로 이해해보세요!
안녕하세요, 코딩을 공부하며 가장 많이 혼란스러웠던 개념 중 하나가 바로 ‘문자열(string)’과 ‘문자 배열(char array)’이었어요. 특히 C 언어나 C++을 공부하시는 분이라면 ‘char str[] = “Hello”;’ 와 ‘char *str = “Hello”;’ 사이의 미묘한 차이 때문에 한번쯤 머리가 아팠을 거예요. 저도 처음엔 “그냥 문자열이잖아?” 라고 생각했는데, 메모리 구조부터 동작 방식까지 전혀 다르다는 걸 알고 나서는 완전 다른 개념처럼 느껴지더라고요. 오늘은 이 헷갈리는 개념을 명확히 정리해드릴게요. 프로그래밍을 더 깊이 이해하려면 반드시 짚고 넘어가야 할 주제입니다!
목차
1. 문자열과 문자 배열의 차이
문자열(string)과 문자 배열(char array)은 겉보기엔 같아 보여도, 내부 동작이나 메모리 처리 방식에서 큰 차이가 있어요. 문자열은 보통 편리한 라이브러리 함수와 함께 제공되는 추상적 개념이라면, 문자 배열은 말 그대로 문자를 원소로 가진 배열입니다. 특히 C 언어나 C++에서는 문자열을 처리할 때 이 차이를 제대로 이해하지 않으면 예상치 못한 버그가 발생하기도 해요.
2. 메모리 구조의 이해
문자열과 문자 배열의 근본적인 차이는 메모리 구조에서 나타나요. 문자열은 보통 포인터로 관리되며, 상수 영역에 저장되고 수정이 불가능한 경우가 많습니다. 반면 문자 배열은 스택에 생성되고 직접 수정이 가능하죠. 아래 표를 보면 이해가 쉬울 거예요.
항목 | 문자열 (char*) | 문자 배열 (char[]) |
---|---|---|
저장 위치 | 데이터 영역(상수) | 스택 영역 |
수정 가능 여부 | 불가능 (읽기 전용) | 가능 |
예시 | char *str = "hello"; | char str[] = "hello"; |
3. 문자열 관련 흔한 오류들
초보자들이 가장 자주 하는 실수는 문자열을 포인터로 선언하고 내용을 수정하려는 거예요. 이는 프로그램이 크래시 날 수도 있는 위험한 동작입니다. 아래에 대표적인 실수를 정리해볼게요.
-
char *str = "hello";
선언 후str[0] = 'H';
→ 오류 발생 -
strcpy()
사용 시 배열 크기 부족 → 메모리 침범 - 널 종료 문자(
'\0'
) 누락 → 쓰레기 값 출력
4. 문자열은 왜 불변인가?
많은 언어에서 문자열은 '불변(immutable)'으로 설계되어 있어요. 이는 보안과 성능 때문인데요, 문자열이 불변이면 여러 코드에서 동시에 참조하더라도 예기치 않은 변경이 없어서 안정성이 높아집니다. 특히 Java, Python 같은 언어에서는 문자열을 수정할 수 없고, 새로운 문자열을 생성하는 방식으로 처리돼요. 물론 C언어의 경우 포인터를 통해 수정이 가능한 것처럼 보일 수 있지만, 그건 메모리 구조의 예외적 상황에 해당해요.
5. 문자 배열 다루기 실전 예제
문자 배열은 문자열과 달리 수정과 삽입, 삭제가 자유롭다는 장점이 있어요. 간단한 문자열 역순 출력 예제를 보면서 배열 조작을 이해해볼게요.
코드 | 설명 |
---|---|
|
문자 배열을 이용해 문자열을 거꾸로 출력하는 예제 |
6. 문자열 함수 총정리
C언어에서는 문자열 관련 표준 함수들이 다양하게 제공됩니다. 그중 자주 사용하는 함수들을 정리해봤어요. 꼭 한 번씩 직접 써보면서 익혀보세요!
strlen()
: 문자열 길이 반환strcpy()
: 문자열 복사strcat()
: 문자열 이어붙이기strcmp()
: 문자열 비교strchr()
: 특정 문자 찾기strstr()
: 문자열 내 부분 문자열 찾기
수정이 필요하면 문자 배열을, 단순 참조만 할 거라면 문자열 포인터를 사용하는 것이 일반적입니다.
보통 문자열 리터럴은 상수 메모리 영역에 저장되기 때문에 수정하면 프로그램 오류가 발생합니다.
char *str = "hello";
와 char str[] = "hello";
의 차이는?전자는 문자열 상수를 가리키는 포인터이고, 후자는 수정 가능한 문자 배열입니다.
'\0'
이 필요한가요?네, C 언어에서는 문자열의 끝을 알리기 위해 반드시 널 문자('\0'
)가 필요합니다.
strncpy()
또는 snprintf()
같이 복사 길이를 지정할 수 있는 함수가 더 안전합니다.
널 문자 포함 여부, 배열 크기 초과 여부, 메모리 접근 위치를 항상 확인하는 습관이 중요합니다.
문자열과 문자 배열은 프로그래밍의 기본이지만, 막상 개념을 정리하려면 헷갈리는 부분이 많아요. 오늘 정리한 내용을 바탕으로 직접 예제를 코딩해보시면 훨씬 명확하게 이해되실 거예요. 특히 C 언어나 시스템 프로그래밍 쪽에 관심이 있다면 메모리 구조에 대한 감각을 키우는 게 정말 중요하답니다. 조금 어렵게 느껴지더라도 괜찮아요. 하나씩 직접 해보며 익혀가면 됩니다. 혹시 더 궁금한 점이 있다면 댓글로 자유롭게 남겨주세요. 같이 공부해요 :)
문자열, 문자배열, C언어기초, 메모리구조, char포인터, char배열, 문자열오류, 널문자, 스트링함수, 문자열비교
'프로그래밍 > C언어' 카테고리의 다른 글
6.3 포인터와 문자열 연산 (1) | 2025.03.26 |
---|---|
6.2 문자열 함수 활용하기 (0) | 2025.03.26 |
C언어 5.4 포인터 활용 심화: 실무 감각까지 키우는 완벽 가이드 (4) | 2025.03.23 |
C언어 배열과 포인터의 관계, 진짜 제대로 이해해보자! (0) | 2025.03.23 |
C언어 포인터 완전 정복: 5.2 포인터의 개념과 기본 연산 (0) | 2025.03.23 |
댓글