일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jupyter
- c# winform
- c# 윈폼
- 포인터
- Flutter
- C# delegate
- Python
- 플러터
- docker
- c언어
- Houdini
- Data Structure
- 유니티
- git
- c#
- vim
- gitlab
- Algorithm
- HTML
- 구조체
- Unity
- github
- jupyter lab
- C++
- 도커
- C언어 포인터
- 깃
- dart 언어
- 다트 언어
- c# 추상 클래스
- Today
- Total
목록Programming (313)
nomad-programmer
멤버 변수와 멤버 함수 외에 클래스의 정의 안에 포함할 수 있는 것들이 있다. 그 중에서도 자주 사용하는 열거체와 typedef에 대해 알아보자. 열거체 클래스의 정의 안에 열거체를 넣는 것은 클래스 밖에서 정의하는 것과 크게 다르지 않다. 클래스에 소속된다는 점에서 차이가 있을 뿐이다. 예를 들어 클래스의 안에서만 사용하거나 클래스와 관련된 열거체의 경우에는 클래스의 소속으로 두는 것이 좋다. 관련된 것은 끌어 모을수록 좋은 것이다. 다음의 예제를 보자. x, y값의 범위를 열거체를 사용해서 정의했다. 상수 대신 심볼을 사용하면 소스 코드를 읽기도 쉽고 관리하기도 쉽다. #include #include using namespace std; class Point{ public: enum {MIN_X=0,..
다음 예제에서 유심히 봐야할 것은 생성자가 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 키워드는 가상 함수를 뜻한다. 가상함수에는 함수의 몸체를 정의하지 않는 순수 가상함수(추상..
일반적인 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르기 때문이다. #include using namespace std; // void XX() 형태의 함수에 대한 포인터 typedef void (*FP1)(int); // void Point::XX() 형태의 멤버 함수에 대한 포인터 typedef void (Point::*FP2)(int); int main(int argc, const char * argv[]) { Point pt(12, 34); FP1 fp1 = &Point::SetX; // 오류 FP2 fp2 = &Point::SetX; // 성공 // 함수 포인터를 사용해서 함수 호출 (pt.*fp2)(100); retur..
const 함수를 사용하는 이유 멤버 변수의 값을 변경하지 않는 멤버 함수 멤버 함수 안에 멤버 변수의 값을 변경하는 코드가 없다는 뜻이다. 멤버 변수의 값을 읽는 것은 상관 없다. 그렇다면 멤버 함수를 const로 만드는 것은 어떤 의미가 있을까? 크게 세 가지 정도의 의미를 찾아볼 수 있다. 다른 개발자가 "이 함수에는 멤버 변수의 값을 변경하지 않는구나" 라고 생각하게 만든다. 실수로 멤버 변수의 값을 바꾸려고 하면, 컴퓨터가 오류 메시지를 통해 알려준다. const 객체를 사용해서 이 함수를 호출할 수 있다. const Point pt(123, 234); 문법만 보면 기존에 기존 타입의 변수를 const로 정의하던 것과 다를 것이 없다. 기본 타입의 변수가 const라면 그 변수의 값을 바꿀 수가..
헤더 파일 구현 파일 클래스의 정의 인라인 멤버 함수 멤버 함수의 정의 정적 멤버 함수의 정의 정적 멤버 변수의 정의 인라인 함수는 새로운 종류의 함수가 아니고 함수의 속성이다. 멤버가 아닌 함수도 인라인이 될 수 있다. 왜 인라인 함수를 사용할까? 인라인 함수의 기본 개념은 함수를 호출하는 대신 함수의 내용을 그대로 옮겨 놓는 것이다. 아래의 예를 보자. #include #include using namespace std; inline void Func(){ cout

비트 필드(Bit Fields)를 사용하면 구조체의 멤버가 차지하는 메모리 공간을 원하는 데로 조절할 수 있다. 예를 들면 멤버 a는 3비트만, b는 4비트만 차지하게 만드는 것이 가능하다. struct Flags { int a : 3; int b : 4; bool c : 1; }; 비트 필드를 사용하는 멤버는 정수 타입만 가능한데, 멤버의 뒤에 적힌 숫자가 멤버가 차지할 비트 수를 의미하게 된다. 즉 위의 구조체를 사용해서 변수를 정의하게 되면 다음과 같은 메모리 구조를 갖게 된다. 중간에 사용하지 않는 비트를 넣고 싶을 때는 멤버의 이름을 적어주지 않으면 된다. 이렇게 해주면 중간에 5비트는 사용하지 않은 채로 남게 된다. struct Flags { int a : 3; int b : 4; int : ..
포인터 변수를 정의할 때는 const를 최대 2개까지 포함할 수 있다. 그 이유는 포인터 변수는 2개의 정보와 관련이 있기 때문이다. 하나는 포인터 변수 자체에 보관된 정보다. 그리고 다른 하나는 포인터가 가리키는 변수에 보관된 정보를 말한다. 즉, 이 두 가지 정보에 대해서 const 여부를 설정할 수 있는 것이다. int a = 10; int b = 20; const int* p = &a; p = &b; // ok *p = 30; // fail 맨 앞에 const를 추가했다. 이렇게 한 것은 "p가 가리키는 변수는 const int 타입니다"라는 의미가 된다. 따라서 p가 가리키는 변수의 값을 바꾸는 것을 허용하지 않게 된다. p가 가리키는 변수는 실제로 const속성을 가졌는지는 중요하지 않다. 다..

바탕화면 설정 시에 '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
yield 키워드로 값을 한 번씩 바깥으로 전달할 수 있다. 그래서 값을 여러 번 바깥으로 전달할 때는 for 또는 while 반복문으로 반복하면서 yield를 사용한다. 다음은 리스트의 1, 2, 3을 바깥으로 전달하는 예이다. def number_generator(): x = [1, 2, 3] for i in x: yield i for i in number_generator(): print(i) # 결과 1 2 3 이런 경우에는 매번 반복문을 사용하지 않고, yield from을 사용하면 된다. yield from에는 반복 가능한 객체, 이터레이터, 제네레이터 객체를 지정한다. yield from은 파이썬 3.3 이상부터 사용 가능하다. yield from [반복 가능한 객체] yield from [..
1. Process Explorer https://docs.microsoft.com/ko-kr/sysinternals/downloads/process-explorer Process Explorer - Windows Sysinternals Find out what files, registry keys and other objects processes have open, which DLLs they have loaded, and more. docs.microsoft.com 2. Process Monitor https://docs.microsoft.com/en-us/sysinternals/downloads/procmon Process Monitor - Windows Sysinternals Monitor fil..
단위 테스트(unittest) 파이썬에서는 PyUnit이라고도 불리는 unittest 모듈이 있다. 이 모듈은 일반적으로 어던 모듈이나 함수를 작성할 때 정상 동작 여부를 테스트하는 과정을 거치게된다. 이러한 테스트케이스들은 한 번 사용하고 버리는 경우가 대부분이다. 하지만 다음에 코드가 수정되어도 기존에 작성한 테스트들을 수행할 수 있다면 더욱 편리하겠다. 이러한 기능을 제공해주는 라이브러리가 바로 unittest 이다. TestCase 기본적으로 unittest 모듈은 다음과 같이 간단하게 사용할 수 있다. # _*_ coding: utf-8 _*_ import unittest def sum(a, b): return a + b class Module1Test(unittest.TestCase): def..

이진 탐색 트리는 '탐색에 효율적인 자료구조'이다 그리고 '이진 트리'의 일종이다. 이진 트리의 구조를 보면, 트리는 탐색에 효율적이라는 사실을 쉽게 알 수 있다. 이진 트리에 저장된 데이터의 수가 10억 개 수준에 이른다 해도 트리의 높이는 30을 넘지 않기 때문이다. 그렇다면 이것이 탐색에 있어서 어떤 의미를 지니겠는가? 예를 들어 연결 리스트에 10억 개의 데이터가 저장되어 있다고 가정해보자. 그리고 찾는 데이터가 이 리스트의 정중앙에 위치한다는 정보를 얻었다고 가정해보자. 이는 분명 유용한 정보이다. 하지만 이러한 정보를 가지고 있음에도 불구하고 데이터에 이르기 위해서는 약 5억 개의 노드를 지나야 한다. 반면 이진 트리의 경우에는 위치를 알고 있다면, 즉 데이터에 이르는 길을 알고 있다면 루트 ..

탐색의 이해 탐색은 '데이터를 찾는 방법'이다. 탐색은 알고리즘보다 자료구조에 더 가까운 주제이다. 이유는 다음과 같다. "효율적인 탐색을 위해서는 '어떻게 찾을까'만을 고민해서는 안 된다. 그보다는 '효율적인 탐색을 위한 저장방법이 무엇일까'를 우선 고민해야 한다." 그런데 효율적인 탐색이 가능한 대표적인 저장방법은 '트리'이다. 때문에 탐색에 관한 이야기의 대부분은 트리의 연장선상에 놓여있다. 정렬도 탐색을 목적으로 하는 경우가 대부분일 만큼 탐색은 자료구조에서, 컴퓨터 공학에서 매우 중요한 위치를 차지하고 있다. 보간 탐색(Interpolation Search) 정렬되지 않은 대상을 기반으로 하는 탐색 : 순차 탐색 정렬된 대상을 기반으로 하는 탐색 : 이진 탐색 이 중에서 이진 탐색은 중앙에 위치..
레드 블랙 트리를 시뮬레이션할 수 있는 사이트이다. www.cs.usfca.edu/~galles/visualization/RedBlack.html Red/Black Tree Visualization www.cs.usfca.edu
입력 속도 비교 www.acmicpc.net/blog/view/56 입력 속도 비교 여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일 www.acmicpc.net 출력 속도 비교 www.acmicpc.net/blog/view/57 출력 속도 비교 여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평 www.acmicpc.net

기수 정렬은 정렬순서상 앞서고 뒤섬의 판단을 위한 비교연산을 하지 않는다. 비교연산은 정렬 알고리즘의 핵심이라 할 수 있다. 특히 두 데이터 간의 정렬순서상 우선순위를 판단하기 위한 비교연산은 핵심중의 핵심이다. 때문에 모든 정렬 알고리즘들은 이 연산을 포함하고 있다. 뿐만 아니라 알고리즘의 복잡도도 이 연산을 근거로 판단해왔다. 그런데 이런 유형의 비교연산을 하지 않고서도 정렬을 할 수 있는 것이 "기수 정렬"이다. 그리고 정렬 알고리즘의 이론상 성능의 한계는 O(nlog2n)으로 알려져 있는데, 기수 정렬은 이러한 한계를 넘어설 수 있는 유일한 알고리즘이다. 물론 이렇게 좋은 점만 있는 것은 아니다. 다른 알고리즘에는 없는 단점도 있다. 그것은 바로 '적용할 수 있는 범위가 제한적'이라는 것이다. 예..

병합 정렬과 마찬가지로 '분할 정복(divide and conquer)'에 근거하여 만들어진 정렬 방법이다. 실제로 퀵 정렬 역시 정렬 대상을 반씩 줄여나가는 과정을 포함한다. 퀵 정렬은 그 이름이 의미하듯이 평균적으로 매우 빠른 정렬의 속도를 보이는 알고리즘이다. 위 그림에서는 퀵 정렬의 대상이 되는 배열을 보이고 있다. left : 정렬대상의 가장 왼쪽 지점을 가리키는 이름 right : 정렬대상의 가장 오른쪽 지점을 가리키는 이름 피벗(pivot)의 사전적 의미는 다음과 같다. pivot : 중심점, 중심축의 의미 즉 피벗은 정렬을 진행하는데 필요한 일종의 '기준'이라 할 수 있따. 때문에 정렬의 진해을 위해서는 피벗이라는 것을 진행해야 한다. low : 피벗을 제외한 가장 왼쪽에 위치한 지점을 가..

병합 정렬은 '분할 정복(divide and conquer)'이라는 알고리즘 디자인 기법에 근거하여 만들어진 정렬 방법이다. 분할 정복이란, 말 그대로 복잡한 문제를 복잡하지 않은 문제로 '분할(divide)'하여 '정보(conquer)'하는 방법을 말한다. 단 분할해서 정복했으니 정복한 후에는 '결합(combine)'의 과정을 거쳐야 한다. 즉 다음 3단계를 거치도록 알고리즘을 디자인 하는 것이 분할 정복법이다. 1단계 분할(Divide) : 해결이 용이한 단계까지 문제를 분할해 나간다. 2단계 정복(Conquer) : 해결이 용이한 수준까지 분할된 문제를 해결한다. 3단계 결합(Combine) : 분할해서 해결한 결과를 결합하여 마무리한다. 이 방법을 근거로 어떻게 병합 정렬 알고리즘이 디자인되었을까..