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);
}
}
※ 해당 게시글은 개인 학습의 목적으로, 아래 강의를 수강한 후 정리한 학습노트입니다.
'C++ 프로그래밍 > 자료구조와 알고리즘' 카테고리의 다른 글
[자료구조와 알고리즘] String Class Operator Overloading (0) | 2024.02.28 |
---|---|
[자료구조와 알고리즘] String Class 생성자와 제거자 (0) | 2024.02.26 |
[자료구조와 알고리즘] String Class (0) | 2024.02.24 |
[자료구조와 알고리즘] C++ : OOP (0) | 2024.02.24 |
[자료구조와 알고리즘] C++ : C의 확장 (1) | 2024.02.21 |