string

IKNOW·2024년 4월 27일

greate code

목록 보기
2/6

문자열은 정수 다음으로 많이 사용되는 타입이다. 일반적으로 문자열은 길이와 문자라는 두 속성을 갖는다.

문자열 형식

0 종료 문자열 zero-terminated string

0 종료문자열은 널리 사용되는 문자열 표기 방식이다. C/C++ 을 포함한 주요 언어의 네이티브 문자열 형식이다. 또한 별도의 문자열 형식을 지정하지 않는 어셈블리에서도 자주 사용된다.

장점으로는

  • 어떤 길이의 문자열도 1바이트의 오버헤드 만으로 표기할 수 있다.
  • 구현이 용이하다.

단점

  • 문자열 데이터를 처리함에 있어 문자열의 길이를 알아야 하는 경우, 0 종료 문자열은 효율성이 떨어진다. 길이를 계산하기 위해 문자열 전체를 스캔해야한다.
  • 문자 코드 값이 0인 문자(NUL, 0)을 나타내기 어려군 경우가 있다.
  • 종료를 의미하는 0바이트 뒤로 얼마나 길어질 수 있는지 알려주지 않는다. cancatenation을 하는 경우 오버플로우가 발생할 수 있다.

길이 정보 전치 문자열 length-prefixed string

길이 정보를 담은 1바이트가 맨 앞에 오고, 그 위에 8비트 문자 코드가 이어진다.
”abc”의 경우 맨앞에 길이를 나타내는 $03이 위치하여 4바이트로 표현이 가능하다.

0 종료 문자열의 2가지 단점을 해결하는데, NULL 문자 표현이 용이하고, 문자열 함수의 연산 효율성이 높아진다.

단점으로는 길이 정보에 1바이트만 사용하기 때문에 최대 255개 문자만 나타낼 수 있다. 길이 정보 바이트를 늘릴 수도 있지만, 오버헤드가 증가하게 된다.

HLA 문자열

문자열당 몇 바이트의 오버헤드가 큰 문제가 아니라면 길이 정보 전치 문자열과 0종료 문자열의 장점을 결합하여 HLA 문자열같은 방식을 사용할 수 있다.

우선 단점으로는 하나의 문자열에 9바이트의 이르는 오버헤드가 존재한다는 것이다.

첫번째 문자 바로 앞의 4바이트는 현재 문자열의 길이를 나타내고, 그 앞의 4바이트는 문자열의 최대 길이를 나타낸다. 마지막 문자의 뒤쪽에는 종료를 의미하는 0이 존재한다.

HLA는 문자열을 읽을때 최대 길이를 나타내는 바이트 위치를 가져오는 것이 아니라, 첫번째 문자를 나타내느 포인터 값을 가져온다. 그후 그 값에서 -4만큼 떨어진 위치에서 length 필드의 데이터를 가져오고 최대 길이가 필요한 경우 -8만큼 떨어진 위치에서 MaxLength를 가져온다.

HLA문자열은 0 종료 문자열과 호환된다. (단, 이때, 0종료 문자열에서 문자열의 길이를 바꾸는 연산을 하면 안된다, Length, MaxLength 필드가 변하지 않는다.)

서술자 문자열

정보와 문자 데이터 포인터를 모두 담을 수 있는 체계가 서술자 기반 문자열이다.

type
	  dString :recode
		          curLength :integer;
		          strData   :^char;
		end;

strData 포인터는 문자열의 첫번째 문자의 주소값을 지니고, curLength는 문자열의 현재 길이 값을 지닌다.

주요한 특징중 하나는 어느 한 문자열에 해당하는 문자 데이터가 더 큰 문자열의 일부분일 수 있다. 이를 통해 메모리를 절약할 수 있고, substring() 같은 특정 함수가 효율적으로 작동할 수 있다.

자바 문자열

자바는 기본적으로 서술자 기반 문자열 형식을 사용하지만, String 타입의 작동 방식은 외부로 드러나지 않는다.

초기 자바에선 16비트 유니코드 문자의 배열 포인터, 카운트 필드, 오프셋 필드, 해쉬 코드 필드 네가지 서술자로 String을 정의했다.

자바 문자열은 더 큰 문자열에 포함된 하위 문자열은 동일한 문자 배열을 공유하기 때문에 오프셋 필드와 카운트 필드를 이용해 하위 문자열 연산을 할 수 있어야 했다. 그러나 일부 상황에서 메모리 누수로 이어지는 문제가 발생하여, 오프셋 필드와 카운트 필드가 제거되었고 2byte unicode를 UTF-16으로 변경하였다.

이후 oracle이 java 프로그램들을 조사한 결과 대부분의 프로그램이 Latin-1 문자셋만 사용하는 것으로 확인하여, String 서술자에 해당 문자열이 UTF-16 or Latin-1 인코딩을 사용하는지 명시하는 필드를 추가하여 메모리 소모를 줄이고 GC의 작업또한 감소시켰다.

파이썬 문자열

파이썬은 UCS-2 인코딩 방식을 사용하다가, UTF-16, UTF-32인코딩을 지원하도록 변경했다. 최신 파이썬에서는 문자열에서 개별 문자를 추적하는 특수한 문자열 형식을 사용하고 표현방식을 통해 ASCII, UTF-8, UTF-16, UTF-32등을 옵션으로 선택할 수 있다.

profile
조금씩,하지만,자주

0개의 댓글