본문 바로가기
C++/문자열

[C++] 문자열이란 무엇인가 (문자열은 배열이다)

by bigpicture 2022. 8. 12.
반응형

숫자와 문자입력 복습

C++에서 숫자와 문자는 하나의 메모리 공간에서 정의됩니다. 예를들어 3이라는 숫자를 정수형태로 정의하고 싶으면 아래와 같이 입력하면 됩니다. 

int a=3;


위와 같이 선언하면 메모리 공간에서 4바이트 만큼의 공간이 확보되고 a라는 이름이 붙습니다. 4바이트의 공간은 32비트이고 각 비트에 0 또는 1이 채워지면 3을 표현합니다. 

문자를 입력할 때는 어떨까요. b라는 문자를 아래와 같이 입력했다고 합시다. 

char mychar='c';


char은 1바이트 공간을 차지하므로 메모리 공간에 1바이트 만큼의 공간이 확보되고 mychar 이라는 이름이 붙습니다. 1바이트는 8비트이므로 8비트 공간을 0 또는 1로 채워야 하는데요. c는 문자입니다. 문자를 숫자로 어떻게 나타낼까요. 컴퓨터는 이진수밖에 저장할 수 없기 때문에 문자를 정수로 변환하여 저장합니다. 문자와 정수를 대응시키는 규칙이 아스키코드입니다. 아래는 몇가지 예시입니다. 

97 a
98 b
99 c
100 d

 

문자열 선언방법

C++에서 숫자와 문자를 입력하는 방법은 알았습니다. 그렇다면 문자열은 어떻게 입력할까요? 

문자열은 문자 여러개로 구성되어 있습니다. 예를 들면 아래와 같습니다. 

"hello"

문자열은 배열을 이용하여 입력합니다. 배열의 각 원소 자리에 문자를 하나씩 할당하는 것입니다. 아래와 같이 선언합니다. 

char str1[ ]={'h','e','l','l','o'};


선언하기가 너무 불편합니다. 다행히 아래와 같이 선언해도 됩니다. 

char str1[ ]="hello";


배열의 크기를 정해주지 않았다는 것을 알 수 있습니다. 정해줘도 되지만, 비워두면 알아서 설정됩니다. 배열의 크기가 얼마로 설정되었는지 확인해봅시다. 

cout<<sizeof(ar)<<endl;


결과로 6이 출력됩니다. 어? 이상합니다. hello 는 다섯글자인데 왜 배열 크기는 6인걸까요. 5여야 하지 않나요?

 

문자열의 끝을 장식하는 널 문자

배열의 길이가 5가 아닌 6인 이유는 널 문자 때문입니다. 아래 문자열을 다시 봅시다. 

char str1[ ]="hello";


위와 같이 선언했을 때 실제로 생성되늰 배열은 아래와 같습니다. 

{'h','e','l','l','o','\0'};


\0 는 널문자입니다. 아스키코드에서 숫자 0에 대응됩니다. 따라서 널문자를 정수형태로 출력하면 0이 출력됩니다. 문자로 출력하면 아무것도 출력하지 않습니다. 하지만 공백문자와는 다릅니다. 공백문자는 아스키코드 32이고, 널문자는 아스키코드 0입니다. 공백문자와 널문자의 문자 출력 결과는 같습니다. 

마지막에 널문자를 추가하는 이유는 무엇일까요? 문자열의 끝을 컴퓨터에 알려주기 위함입니다. 문자열의 끝을 알려줘야 하는 이유가 있습니다. 문자열을 아래와 같이 선언할 수도 있기 때문입니다. 

char ar[15]="hello";


문자열 길이 보다 큰 크기의 배열에 문자열을 입력하는 것입니다. 위와 같이 입력해도 됩니다. 이때 나머지 원소들에는 숫자 0이 채워집니다. 문자열 마지막에 널문자가 온다는 규칙을 만들어 놓지 않으면 컴퓨터는 어디까지가 문자열인지를 알지 못합니다. 

반응형

댓글