'class'에 해당되는 글 2건

  1. 2008.10.21 문자열 이야기
  2. 2007.11.04 [C++]Integer Class 구현 2
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 머리
Study - Programming/C/C++2007. 11. 4. 01:44

  솔직히 말해서 C++은 공부를 거의 문법 스펙을 읽기만 하고 실제로 짜본건 거의 없었다. 한떄는 C보다 C++을 훨씬 많이 하곤 했었는데 지금은 거의 C로만하니 당연히 까먹을 수밖에.

  거기다 이번에 하드디스크 데이터를 날려먹으면서 그동안 연습해왔던 C++코드까지 다 잃어버려서 새로 시작하자는 의미로 하나 하나 클래스 몇개를 만들어 보기로 했다.

  그 첫번째로 우선 Integer Class를 구현해 보았다. 기본 데이터 타입인 int를 직접 만들어 본 것. 역시 많이 버벅대었다. 제대로 되었는지도 잘 모르겠고. 특히 멤버의 생성과 소멸 부분에서 많이 헤매었고 연산자 오버로딩 부분도 아직 잘 모르겠다.

  구현한 것들은 다음과 같다.
1. Constructor//Destructor
2. Assignment Operator
3. Relationship Operator
4. Arithmetic Operator
5. Array Operator

  뭐 대부분이 연산자와 관련된 부분이지만 실제 필요한 부분은 거의 넣은 것 같다. 많이 부족하지만 앞으로 많이 공부해 봐야지.

  다음 구현할 것은 String Class. 힘내자.

invalid-file

Integer_class

Posted by 머리