모두의 코드 : 씹어먹는 C++ - <4 - 5. 내가 만드는 String 클래스>

YP J·2022년 6월 17일
0

모두의코드 C++

목록 보기
2/11

#include 을 맛보기 구현하기?

문자열 클래스 조건

  • 문자 (char) 로 부터의 문자열 생성, C 문자열 (char *)로 부터의 생성
  • 문자열 길이를 구하는 함수
  • 문자열 뒤에 따른 문자열 붙이기
  • 문자열 내에 포함되어 있는 문자열 구하기
  • 문자열이 같은지 비교
  • 문자열 크기 비교(사전순)

문자열 클래스 만들자!

기존 C언어에선 문자열을 나타내기 위해 널 종료문자열 (Null-terstd::minating string)개념으로 문자열 끝에 NULL문자 붙여 문자열을 나타내는 방식을 사용했다.

하지만 C언어 문자열은

  • 문자열의 크기 바꾸기
  • 문자열 뒤에 다른문자열 붙이기
    등등 굉장히 프로그래머 입장에서 귀찮아 진다.

그래서 직접 문자열 클래스를 만들어 보자

C++ 에서는 정말 왠만하면 char 배열 사용 하는것보다 string 사용 해서 문자열 다루는게 좋다.

Mystring 클래스 멤버변수

  • 문자열 데이터가 저장된 공간을 가리키는 포인터

  • 문자열 데이터 길이
    Q: 왜 객체에 직접 문자열 데이터 보관 안 하고, 그데이터가 저장된 공간을 가리키는 포인터를 보관하냐??
    A: 나중에 문자열 데이터의 크기가 바뀔때, 후자로 하면 그 메모리 해제한뒤에 , 다시 할당할수 있지만 전자는 불가능.

    Q: 문자열 데이터 길이 보관이유
    A: 많이 쓰이닌까 한번 구해놓고 길이 바뀔때까지 변경 하지 않는 방법이 유용하다.

class myString
{
	privat:
		char* string_content;
		int string_len;
};

위 두 정보는 private

  • 우리는 다른 프로그래그래머가 myString 을 이용하면서 위와 같은 중요한 정보들에 함부로 접근 원치 않기 때문.
  • 두 멤버변수 를 직접 접근하지 않고도 작업할수있게 '함수' 를 제공해야한다.

일단 생성자 만들어야한다.

myString(char c); // 문자 하나로 생성
myString(const char *str); // 문자열로 부터 생성
myString(const myString& str); // 복사생성자

C형식 문자열 은 문자열의 끝부분을 쉽게 체크 할수있지만
우리는 널을 빼고 실제 '문자' 만 저장 하기 때문에
문자열의 길이 string_len 을 이용해서 그 문제를 해결한다.

  • myString 클래스에서는 실제 문자에만 해당하는 내용만을 string_content에 보관한다.
  myString::myString(char c)
{
	string_content = new char[1];
	string_content[0] = c;
	string_length = 1;
}

myString::myString(const char *str)
{
	string_len = strlen(str);
	string_content = new char[string_len];

	for (int i=0; i != string_len; i++)
		stirng_content[i]=str[i];
}

myString::myString(const myString& str)
{
	string_len = str.string_len;
	for (int i=0; i!= string_len; i++)
		string_conetent[i]=str.string_content[i];}

myString::~myString()
{
	delete[] string_content;
}

C 언어에선 구조체 같은 것으로 문자열을 구현했다면 이를 일일히 해제하는것도 처리해줘야 한다.
클래스로 하면 사용하는 사람은 그안에서 어떻게 돌아가는지 신경쓰지 않아도 된다.

내부 변수의 내용을 바꾸지 않는다면 꼭 상수함수로 정의해주는게 좋다.

len함수 역시 string_len 값 읽기만 하면 되므로 상수함수로 정의!

int myString::len() const {return string_len; }
void myString::print()
{
	for (int i=0; i!= string_len; i++)
	{
		std::cout << string_content[i];
	}
}

전체 연습했던 코드

#include <iostream>

class myString
{
	private:
		char* string_content;
		int string_len;
	public:
		myString(char c); // 문자 하나로 생성
		myString(const char *str); // 문자열로 부터 생성
		myString(const myString& str); // 복사생성자
		~myString();
		//
		int len() const;
		void print() const;
		void println() const;
};

////


myString::myString(char c)
{
	string_content = new char[1];
	string_content[0] = c;
	string_len = 1;
}

myString::myString(const char *str)
{
	string_len = strlen(str);
	std::cout << "TEST----- : ";
	std::cout << string_len << std::endl;
	string_content = new char[string_len];

	for (int i=0; i != string_len; i++)
		string_content[i]=str[i];
}

myString::myString(const myString& str)
{
	string_len = str.string_len;
	string_content = new char[string_len];
	for (int i=0; i!= string_len; i++)
		string_content[i]=str.string_content[i];}

myString::~myString()
{
	delete[] string_content;
}

////

int myString::len() const {return string_len;}

void myString::print() const
{
	for (int i=0; i!= string_len; i++)
	{
		std::cout<< string_content[i];
	}
}

void myString::println() const
{
	for (int i=0; i!= string_len; i++)
	{
		std::cout<< string_content[i];
	}
	std::cout << std::endl;
}


int main()
{
	myString str1("hello World!");
	std::cout << "1--------" << "\n";
	myString str2(str1);

	std::cout << "2--------" << "\n";
	str1.println();
	std::cout << "3--------" << "\n";
	str2.println();
}

assign 함수

지정하다. '=' 과 동일한 역할.

str.assign("abc");

하면 str에 원래있던 문자열 지워지고 abc가 들어가게되는.

https://stackoverflow.com/questions/18162522/what-does-return-this-mean-in-c

  • this 는 (자기자신)객체를 가리키는 포인터.
    this는 객체가 된다.
    this 리턴은 객체의 참조를 리턴한다.
  • 만약 함수의 리턴 타입이 Tpye& 가 아니라면
    C++ 은 객체를 복사하고(복사생성자) 즉시 소멸자를 호출할거다!. (의도하지 않은 행동이면 조심히 써라)

////스따쁘
일단 상속 부분까직 해야하므로

profile
be pro

0개의 댓글