Table of contents
우리는 여태껏 문자열을 저장하기 위해 string
자료형을 사용했다.
‘문자열’이라는 단어는 다시 말해 문자가 ‘나열되어 있다’ 또는 ‘배열되어 있다’ 라는의미로 추측해 볼 수 있다.
이런 관점에서 봤을 때 string 자료형은 C에서 정확히 어떻게 정의되어 있을까?
배열이라는 개념이 문자열과 어떻게 연결되는지 알아보자.
우리가 여지껏 사용한 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형의 데이터들의 배열이었다.
string s = “HI!”;
와 같이 문자열 s
가 정의되어 있다고 생각해보자.
s
는 문자의 배열이기 때문에 메모리상에 아래의 그림과 같이 저장되고, 인덱스로 각 문자에 접근할 수 있다.
여기서 가장 끝의 \0
은 문자열의 끝을 나타내는 널 종단 문자로, 단순히 모든 비트가 0인 1바이트를 의미한다.
다음 코드와 같이여러 문자열이 동시에 선언된 경우를 살펴보자
string names[4];
names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRIAN";
names[3] = "DAVID";
printf("%s\n", names[0]);
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
names
라는 문자열 형식의 배열에 네 개의 이름이 저장되어있다.
printf("%s\n", names[0]);
names
의 첫번째 인덱스의 값, 즉 “EMMA”를 출력한다.
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
- 형식 지정자가
%s
가 아닌%c
로 설정되어 있음을 확인할 수 있다. - 따라서 출력하는 것은 문자열이 아닌 문자이다.
- 여기서는 각 이름의 두번째 문자를 출력하고자 하는데
names[0][1]
과 같이 2차원 배열을 통해 접근할 수 있다.
다시 말해 names[0][1]는 names의 첫 번째 값, 즉 “EMMA”라는 문자열에서, 그 두번째 값, 즉 ‘M’ 이라는 문자를 의미한다.
아래의 그림에서 names
가 실제 메모리상에 저장된 예시와 해당하는 인덱스를 확인할 수 있다.
생각해보기
널 종단 문자는 왜 필요할까요?
널 종단 문자는 문자열의 끝을 명확하게 표시하기 위해 필요합니다. 이를 통해 프로그램이 문자열의 길이를 정확히 인식할 수 있습니다.