
📌 문자열이란?
문자열은 본질적으로 문자들의 배열이다.
📌 문자열의 저장방식
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 |
