[C++] C++로 문자열 연결하기 구현!

2025. 1. 31. 14:32·C & C++ & C#
#include <iostream>
#include <cstring>

using namespace std;


class MyString
{
public:
    MyString()
    {
        // 호출 시점 확인
        cout << "MyString()" << endl;

        size_ = 1;
        str_ = new char[size_];
    }

    MyString(const char *init_str) // init_str이 유효한 메모리라고 가정
    {
        cout << "MyString(const char *init_str)" << endl;

        // 1. 글자 수 먼저 확인
        size_ = 0;
        while (init_str[size_] != '\0')
        {
            size_++;
        }

        // 2. 글자 수가 0이 아니면 메모리 할당
        if (size_ > 0)
        {
            str_ = new char[size_];
        }

        // 3. 복사
        for (int i = 0; i < size_; i++)
        {
            str_[i] = init_str[i];
        }
        // memcpy() 사용 가능
    }

    ~MyString()
    {
        // 호출 시점 확인
        cout << "Destructor" << endl;

        size_ = 0;
        if (str_)
            delete[] str_;
    }

    void Resize(int new_size)
    {
        char *new_str = new char[new_size];

        // memcpy() 사용 가능
        for (int i = 0; i < (new_size < size_ ? new_size : size_); i++)
        {
            new_str[i] = str_[i];
        }

        delete[] str_;
        str_ = new_str;
        size_ = new_size;

    }

    void Print()
    {
        for (int i = 0; i < size_; i++)
        {
            cout << str_[i];
        }
        cout << endl;
    }

    void Append(MyString *app_str) // 같은 타입을 매개변수로 사용 가능
    {
        int old_size = size_;

        // 다른 멤버 함수 호출 가능
        Resize(size_ + app_str->size_);

        // 중요한 개념
        for (int i = old_size; i < size_; i++)
        {
            str_[i] = app_str->str_[i-old_size];
        }
    }

private:
    int size_ = 0;      
    char *str_ = nullptr; 
};

int main()
{

    MyString str1("ABCDE"); // 생성자 이용
    MyString str2("123");

    str1.Append(&str2); // 주소 넣어줌

    str1.Append(&str2);
    str1.Print();

    return 0;
}


자바만 공부하다가 Cpp 공부하며 문자열 연결하는 로직을 구현하던중 너무 깨달은 점이 많아 필기하려고한다.

 



먼저 Cpp에서도 생성자를 위와 같이 매개변수에 따라서 차별된다는 점 알고있자. 
각각 cout로 호출시점을 확인 하고 있긴한데 소멸자(Destructor)는 편의로 메모리상에 올라간 데이터가 해체될 때 자동으로 실행된다고 한다!

확실히 Cpp도 객체지향이라 그런지 클래스의 멤버변수는 private로 막아놓고 값은 함수로 조정하고 있다. 다음에 싱글톤도 구현해봐야 겠다는 생각이 들었다.

구조체 멤버변수들에 접근할 때 구조체.~ 으로 접근하지만, 포인터로 접근할때는 구조체주소->~ 로 접근한다. 이는 클래스도 마찬가지다! chaning을 저렇게 하는구나. 위에서는 매개변수로 구조체의 주소를 넘겨 '->'로 체이닝 하고있다.
 
확실히 Cpp는 문자의 배열끝에 '\0'을 붙혀 문자열로 취급하다보니 문자열을 다룰때 굉장히 신중해지는 것 같다! 자바와 파이썬과는 다르다! 처음에는 어색했는데, 메모리 하나하나 다루다보니 더 확신이 들고 자료구조 알고리즘 할때 디버깅하는 맛이 있다.

그래서 위의 클래스 생성자를 보면 이 로직에서는 복사의 편의를 위해 문자열의 사이즈를 '\0' 전까지 하나씩 카운트 하고있다. memcpy()라는 좋은 복사 함수가 있긴한데, 이렇게 하나씩 카운트하는게 더 마음에 든다 ㅎㅎ. 다른 언어와 다르게 날것의 느낌이 난다.

Append() 함수를 보면 기존문자열 사이즈를 저장해놓은 다음,  Resize()로 문자열의 크기를 늘리고 그 늘린 문자열에 기존 문자열을 복사한후, 기존것을 늘린것들로 초기화하고있다. 그리고 기존 문자열 사이즈부터 하나씩 붙혀서 연결된 문자열을 완성한다.
설명하면 쉽지만 인덱싱하는 과정이랑 이렇게 하나씩 카운트해서 복사하고 사이즈 저장후  늘린다음 덧붙히기 등등 많은 영감을 주어서 기록해본다!

앞으로 이런 자료구조가 많다는데 파이팅이다.

 

p.s 알고리즘 풀때는 붙히고싶으면 insert(위치, 문자열) 이라는 좋은 함수가 있다....
그리고 cpp는 단순하게 +=로 문자열 붙히기 가능!

'C & C++ & C#' 카테고리의 다른 글

[C#] 제네릭(Generic)의 제약조건에 대하여 정리  (0) 2024.11.11
[C#] 프로퍼티(property) 완벽 파헤치기!  (2) 2024.11.10
[C#] string.Formating() 다양한 데이터를 특정 형식으로 보기 좋게 만드는 함수!  (0) 2024.11.08
[C#] 델리게이트(Delegate)와 Event로 함수를 깔끔하게 실행해보자!  (0) 2024.11.06
'C & C++ & C#' 카테고리의 다른 글
  • [C#] 제네릭(Generic)의 제약조건에 대하여 정리
  • [C#] 프로퍼티(property) 완벽 파헤치기!
  • [C#] string.Formating() 다양한 데이터를 특정 형식으로 보기 좋게 만드는 함수!
  • [C#] 델리게이트(Delegate)와 Event로 함수를 깔끔하게 실행해보자!
개발준입니다
개발준입니다
백문이 불여일타
  • 개발준입니다
    Re:제로부터 시작하는 개발이야기
    개발준입니다
  • 전체
    오늘
    어제
    • All (32)
      • Java & Kotlin (3)
      • Spring (0)
      • DataBase (0)
      • Git & Github (1)
      • Baekjoon (8)
      • C & C++ & C# (5)
      • Unity (12)
      • DesignPattern (3)
      • SmallTalk (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발자
    레벨 디자인
    리스너 패턴
    github
    유니티
    디자인패턴
    state pattern
    코테
    코딩
    가중치 비교
    자바
    티스토리챌린지
    게임개발
    백준
    오블완
    개발
    알고리즘
    매서드
    알고리즘 #코테
    c#
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
개발준입니다
[C++] C++로 문자열 연결하기 구현!
상단으로

티스토리툴바