본문 바로가기

기초83

C++ 기초 : 다형성 (2) 동물이라는 부모 클래스를 만들었습니다. 그리고 이를 상속받은 사자, 인간, 독수리 등의자식 클래스를 만들었죠.  이때 동물이라는 부모 클래스로 만든 포인터는사자, 인간, 독수리라는 자식 클래스로 만든객체를 가리킬 수 있습니다.  하지만 각 객체의 앞에 존재하는 부모 클래스인 동물이라는 곳까지만접근이 가능하기 때문에 동물 클래스로 만든 포인터는 자신이 가리키고 있는객체가 어떤 자식 클래스로 만든 객체인지 알 수가 없습니다. 그래서 동물 클래스로 만든 포인터로 오버라이딩된 함수를호출하면 무조건 동물 클래스에 있는 함수가 호출됩니다. 이러면 자식 클래스로 만든 객체라면 무엇이든가리킬 수 있는 동물 포인터의 의미가 없어지는 것이죠.  이러한 문제점을 보완해 주는 것이 가상 함수이죠. 부모 클래스로 가서 오버라이.. 2024. 5. 4.
C++ 기초 : 다형성 (1) 다형성에 대해서 알아 봅시다.  아래와 같은 코드가 있습니다. 부모 클래스로 만든 객체와자식 클래스로 만든 객체가 있습니다. 부모 클래스로 만든 포인터에부모 클래스로 만든 객체의 주솟값을 저장합니다. 자식 클래스로 만든 포인터에자식 클래스로 만든 객체의 주솟값도 저장을 합니다. 이는 문제가 되지 않죠? 기본적인 포인터 문법입니다.       그럼 아래와 같은 경우는 어떨까요? 부모 클래스로 만든 포인터에자식 클래스로 만든 객체의 주솟값을 저장하는 건문제가 없습니다.  근데 자식 클래스로 만든 포인터에부모 클래스로 만든 객체의 주솟값을 저장하는 건문제가 발생합니다. 왜 그럴까요?  아래 그림을 보시죠. 위에는 부모 클래스형 포인터로 자식 클래스형 객체를가리킬 때이며 아래는 자식 클래스형 포인터로부모 클래스.. 2024. 5. 4.
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.