본문 바로가기

C++87

C++ 기초 : 상속 (2) 자식 클래스로 객체를 생성하여자식 클래스의 생성자가 호출됩니다.이때 먼저 부모 클래스의 생성자로 가서부모 클래스의 멤버를 초기화하여부모 클래스의 생성자의 동작을 완료한 후에다시 자식 클래스로 돌아와 자식 클래스의멤버를 초기화하면서 자식 클래스 생성자의동작을 완료하죠.  그럼 소멸자는 어떤 순서로 동작할까요? 소멸자의 경우 자식 클래스의 소멸자가 호출되고자식 클래스 소멸자의 동작이 모두 완료된 후에부모 클래스의 소멸자가 호출되어 부모 클래스 소멸자의동작을 완료합니다.  정말 그렇게 동작하는지 살펴 보죠. main 함수에서 자식 클래스로 객체를 만들었습니다. 그러면 main 함수 종료 직전에 자식 클래스에 있는 소멸자와상속받은 부모 클래스에 있는 소멸자가 호출되어야겠죠. 이를 확인하기 위해 main 함수 종.. 2024. 5. 4.
C++ 기초 : 오버라이딩 오버라이딩(Overriding)은 부모 클래스의 멤버 함수와자식 클래스의 멤버 함수가 함수명,인자의 개수와 자료형 등 완벽하게 일치할 때발생합니다.  아래 코드에서  부모 클래스와 자식 클래스의 멤버 함수를 보시면Output이라는 똑같은 함수가 존재합니다.  이는 일반적인 클래스에서는 불가능한 일이죠? 원래라면 함수명이 달라야 하죠.아니면 함수명을 똑같이 하되, 인자의 개수나 자료형을다르게 설정해야 오버로딩이 되면서 오류가 발생하지 않습니다.   하지만 위 코드처럼 상속 관계인 클래스끼리는완전히 같은 함수를 보유할 수 있습니다.  이런 것이 가능한 이유는 48번째 줄의 코드처럼자식 클래스로 만든 객체로 부모 클래스와 자식 클래스에모두 존재하는 Output이라는 함수를 호출하였을 때,자식 클래스의 Outp.. 2024. 5. 3.
C++ 기초 : 상속 (1) C++는 객체 지향 언어입니다. 이러한 객체 지향 언어는 '캡슐화'라는 특징이 있습니다. 어떠한 기능을 위해 클래스를 만들면,데이터를 저장할 멤버들을 구성하고데이터를 다루기 위해 멤버 함수들을 구현하였죠. 이 모든 것이 모여 하나의 클래스가 되죠.이것이 바로 캡슐화입니다.  캡슐화는 '은닉성'이라는 특징과 이어집니다. private, protected, private과 같은 접근 제한자를 통해멤버 변수 또는 함수들을 공개하거나 보호할 수 있었죠?이것이 바로 은닉성입니다.  또한 객체 지향 언어의 특징으로 '상속'이 있습니다. 아래 코드가 상속을 구현한 것이죠. cParent라는 클래스를 만든 후,cChild라는 클래스를 만들어 cParent 클래스를상속받았습니다. 21번째 줄에서 볼 수 있듯이상속받을 클.. 2024. 5. 3.
C++ 기초 : tree (10) DeleteNode 함수를 통해 제거하려는 노드가단말 노드(Leaf Node)인 경우를 작성하였으니이번에는 제거하려는 노드의 자식이 1개 있는 경우와두 개 있는 경우의 동작을 작성하도록 하겠습니다.  먼저 자식 노드가 한 개인 경우입니다. 제거하려는 노드가 보유하고 있는 자식이오른쪽 자식이냐, 왼쪽 자식이냐를 먼저 따져 봅니다. NODE_TYPE enum 클래스를 통해 객체를 하나 만들고제거하려는 노드가 보유하고 있는 자식이 우선 왼쪽이라고가정합시다. 이 상태에서 만약 오른쪽 자식을 보유하고 있어438번째 줄에 있는 if 문에 걸리면 NODE_TYPE 형 객체에RCHILD를 대입하여 오른쪽 자식이 있음을 나타냅니다.  제거하려는 노드가 루트 노드일 경우에는루트 노드를 가리키는 BST의 멤버 pRootNo.. 2024. 5. 3.
C++ 기초 : tree (9) 이번에는 -- 연산자를 오버로딩해 보겠습니다. -- 연산자도 ++ 연산자를 오버로딩을 위해 중위 후속자를 반환하는 함수를 구현한 것처럼 BST 역할을 하는 cBST 클래스 템플릿 내부에GetInOrderPredecessor 함수를 만들어 줄 겁니다. 해당 함수는 중위 선행자를 반환하죠. 그리고 iterator가 반환된 중위 선행자를 가리키도록 합니다.반환된 중위 선행자를 가리키는 해당 iterator를 반환하는 거죠.-- 연산이 발생하면 중위 순회 기준으로기존 노드의 이전 노드를 가리키는 iterator가 반환되는 겁니다.  GetInOrderPredecessor 함수는 GetInOrderSuccessor와 비슷한 방식으로 작동합니다. 다만 이번에는 중위 선행자를 구하는 것이기 때문에 오른쪽이 아닌 왼쪽.. 2024. 5. 2.
C++ 기초 : tree (8) iterator 통해서 이진 탐색 트리를 순회할 수 있어야겠죠? iterator는 만들었지만아래 for 문처럼  iterator의 값을 하나씩 올리면서 iterator가 가리키는 노드의 키-값을 출력하는 반복문을,iterator의 값이 nullptr, 즉 end iterator가 아닌 경우 계속반복하려면 구현해야 할 연산자 오버로딩이 많습니다.  우선 iterator끼리 비교하기 위한비교 연산자를 오버로딩해 봅시다. == 연산자와 != 연산자를 오버로딩하였습니다. 먼저 == 연산자를 오버로딩한 부분부터 보시죠. iterator가 서로 같은지, 다른지 비교하여 같으면 true 다르면 false를 반환하는 함수입니다. 그래서 반환 타입은 bool형이죠. 단순 비교를 위한 연산자이기 때문에비교 대상이 되는 다.. 2024. 5. 1.