Study - Programming/C/C++2008. 10. 21. 19:37
  요즘 '조엘 온 소프트웨어'라는 책을 읽고 있는데 그 책에서 문자열 관련 이야기가 나오기에 그 내용을 참고하여 한번 이야기 하고자 한다.

  C의 문자열 구조는 먼저 문자열 내용이 있고 그 다음 '널 문자'가 들어가는 형식이다. 즉 "Hello"라는 문자열을 표현하려면 

'H' 'e' 'l' 'l'o' '\0' (단,\0 은 Null Characher)

  이렇게 6글자(sizeof(char) == 1이므로 6Byte)를 차지하게 된다. 이 Null Character의 사용 용도는 문자열의 끝(End of String)을 나타내기 위한 방법인데, 적어도 C에서는 이 문자가 없다면 메모리 어느 부분에 우연히 이 문자가 있는 것을 발견할때까지 계속해서 읽게 되어 엉뚱한 문자열이 나오게 된다.

  언뜻 보면 무슨 내용이 들어 있을 지 모르는 메모리에 이런 방식으로 문자열을 담는 것은 꽤 괜찮은 방법처럼 보인다. 하지만 조금 만 더 생각해보면 이것보다 좋은 대안을 찾을 수 있다.
  무엇보다 위 방식의 가장 큰 단점은 무슨 작업을 하려면 반드시 문자열 처음부터 끝까지 탐색을 하러 가야 한다는 것이다.
  예를 들어보자. 문자열의 길이를 알아내는 함수(strlen)를 구현해 보자고 한다면 문자열의 첫 포인터에서 Null Character을 찾을 때까지 포인터를 이동시켜야 한다.
  그런데 만약에 이 문자열의 길이가 100이라면? 그리고 1000이라면? 이런식으로 가면 문자열이 길면 길수록 그 처리 속도는 길어질 것이다. 다른 예로, 두 문자열을 잇는 함수(strcat)를 구현하자고 하면 두 문자열의 길이를 알아서 한 문자열에 할당된 크기를 다시 합친 크기로 재할당 해야 하고 문자열의 끝으로 이동해서 복사하는 과정을 수행해야 한다. 이것 역시 문자열의 길이를 구하는 과정에서부터 속도의 문제가 발생한다.
  이런 것을 해결하기 위한 방법으로는 뭐가 있을까? 이런 방법이 있을 수 있다.

'5' 'H' 'e' 'l' 'l' 'o'

  즉, 문자열의 첫 바이트에 문자열의 길이를 넣는 것이다. 이러면 굳이 끝까지 가서 널 문자를 찾을 필요 없이 길이를 첫 바이트에서 알 수 있으므로 그 크기 만큼 포인터를 이동해서 해결 할 수 있다. 여기서 주의해야 할 점은 끝부분에 Null Character을 넣는 방식은 하지 말라는 것이다. 그렇게 하면 정말 이도 저도 아닌 형편없는 문자열 표현 방식이 된다.
  다른 방법으로는 String Class를 구현하는 것인데, 이미 객체지향 프로그래밍 언어나 좀더 고급언어인 경우에는 지원되는 경우가 많다. 클래스의 멤버로 다음과 같은 예를 들 수 있다.

1. 문자열의 저장할 변수
2. 문자열의 길이를 저장할 변수
3. 기타 문자열 관련 함수

  위 방법으로는 효과적이고 자기 나름대로의 알고리즘으로 효율적으로 문자열을 관리 할 수 있을 것이다. 그리고 나 같으면 문자열을 저장 할 때 더이상 Null Character은 넣지 않도록 구현 할 것이다. 그리고 C++같은 경우라면 Operator Overloading등의 기능을 통해서 출력 및 입력, 기타 연산등의 방법도 구현해 보겠다.다만 위의 방법은 각자의 클래스 구현으로 표준이 규정되어 있지 않다면 호환성에서 문제가 발생 할 수 있겠고 조금 무거울 것이다.

  이외에도 많은 방법이 있을 것이다. 중요한 것은 이런 기본 데이터 타입에 만족하지 않고, 뭔가 다른 방식을 조금씩 연구하고 구현해 본다면 많은 도움이 될 것이다.
Posted by 머리