[CS50] 메모리 - 문자열과 메모리

TIL

우리는 이전에 string이라는 자료형을 사용했지만, 이는 실제로 C에서 존재하지 않는 자료형이다.

문자열이 실제로 메모리상에 어떻게 저장되어 있는지, 문자열을 손쉽게 저장하고 접근하기 위한 방법을 배워보자.

문자열의 정체

지금까지 문자열을 저장하기 위해 CS50 라이브러리에 포함된 string 자료형을 사용했다.

string s = "EMMA";

 

문자열은 결국 문자의 배열이다. s[0], s[1], s[2], ...와 같이 하나의 문자가 배열의 한 부분을 나타낸다.

 

가장 마지막의 \0은 0으로 이루어진 바이트로, 문자열의 끝을 표시하는 약속이다.

변수 s는 결국 이러한 문자열을 가리키는 포인터가 된다.

더 정확히는 문자열의 가장 첫 번째 문자, 즉 주소 0x123에 있는 s[0]을 가리킨다.

 

string의 정의

실제 CS50 라이브러리에서 string 자료형은 다음과 같이 정의되어 있다.

typedef char *string
  • typedef: 새로운 자료형 정의
  • char *: 문자에 대한 포인터
  • string: 자료형의 이름

 

동일한 두 가지 표현

다음 두 코드는 동일하게 작동한다.

1. string 자료형을 이용한 출력

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    string s = "EMMA";
    printf("%s\n", s);
}
// 출력
// EMMA

 

2. char 포인터를 이용한 출력

#include <stdio.h>

int main(void)
{
    char *s = "EMMA";
    printf("%s\n", s);
}
// 출력
// EMMA

변수 s는 문자에 대한 포인터가 되고, "EMMA"라는 문자열의 가장 첫 번째 문자의 주소를 저장한다.

 

메모리 구조

"EMMA" 문자열의 메모리 구조:

주소 값 인덱스
0x123 'E' s[0]
0x124 'M' s[1]
0x125 'M' s[2]
0x126 'A' s[3]
0x127 '\0' s[4]

포인터 s:

  • 값: 0x123 (첫 번째 문자의 주소)
  • 타입: char * (문자 포인터)

 

문자열 접근

char *s = "EMMA";

printf("%c\n", s[0]);    // E
printf("%c\n", s[1]);    // M
printf("%c\n", *s);      // E (첫 번째 문자)
printf("%c\n", *(s+1));  // M (두 번째 문자)
  • 배열 표기법: s[i]
  • 포인터 연산: *(s+i)

 

연습 문제

Q. string 자료형을 정의해서 사용하면 어떤 장점이 있을까?

가독성 향상

string이 훨씬 직관적으로 문자열 변수임을 알 수 있다.

// char 포인터 사용 
char *name = "Alice"; 
char *greeting = "Hello"; 

// string 사용 
string name = "Alice"; 
string greeting = "Hello";

 

추상화

  • 포인터 개념을 몰라도 문자열 사용 가능
  • 초보자에게 친화적
  • 복잡한 메모리 개념을 숨김

 

일관성

다른 자료형과 일관된 형태로 사용 가능

int n = 50;
float f = 3.14;
string s = "EMMA";

 

실수 방지

// 잘못된 사용
char name = "Alice";  // 컴파일 에러
   
// string은 포인터임을 명시
string name = "Alice";  // 자동으로 포인터

 

다만, C의 표준이 아니라는 점(CS50 라이브러리 필요)과 실제 C 개발에서는 char *를 사용한다는 것을 유의해야 한다.

 

결론
string 자료형은 교육적 목적으로 매우 유용하며, 코드의 의도를 명확히 전달한다.
하지만 실제 C 프로그래밍에서는 char *를 직접 사용하는 것이 일반적이다.

'TIL' 카테고리의 다른 글

[CS50] 메모리 - 문자열 복사  (0) 2025.11.08
[CS50] 메모리 - 문자열 비교  (0) 2025.11.07
[CS50] 메모리 - 포인터  (0) 2025.11.07
[CS50] 메모리 - 메모리 주소  (0) 2025.11.07
[CS50] 알고리즘 - 병합 정렬  (0) 2025.11.06
'TIL' 카테고리의 다른 글
  • [CS50] 메모리 - 문자열 복사
  • [CS50] 메모리 - 문자열 비교
  • [CS50] 메모리 - 포인터
  • [CS50] 메모리 - 메모리 주소
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    페이지 라우터
    CS
    typescript
    emotion diary
    App Router
    함수 타입
    generic
    타입 좁히기
    Pages Router
    memory
    문자열
    바닐라 자바스크립트
    클래스
    배열
    Trouble Shooting
    트러블 슈팅
    javascript
    인터페이스
    알고리즘
    Next.js
    C
    algorithm
    useState
    cs50
    자료구조
    앱 라우터
    제네릭
    ai 감성 일기장
    Spa
    react
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[CS50] 메모리 - 문자열과 메모리
상단으로

티스토리툴바