일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- git
- c#
- Algorithm
- Python
- 다트 언어
- c# 추상 클래스
- C++
- 구조체
- C# delegate
- Flutter
- C언어 포인터
- c# winform
- gitlab
- jupyter
- vim
- 도커
- 포인터
- 유니티
- HTML
- 깃
- c# 윈폼
- Houdini
- github
- Data Structure
- c언어
- Unity
- docker
- dart 언어
- 플러터
- jupyter lab
- Today
- Total
목록C++ (12)
nomad-programmer
STL은 이름 그대로 템플릿을 사용해서 만들어진 라이브러리다. STL은 일반적으로 많이 사용하는 클래스와 함수들이 만들어져 있는데, 예를 들어 링크드 리스트 클래스, 동적 배열 클래스, 정렬 함수, 검색 함수 등과 같이 범용적인 클래스와 함수들이 있다. 또한 이런 클래스와 함수들은 템플릿으로 만들어져 있기 때문에 확장이 용이하다. STL은 사용함으로써 얻을 수 있는 장점들이 있다. 첫번째, STL은 표준이다. 이는 지구 반대편에 있는 개발자도 나와 똑같은 클래스와 함수를 사용한다는 것을 의미한다. 때문에 상대방이 작성해놓은 코드를 쉽게 알아볼 수 있다. 두번째, STL은 전문가들이 만들어 놓은 것이기 때문에 직접 만든 것보다 효율적이고 안전하다. 물론 엄청난 실력자라 STL에 있는 것보다 훌륭하게 만들 ..
예외 처리가 프로와 아마추어를 구분하는 기준이 될 수 있다는 점을 기억하자. 반환 값을 사용한 예외 처리 다음의 예제를 살펴보자. // DynamicArray.h #pragma once class DynamicArray { public: DynamicArray(int arraySize); ~DynamicArray(); bool SetAt(int intdex, int value); int GetAt(int index) const; int GetSize() const; protected: int* arr; int size; }; // DynamicArray.cpp #include "DynamicArray.h" DynamicArray::DynamicArray(int arraySize) { arr = new i..
언제 가상 함수가 필요할까? 가상 함수의 필요성을 알아보려면 소스 코드를 보는 것이 가장 좋다. 다음의 예제를 보자. #include using namespace std; class Shape{ public: void Move(double x, double y); void Draw() const; Shape(); Shape(double x, double y); protected: double _x, _y; }; Shape::Shape(): _x(0), _y(0) {} Shape::Shape(double x, double y): _x(x), _y(y) {} void Shape::Move(double x, double y){ _x = x; _y = y; } void Shape::Draw() const{ cout
const 멤버 함수는 멤버 함수 내에서 객체의 멤버 변수를 변경하지 않는다는 것을 보장하는 함수이다. 따라서 const 객체는 const 멤버 함수만 호출할 수 있다. const 멤버 함수에서 멤버 변수를 변경하면 컴파일 에러가 발생한다. 사실 자신의 멤버를 변경하지 않는 멤버 함수는 모두 const 멤버 함수여야만 한다. 다음은 cosnt 멤버 함수 예제이다. class Point{ public: Point(int _x=0, int _y=0) : x(_x), y(_y) {} int GetX() const { return x; } int GetY() const { return y; } void SetX(int _x) { x = _x; } void SetY(int _y) { y = _y; } void P..
다음 예제에서 유심히 봐야할 것은 생성자가 private으로 되어 있다는 점이다. 즉, 클래스의 외부에서 객체 생성하는 것은 불가능하다. 하지만 멤버라면 가능하다. 그래서 정적 멤버 함수에서 객체를 동적으로 생성해서 그 주소를 반환하게 만들었다. #include #include using namespace std; class Student{ public: string name; int sNo; void Print(); private: Student(const string& name_arg, int stdNumber); public: static int studentNumber; static Student* CreateStudent(const string& name_arg); }; int Student::..
c++ 상속을 공부하며 많이 보았던 키워드는 virtual 키워드일 것이다. virtual에 비하여 많이 보지 못했던 키워드는 override와 final 키워드일 것이다. override와 final 키워드는 c++11 이후에 등장하는 키워드라서 그렇다. 고로 오래된 c++ 책으로 공부를 했다면 virtual 키워드만 보았을 가능성이 높다. virtual, override, final은 모두 상속 관련하여 오버라이딩할 때 사용하는 키워드들이다. 조금씩 용도는 다르다. override와 final 키워드가 새롭게 추가된 이유를 한번 알아보고 각 키워드가 무엇을 뜻하는지 살펴보자. virtual 키워드 virtual 키워드는 가상 함수를 뜻한다. 가상함수에는 함수의 몸체를 정의하지 않는 순수 가상함수(추상..
바탕화면 설정 시에 '16비트(트루컬러)'라는 용어를 접해봤을 것이다. 16비트 컬러의 의미는 점 하나를 표시하는데 16비트를 사용한다는 뜻이다. 즉, 16비트가 표현할 수 있는 상태의 수 만큼이나 다양한 색상을 표현할 수 있다는 의미이다. 컴퓨터 상에서 색상을 표현할 때는 보통 빛의 3요소인 빨강(Red), 초록(Green), 파랑(Blue), 즉 RGB를 기본 원소로 사용한다. 이 R, G, B 각각의 밝기에 따라서 여러 가지 색깔이 만들어지는 것이다. 16비트 컬러의 경우에는 이 R, G, B 각각의 밝기가 16비트 안에 모두 포함되어야 한다. 그래서 R, G, B가 보통 5비트, 6비트, 5비트씩 할당된다 (각각 5비트씩 할당하고 1비트는 쓰지 않는 경우도 있다). 그래서 R과 B는 2의5승 단계..
#include #include using namespace std; int main() { char c = 1; short int si = 2; int i = 4; cout
이진 탐색 트리는 '탐색에 효율적인 자료구조'이다 그리고 '이진 트리'의 일종이다. 이진 트리의 구조를 보면, 트리는 탐색에 효율적이라는 사실을 쉽게 알 수 있다. 이진 트리에 저장된 데이터의 수가 10억 개 수준에 이른다 해도 트리의 높이는 30을 넘지 않기 때문이다. 그렇다면 이것이 탐색에 있어서 어떤 의미를 지니겠는가? 예를 들어 연결 리스트에 10억 개의 데이터가 저장되어 있다고 가정해보자. 그리고 찾는 데이터가 이 리스트의 정중앙에 위치한다는 정보를 얻었다고 가정해보자. 이는 분명 유용한 정보이다. 하지만 이러한 정보를 가지고 있음에도 불구하고 데이터에 이르기 위해서는 약 5억 개의 노드를 지나야 한다. 반면 이진 트리의 경우에는 위치를 알고 있다면, 즉 데이터에 이르는 길을 알고 있다면 루트 ..
탐색의 이해 탐색은 '데이터를 찾는 방법'이다. 탐색은 알고리즘보다 자료구조에 더 가까운 주제이다. 이유는 다음과 같다. "효율적인 탐색을 위해서는 '어떻게 찾을까'만을 고민해서는 안 된다. 그보다는 '효율적인 탐색을 위한 저장방법이 무엇일까'를 우선 고민해야 한다." 그런데 효율적인 탐색이 가능한 대표적인 저장방법은 '트리'이다. 때문에 탐색에 관한 이야기의 대부분은 트리의 연장선상에 놓여있다. 정렬도 탐색을 목적으로 하는 경우가 대부분일 만큼 탐색은 자료구조에서, 컴퓨터 공학에서 매우 중요한 위치를 차지하고 있다. 보간 탐색(Interpolation Search) 정렬되지 않은 대상을 기반으로 하는 탐색 : 순차 탐색 정렬된 대상을 기반으로 하는 탐색 : 이진 탐색 이 중에서 이진 탐색은 중앙에 위치..
기수 정렬은 정렬순서상 앞서고 뒤섬의 판단을 위한 비교연산을 하지 않는다. 비교연산은 정렬 알고리즘의 핵심이라 할 수 있다. 특히 두 데이터 간의 정렬순서상 우선순위를 판단하기 위한 비교연산은 핵심중의 핵심이다. 때문에 모든 정렬 알고리즘들은 이 연산을 포함하고 있다. 뿐만 아니라 알고리즘의 복잡도도 이 연산을 근거로 판단해왔다. 그런데 이런 유형의 비교연산을 하지 않고서도 정렬을 할 수 있는 것이 "기수 정렬"이다. 그리고 정렬 알고리즘의 이론상 성능의 한계는 O(nlog2n)으로 알려져 있는데, 기수 정렬은 이러한 한계를 넘어설 수 있는 유일한 알고리즘이다. 물론 이렇게 좋은 점만 있는 것은 아니다. 다른 알고리즘에는 없는 단점도 있다. 그것은 바로 '적용할 수 있는 범위가 제한적'이라는 것이다. 예..