문자열이란 ..

2025. 7. 14. 21:13·Develop

📌 문자열이란?

문자열은 본질적으로 문자들의 배열이다.

📌 문자열의 저장방식

c

주소:    1000  1001  1002  1003  1004  1005
내용:     'H'     'e'     'l'      'l'     'o'     '\0'

java

// Java String 내부 구조 (개념적)
class String {
    char[] value;     // 문자 배열
    int length;       // 길이
    int hash;         // 해시값 (캐싱)
}

python

# 개념적 구조
class PyUnicodeObject:
    def __init__(self, text):
        self.length = len(text)
        self.hash = -1  # 지연 계산
        self.kind = self._determine_kind(text)  # 1, 2, 또는 4바이트
        self.data = self._encode_data(text)

📌 왜 다를까?

C언어

  • 성능 우선: 단순하고 빠름
  • 메모리 최소화: 오버헤드 거의 없음
  • 유니코드 미지원: ASCII만 기본 지원

현대 언어의 요구사항

  • 유니코드 지원: 전 세계 문자 지원
  • 안전성: 버퍼 오버플로우 방지
  • 편의성: 길이 정보, 다양한 메서드
  • 최적화: 메모리 효율성과 속도 최적화근데 해시값은 어떻게 활용?여기서 hash는 문자열이 딕셔너리 또는 셋에 저장될 때 활용한다.

📌 핵심 정리

해시의 역할:

빠른 위치 계산: O(1) 평균 시간에 데이터 위치 찾기
균등 분산: 데이터를 배열 전체에 고르게 분산
중복 검사: 빠른 중복 확인 (셋에서)
메모리 효율성: 작은 배열로도 많은 데이터 관리
메모리 최적화
문자열 인터닝

Python 예시

a = "hello"
b = "hello"
print(a is b) # True (같은 메모리 주소)
메모리 풀:
"hello" → 주소 1000
a → 1000을 참조
b → 1000을 참조 (새로 생성하지 않음)
문자열 인터닝은 새로운 문자연산시 새로운 객체를 생성
즉 문자열을 계속 만드는건 메모리 낭비가 있을 수 있음.

join같은 메서드로 하나의 문자열을 만드는 방식이 좋다.

📌 효율적으로 사용하려면?

C/C++:

  • 스택 버퍼 우선 사용
  • 크기 미리 계산 후 할당
  • 안전한 함수 사용 (strncpy, strncat)
  • C++에서는 string_view, 이동 시맨틱 활용JavaScript:
  • Template literals 사용
  • 많은 연결 시 배열 + join
  • 정규표현식 객체 재사용
  • 큰 문자열은 청크 단위 처리Python:
  • join() 방식으로 연결
  • f-string 사용
  • StringIO로 대용량 처리
  • 제너레이터로 메모리 효율성
  • 컴파일된 정규표현식 재사용📌 총평

자동 문자열 인터닝이 가능하므로
새로운 문자열을 생성하는것을 지양한다.

방법은

  • 중간과정 없이 하나의 문자열을 만드는 join
  • 기존 문자열 인터닝을 사용하는 f-string
  • 대용량 데이터는 buffer(배열같은..?)에 문자열을 모두저장한뒤 중간과정 없이 한번에 문자열을 생성

+Buffer를 사용하는 이유:

시간복잡도 개선: O(n²) → O(n)
메모리 효율성: 중간 객체 생성 최소화
스트림 처리: 실시간 데이터 처리 가능
인터페이스 통일: 파일과 동일한 방식으로 사용
위치 제어: seek, tell로 정밀한 제어 가능

'Develop' 카테고리의 다른 글

싱글링크드리스트  (1) 2025.07.19
정렬의 종류  (0) 2025.07.16
정렬이란??  (0) 2025.07.16
배열의 의미, 동작방식, 최적화 등등  (0) 2025.07.13
CS:APP 1장 컴퓨터 시스템으로의 여행  (0) 2025.07.12
'Develop' 카테고리의 다른 글
  • 정렬의 종류
  • 정렬이란??
  • 배열의 의미, 동작방식, 최적화 등등
  • CS:APP 1장 컴퓨터 시스템으로의 여행
sj-leeee
sj-leeee
배운것과 느낀것을 적는 공간입니다.
  • sj-leeee
    sj-leeee 님의 블로그
    sj-leeee
  • 전체
    오늘
    어제
    • 분류 전체보기 (23)
      • LIFE (5)
      • Develop (17)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 깃허브
    • 이전블로그
  • 공지사항

  • 인기 글

  • 태그

    AWS
    컴파일
    8주차
    운영체제
    krafton
    heap
    Pintos
    LinkedList
    정글
    node.js
    MQ
    크래프톤
    싱글스레드
    Algorithm
    크래프톤정글
    Kafka
    rbtree
    malloc
    git
    Jungle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
sj-leeee
문자열이란 ..
상단으로

티스토리툴바