본문 바로가기

분류 전체보기

(17)
순수 가상 함수(Pure Virtual Function) - 선언만 있고 구현이 없는 가상 함수를 의미한다. 말 그대로 기초 클래스로서 의미만 가지고 있을 뿐 구현부는 자신을 상속 받는 자식 클래스에서 구현할 수 있도록 하는 용도의 클래스이다. - 순수 가상 함수를 하나라도 가지고 있는 클래스는 추상 클래스(Abstract Class)가 되며 객체화 할 수 없다. - 추상 클래스를 상속 받는 자식 클래스에서 순수 가상 함수를 구현하지 않으면 해당 클래스도 추상화된다. class AbstractClass { public: AbstractClass() {} ~AbstractClass() {} public: virtual void PureVirtualFunction() = 0; // 순수 가상 함수 }; class ChildClass : public Abstract..
가상 함수 테이블(Virtual Function Table) C++ 은 다형성을 지원하기 위해 가상 키워드(virtual)를 지원한다. 상속 관계에서 하위 클래스에서 부모의 함수를 재정의하기 위해 키워드를 사용한다. - 가상 함수를 하나라도 가진 클래스는 '가상 함수 테이블'를 가지게 된다. - 가상 함수 테이블을 이용하여 자신의 클래스에 맞는 함수를 찾아 호출하게 된다. 가상 함수가 없는 경우 class Parent { public: void Print() { cout
객체지향이란? 객체 지향 프로그래밍? 만들고자 기능을 추상화시켜 속성(atrribute)과 행위(action)를 가지는 변수(variable)와 함수(method)로 구성된 객체를 만들고 그 객체를 이용하여 기능을 구현하는 것을 의미한다. 장점 - 객체화를 시키기 때문에 유연하고 변경이 쉬운편이다. - 수정할 부분이 있다면 해당 부분만을 찾아 변경하면된다. 이때 5원칙 중 '단일 책임 원칙'이 들어간다고 볼 수 있다. 단점 - 지나치게 객체화를 시키면 분석하기가 쉽지 않다. (복잡해진다.) 클래스(class) 추상화 개념 객체(object) 클래스 객체화 메소드(method) 연산 메시지(message) 메소드(method)를 호출 추상화(Abstraction) - 실체화의 개념을 추상화 시킬 때 공통의 속성이나 기능..
객체지향 - SOLID 개발 5대 원리 S - SRP(Single responsibility principle) 단일 책임 원칙 - 모든 클래스는 단 하나의 책임을 가져야한다. - 예를 들면 상점 기능을 구현함에 있어서 '구매', '판매' 기능과 GUI 기능은 별도로 처리해야한다. O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙 - 확장에 대해서는 개방 되어 있어야 하지만, 수정에 대해서는 폐쇄 되어야 한다. - 예를 들면 '캐릭터'를 구현 시 구현해야 하는 캐릭터마다 행동이 다르다면 하위 클래스에서 별도로 구현할 수 있도록 한다. (오버라이딩) L - LSP(liskov substitusion Principle) 리스코프 치환 법칙 - 문제 없이 업캐스팅(Up-Casting, 부모의 객체로 자식의 객체를 가르킬 수..
Queue (큐) - 선형적 자료 구조 - 선입선출(First- In, First - Out) 방식의 구조 (마지막에 삽입된 데이터가 가장 처음으로 출력된다.) Array Queue (배열 기반의 큐) 문제점 - 배열의 특성과 큐의 데이터 삽입 위치를 생각하면 문제점이 발생한다. 배열은 연속된 메모리 구조, 큐의 선입선출의 특성과 데이터 추가 위치를 보면 앞에서 빠져나간 메모리 공간을 재사용 하기 어려운 문제가 발생한다. 재사용 하기 위해선 같은 크기의 메모리를 할당하고 기존의 메모리를 복사 후 삭제하는 방식으로 이뤄져야 하는데 이는 매우 비효율적이며 큐를 직접 구현하기에 배열 기반은 적합하지 않다. 하.지.만 !! 재사용을 효율적으로 하면서 배열 기반의 큐를 제작하기 위한 Circle Queue (원형 큐) 방식이 존재..
Stack (스택) - 선형적 자료 구조 - 선입선출(Last - In, First - Out) 방식의 구조 (마지막에 삽입된 데이터가 가장 처음으로 출력된다.) - 선입선출 방식을 응용하여 데이터를 역순(reverse)으로 출력할 수 있다. 코드 첨부 파일 - Array(배열), List(Node) 방식으로 구현된 코드.
Vector (벡터) - STL 컨테이너의 대표적인 자료구조 - 벡터는 배열과 비슷하지만, 요소 갯수에 따라서 벡터 내부적으로 크기를 늘려준다. (유사 동적 배열) 장점 - 배열 처럼 연속된 메모리 공간에 할당이 되므로 [ ] 인덱스 접근이 가능하다. - 벡터의 크기(공간)이 남아있다면 추가, 삭제가 빠르다. 단점 - 벡터에 할당된 크기보다 요소의 갯수가 많을 때 내부적으로 늘어난 크기만큼 메모리를 다시 할당하고 기존 벡터의 요소들의 이동 작업이 존재하기 때문에 이 경우에는 추가, 삭제가 느리다. 사용 Tip - 벡터를 사용할 때 reserve(int _n) 함수를 이용하여 크기를 여유롭게 할당하고 추가, 삭제를 하면 단점을 보완할 수 있는 방법이 될 수 있다.
Doubly Linked List (더블 링크드 리스트) - 배열과는 다르게 노드(Node) 간의 연결(Link)를 통해서 구현하는 방식이다. - 노드들을 순서대로 나열하는 선형적(순차적)인 구조다. - 노드는 데이터, 자신과 연결되어있는 이전, 다음 노드의 주소(메모리에 할당되어 있는 주소)를 가지고 있다. (단방향 리스트는 자신과 연결된 이전 노드의 주소를 가지고 있지 않는다. 오직 자신의 다음 주소만을 가지고 있다.) 노드 클래스의 구성 template class CListNode { private: CListNode() { m_pNext = nullptr; m_pPrev = nullptr; } ~CListNode() { } private: T m_data; // 실제 데이터 CListNode* m_pNext; // 다음 노드의 주소 CListNode* ..