✨컴공주✨ [1052682] · MS 2021 · 쪽지

2022-09-12 22:23:46
조회수 7,889

컴공 일기182

게시글 주소: https://orbi.kr/00058371421


객체지향... C++ 기반의 이진트리 간략 예제입니다. 

Iterator는 구현은 따로 하지 않았는데, Iterator까지 구현을 해야 C++ 스러운 예제가 아닌가 해요.

무튼.. C 기반의 이진트리 설계랑 다른 것은, 아무래도 객체화가 되었다는 거겠죠.


여기서 문제는, 과연 "무엇을 객체화 시키느냐?" 일 겁니다. 이걸 따지는 게 굉장히 어렵습니다.

TreeNode class와 Tree의 class를 자연스럽게 분리시켜서, 모든 관계가 잘 정리되었습니다만, 이 흐름까지 초보 개발자 스스로 도달하는 데에는 굉장히 많은 시행착오와 고민들이 필요할 겁니다. 현재 제 상황이 이렇습니다.


그래선지 객체지향이 때로, 굉장히 어렵게 다가오는 것이 바로 이 지점입니다. 어떻게 설계를 하고, 무엇을 객체화 해야 하는가. 이것을 답해나가는 것이 현대 개발자의 임무 중 하나일텐데, 이게 참 쉽지 않습니다. 그래서, 공부 뿐 아니라, 개발에 대한 날렵한 경험들이 필요한 것 같구요.


using namespace std;

template <typename T>

class Tree;


template <typename T>

class TreeNode {

    friend class Tree<T>;

private:

    T data;

    TreeNode* left;

    TreeNode* right;


public:

    //동적 할당을 받을 것은 딱히 아니므로 destructor에 대한 이슈는 크게 신경쓰지 말자.


    TreeNode(T data = 0, TreeNode* left = null, TreeNode* right = null)

    {

        this->data = data;

        this->left = left;

        this->right = right;

    }

};


template <typename T>

class Tree

{

private:

    TreeNode<T>* Root;

public:

    explicit Tree(const T data = 0)

    {

        Root = new TreeNode<T>(data);

    }


    void Destroy(const TreeNode<T>* Root)

    {

        preorder(Root->left);

        preorder(Root->right);

        delete Root;

    }


    ~Tree()

    {

        Destroy(this->Root);

        cout << endl;

        cout << "deleting Tree..." << endl;

    }



    TreeNode<T>* getRoot()

    {

        return Root;

    }


    void visit(const TreeNode<T>* current)

    {

        cout << current->data << " ";

    }


    void buildTree() {

        Root->left = new TreeNode<T>('B', new TreeNode<T>('D', new TreeNode<T>('H')), new TreeNode<T>('E', new TreeNode<T>('I'), new TreeNode<T>('J')));

        Root->right = new TreeNode<T>('C', new TreeNode<T>('F'), new TreeNode<T>('G', null, new TreeNode<T>('K')));

    }


    void preorder(TreeNode<T>* current)

    {

        if (current != null) {

            visit(current);

            preorder(current->left);

            preorder(current->right);

        }

    }

};



int main()

{

    Tree<char> tree('A');

    tree.buildTree();

    cout << "Preorder >> " << endl;

    tree.preorder(tree.getRoot());

    cout << endl;

    return 0;

}

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.