C++ 프로그래밍/자료구조와 알고리즘

[자료구조와 알고리즘] String Class 디자인

SW Developer 2024. 2. 25. 16:32

String Class 디자인

: 기존 C++의 string에 대한 문제점을 보완한 새로운 string 클래스를 디자인 해보자. 

<<

 

1. String Class의 효용?

기본적으로 C++의 string은 아래와 같은 문제점들을 갖고 있다.

 

null-terminated char array(char*)

사용자가 메모리를 할당한 후 해제해야 한다

잘못된 사용에 대한 방어수단이 없다

string의 조작이 불편하다

 

 

※ string 사용 시 불편한 코드 예시

#include <iostream>
#include <cstring>
using namespace std;

int main(){
    char* pstr = new char[15]; //사용자가 메모리 할당
    strcpy(pstr, "Old string");

    //pstr[15] = 'A'; 할당되지 않은 Index 사용 시 crash 발생!!

    //concatenation가 매우 불편하다
    char* pnew = new char[30];
    strcpy(pnew, pstr);
    strcat(pnew, " & New String");

    delete[] pstr; //사용자가 메모리 해제
}

 

 

2. String Class 디자인

① Design의 목표

- 사용자가 직접 메모리 할당에 신경쓰지 않도록 한다

- string의 잘못된 사용에도 대처할 수 있는 방안을 마련한다

- string을 편리하게 조작할 수 있는 함수들을 제공한다

- 직관적으로 operator들을 사용할 수 있게 한다 (+, == , = 등)

 

※ 작성할 코드예시

{
	String str; //constructor를 통한 초기화
    
	str = "Old String";//편리한 메모리 할당

	str.SetAt(15, 'A');//잘못된 사용에 대비한 사전방지 처리

	str += " & New String";//편리한 string 조작
  
}//destructor에 의한 자동해제

 

 

② 주요 Features

- 다양한 생성자들

: char*, int, double

 

- 기본 함수들

: GetLength, Empty, GetAt, SetAt

 

- string 조작 함수

: Concat, Mid, Left, Right, Trim

 

- operators

: +, = , ==, !=, [], +=

 

- 검색 및 치환 함수

: Find, FindNoCase, Replace

 

- 토큰처리 함수

: GetToken

 

3. String Class 코드 작성

① Class 정의

class String
{
    protected:
        int len;
        char* m_pBuffer; //string버퍼
        void _Init();
        void _Clear();
        void _Copy(const char* lpsz);
    public:
        //constructors,destructor: 추후 추가 예정
        //operators: 추후 추가 예정
        //other member functions: 추후 추가 예정
};

 

※ const를 사용하는 이유

다른 함수에 포인터가 전달될 경우, call-by-value가 아닌 call-by-reference 형태로 전달되므로 다른 함수 내에서 포인터의 값을 임의로 조절할 수 있게 된다. 그렇기 때문에 포인터 앞에 const를 붙여, 특정 함수에 전달하는 포인터(source)의 내용이 훼손되지 않도록 하는 것이다.

 

 

② String 함수 정의

: void _Init(), void _Clear(), void _Copy(const char* lpsz)

void String::_Init() {
	len = 0;
	m_pBuffer = 0;
}
void String::_Clear() {
	if (m_pBuffer)//m_pBuffer != 0 일 때
		delete[] m_pBuffer;
	_Init();
}
void String::_Copy(const char* lpsz) {
	if (lpsz != 0) {
		int len = strlen(lpsz);
		m_pBuffer = new char[len + 1];//null이 저장되는 공간추가
		if (m_pBuffer)
			strcpy(m_pBuffer, lpsz);
	}
}

 

 

 

 

 

 

 

 

※ 해당 게시글은 개인 학습의 목적으로, 아래 강의를 수강한 후 정리한 학습노트입니다.

https://inf.run/LNCU