CS 기초/배열

[CS50] 문자열과 배열

담크 2021. 8. 8. 23:59

C뿐 아니라 많은 프로그래밍 언어들은 문자열을 저장하기 위해 string 자료형을 사용했습니다. 문자열이라는 단어는 문자가 나열되어있다. 즉 배열되어있다.라는 의미로 추측해볼 수 있는데요.

이런 관점에서 string 자료형이 C에서 어떻게 정의되어있는지 배열과 관련해서 공부해보도록 하겠습니다.

 

string은 말 그대로 문자(char)의 배열이었습니다.

만약 string s = "HI!"; 로 정의되어 있다면 s는 문자열이기 때문에 메모리상에 'H', 'I', '!'로 저장되어 있을겁니다.

그런데 사실 문자열은 저번 포스팅에서 설명했듯이 길이가 정해져 있지 않기때문에 메모리의 크기 역시 정해져있지 않습니다.

그럼 string이 연속으로 정의되어있다면 어떻게 구분할까요??

그래서 string에는 종단 문자인 '\0'가 존재합니다. 문자열의 끝을 나타내 줍니다. 따라서 string s = "HI!"; 가 정의되어 있을 때 정확히 말하자면 메모리상에는

이렇게 저장되어있을 겁니다.

실제로 코드를 작성해보면 출력이 되는것을 확인할 수 있습니다.

names[0] = "HI!";

printf("%c%c%c%i\n", names[0][0], names[0][1], names[0][2], names[0][3]);

 

그러면 이제 실제로 문자열이 동시에 선언된 경우를 만들어보겠습니다.

string names[4];

names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRAIN";
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]);

이렇게 코드가 작성되어있다면 첫 번째와 두 번째 printf의 차이는 무엇이 있을까요??

여기서 첫 번째 printf는 names의 첫번째 인덱스의 값인 "EMMA"를 출력한다는 것은 다들 아실 겁니다.

두 번째 printf는 string인 s가 아닌 char인 c로 형식 지정자를 지정한 것을 볼 수 있는데요 따라서 출력하는 것은 문자형태라는 것을 알 수 있습니다. 처음 보면 어려워 보일 수 있지만 자세히 살펴보면 우선 names[0]는 EMMA를 뜻합니다. 이 EMMA를 문자로 나누어보면 'E', 'M', 'M', 'A'로 나누어볼 수 있겠죠? 그럼다면 이것은 names[0]인 "EMMA"의 각각 0번지, 1번지, 2번지, 3번지 값일 겁니다. 이걸 그대로 배열로 쓰면 names[0][0], names[0][1], names[0][2], names[0][3] 이런 모양이 되는데 이를 2차원 배열이라고 합니다. 

그래서 결국엔 첫 번째 printf와 두 번째 printf의 값은 같습니다.

실제 결과를 보면

값이 같은 것을 확인할 수 있습니다.

 

결론은 결국 위의 코드처럼 string으로 4개를 저장했을 때 실제로 메모리상에 저장된 것을 보면

각각에 해당하는 인덱스를 확인할 수 있다는 것을 볼 수 있습니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 명령행 인자  (0) 2021.08.10
[CS50] 문자열의 활용  (0) 2021.08.09
[CS50] 배열  (0) 2021.08.07
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 디버깅  (0) 2021.08.05