본문 바로가기

Study

[Data Structure] Recursion 재귀함수 자기 자신을 호출하는 함수이다. 가장 널리 알려진 예제가 펙토리얼(!) 계산 문제이다. 재귀함수를 이용하면 Divide and Conquer, Binary Search Tree 등을 구현할 수 있다. 개념적으로 중요한 함수이지만 실행시간 측면에서는 썩 유리한 함수는 아니다. 호출하는 값이 커질수록, 수행시간이 기하급수적으로 증가하기 때문이다. 더보기
[Data Structure] List Plus 1. Circular Linked List 연결 리스트가 원형으로 돈다. 앞선 Queue와 마찬가지로, front와 rear를 연결해준다. 2. Doubly Linked List 앞 뒤 요소간 연결이 이중으로 연결된 것이다. 앞 요소는 뒷 요소를 가리키고, 이와 동시에 뒷 요소는 앞 요소를 가리킨다. 이 방법을 이용하면, 한 쪽으로만 이동 즉 탐색 시간을 줄일 수 있다. 단, 기존 방식에서 next 포인터가 아닌 별도의 포인터가 하나 더 필요하며, 할당 시 조금 더 복잡해진다. 더보기
[Data Structure] Linked Structure 연결된 구조 기존의 자료구조들은 배열을 기반으로 구성되었다. 이러한 배열구조 기반의 단점은 해당 구조의 크기가 동적으로 할당되기 어렵다는 뜻이다. 즉, 크기에 제한이 생긴다는 단점이 존재한다. 이러한 단점을 보안하기 위해 구상된 것이 'Linked'이다. 쉽게 생각하면, data부와 pointer부 2개의 공간이 존재하고, pointer부에서 다른 객체를 가리키고 이러한 구조가 반복적으로 이루어 진 것이다. struct NodeType { ItemType info; NodeType* next; } 1. Linked Stack 기존의 Stack 구조에 존재하는 데이터 타입을 구조체로 선언하여 위 사진과 같이 선언한다. 연결된 스택은 항상 맨 위를 가리키는 topPtr이 존재하고, 이를 이용해 스택의 LIF.. 더보기
[Data Structures] Stack & Queue 1. Stack LIFO ADT MakeEmpty Boolean IsEmpty Boolean IsFull Push(ItemType newItem) Pop ItemType Top() Variation Array Stack Linked List Stack C++ Header: 2. Queue FIFO ADT MakeEmpty Boolean IsEmpty Boolean IsFull Enqueue(ItemType newItem) Dequeue Variation Linear Quene Circular Queue Priority Queue C++ Header: 더보기
[Data Structures] Unsorted List & Sorted List 1. List 컴퓨터 프로그램에서 리스트는 굉장히 중요한 추상 자료형이다. C++의 겨웅, STL에서 기본적으로 제공하는 자료형이기도 하다. 이론적 관점에서 리스트는 요소들 간의 선형 관계를 가진 동질적인 요소들의 집합이다. 여기에서 말하는 선형 관계란, 첫번째 요소를 제외한 모든 원소들은 고유한 선행 요소를 가지고 있고, 마지막 요소를 제외한 모든 원소들은 고유한 후속 요소를 가지고 있다는 뜻이다. element1 element2 element3 element4 element5 2. Unsorted List 정렬되지 않은 리스트는 리스트의 각 요소들이 특정한 순서에 맞게 정렬되지 않은 경우를 말한다. 3. Sorted List 정렬되지 않은 리스트는 리스트의 각 요소들이 특정한 순서에 맞게 정렬된 경우.. 더보기
[C++] Virtual principle and Multiple Inheritance 가상의 원리와 다중상속 1. 가상함수의 공유와 가상함수 테이블 C++에서 클래스의 객체가 생성되면, 멤버변수는 객체 내에 존재하지만, 멤버함수는 메모리의 한 공간에 별도로 위치하고선, 이 함수가 정의된 클래스의 모든 객체가 이를 공유하는 형태를 취한다. 클래스에 가상함수가 포함되면, 가상함수 테이블이 생성되고, 이 테이블을 참조하여 호출될 함수가 결정된다. 이러한 과정 때문에 속의 저하가 생기지만 많은 이점 때문에 가상함수는 자주 사용된다. 즉, 한 개 이상의 가상함수 생성 시, 무조건 가상 함수 테이블이 생성되고, 이 가상함수 테이블은 모든 멤버함수를 포함한다. 2. 다중상속 C++의 특이한 점 하나는, 다중상속을 지원한다는 점이다. 물론, 부정적인 의견이 강하기 때문에 간단한 예시를 통해 사용법만 알.. 더보기
[C++] Polymorphism 다형성(多形性) 다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 말한다. 1. 객체 포인터 변수 객체의 주소 값을 저장하는 포인터 변수이다. Student * ptr;// 포인터 변수 선언 ptr = new Student();// 포인터 변수의 객체 참조 // ------------------------------------------------ Student * ptr = new StudentHandler();(O) StudentHandler * ptr = new StudentHandler();(O) 이렇듯, C++에서, 어떠한 데이터형의 포인터 변수는 해당 데이터형 객체 또는 해당 데이터형을 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다. 즉, 객.. 더보기
[C++] Inheritance 상속 C++의 상속은 사전에 정의해 놓은 클래스를 다시금 활용하기 위한 목적으로 만들어진 문법적 요소이다. 클래스를 정의한 뒤, 해당 클래스에 존재하는 변수를 수정하는 등 데이터를 추가적으로 처리하기 위해서는 어떠한 방법이 유리할까? 보통 이러한 경우를 위해 사용하는 클래스를 '컨트롤(Control) 클래스' 혹은 '핸들러(Handler) 클래스'라고 하며, 이러한 클래스는 기능의 처리를 실제로 담당하는 클래스 전체를 의미한다. 아래 이미지가 일반 클래스와 컨트롤 클래스의 의미를 추상적으로 보여준다. 이러한 핸들러 클래스는 보통, 처리하고자 하는 클래스를 '상속'하면 프로그램을 더 OOP하게 할 수 있다. 만일, Student Clss에 추가적인 변수 혹은 함수가 추가되고, 이를 별도의 Handler로 .. 더보기