삶의 공유
[C++][Study] 내가 만드는 String 문자열 본문
string 클래스를 직접 만들어, 우리가 string a = "a" 이렇게 쉽게 작성했던 것들이 어떻게 동작하는지 이해를 해보고자 한다.
먼저 정의 부분은 다음과 같다.
#include <iostream>
class string {
char *str;
int len;
public:
string(char c, int n); // 문자c 가n 개있는문자열로정의 string(const char *s);
string(const string &s);
//~string();
void add_string(const string &s); // str뒤에 s를 붙인다.
void copy_string(const string &s); // s를 복사한 값을 str에 대입한다.
int strlen(); // 문자열 길이 리턴
};
변수는 *str과 len이 있다.
1) *str은 문자를 담는 배열로 정의할 것이다.
2) len은 문자열의 길이를 나타낼 변수로 정의할 것이다.
string(char c, int n); // 문자c 가n 개있는문자열로정의 string(const char *s);
string(const string &s);
생성자와 복사 생성자 이다.
생성자는 문자 c가 n개 있는 문자열로 형식으로 정의한다.
두번째는 복사 생성자다. string s2 = s1 이렇게 정의가 가능하게 해볼려고한다. 이게 주 목적이다.
그다음은 함수 구현이다 add_string(), copy_string(), int strlen() 함수이다.
add_string() : str 뒤에 문에 문자열이 붙을수 있게 구현한다.
copy_string() : s의 문자열을 복사하여 str에 대입한다.
int strlen() : 문자열의 길이를 리턴한다.
이제 정의된 내용들을 구현해보자
먼저 생성자 부분이다.
다음과 같이 구현해보았다
문자열 c를 n개 만큼의 공간을 만들고 대입하였고,
복사생성자에서는 s의 문자열과, 길이를 그대로 대입 하는 식으로 구현하였다.
string::string(char c, int n){
str = new char[n];
len = n;
for(int i = 0; i < n; i++){
str[i] = c;
}
}
string::string(const string &s){
std::cout << "복사 생성자 호출 " << std::endl;
str = s.str;
len = s.len;
}
add_string() : str 뒤에 문에 문자열이 붙을수 있게 구현한다.
copy_string() : s의 문자열을 복사하여 str에 대입한다.
int strlen() : 문자열의 길이를 리턴한다.
void string::add_string(const string&s){
char *temp = new char[len + s.len];
std::cout << "합쳐진 문자열 : ";
for(int i = 0; i < len; i++){
temp[i] = str[i];
std::cout << temp[i];
}
for(int i = 0; i < s.len; i++)
{
temp[len + i] = s.str[i];
std::cout << temp[len + i];
}
std::cout << " " << std::endl;
str = new char[len + s.len];
str = temp;
delete[] temp;
}
void string::copy_string(const string &s){
if(len > s.len){
str = s.str;
len = s.len;
}
else{
char *temp = new char[len];
std::cout << "문자열이 변경되었습니다. 기존 : ";
for(int i=0; i < len; i++)
{
temp[i] = str[i];
std::cout << temp[i];
}
std::cout << "변경 : ";
len = s.len;
str = new char[len];
for(int i =0; i < len; i++ )
{
str[i] = s.str[i];
std::cout << str[i];
}
}
}
int string::strlen()
{
return len;
}
이제 main 함수를 구현해서 정상적으로 동작하는 지를 확인해보자.
int main(int argc, const char * argv[]) {
// insert code here...
string sc('c',15);
string sa('a', 10);
string sd = sc;
sa.add_string(sc);
sa.copy_string(sc);
std::cout << " " << std::endl;
std::cout << "sc 문자개수 : " << sc.strlen() << std::endl;
std::cout << "sa 문자개수 : " << sa.strlen() << std::endl;
return 0;
}
이렇게 잘 동작 하는 것을 볼 수 있다.
1) string sd = sc; // 이 문장에서 복사 생성자가 생성이 되었다.
2) sa.add_string(sc)를 통해 sa값에 sc값을 이어 붙인 것을 볼 수 있다.
3) sa.copy_string(sc) // sa값에 sc의 값을 대입하여 분자열이 변경 된 것을 볼 수 있다.
이렇게 C++언어를 이용하여 string 문자열 클래스를 만들어 보았다.
생성자, 복사 생성자편을 공부하고 과제가 있어 이것을 풀고 블로그에 남겨 본다.
'Programing > C++' 카테고리의 다른 글
[C++] Pointer(포인터)[상] (0) | 2021.12.25 |
---|---|
[C++][Study] 내가 만드는 문자열 클래스(연산자오버로딩, 복사생성자) (0) | 2021.12.25 |
Xcode & SFML 셋팅하기 (0) | 2021.07.07 |
[C++] C++와 표준 라이브러리 초단기 속성코스(포인터, 참조, const, 타입추론) (0) | 2021.02.03 |
[C++] C++와 표준 라이브러리 초단기 속성코스(반복문, 스트링, 스택 & 힙) (0) | 2021.02.03 |