일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- github
- 깃
- 구조체
- gitlab
- 다트 언어
- c# 추상 클래스
- c#
- c# winform
- c언어
- 포인터
- HTML
- Data Structure
- vim
- C언어 포인터
- docker
- C++
- Algorithm
- 유니티
- Unity
- jupyter
- 플러터
- 도커
- jupyter lab
- C# delegate
- Houdini
- dart 언어
- Flutter
- git
- c# 윈폼
- Today
- Total
목록분류 전체보기 (507)
nomad-programmer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bCZOsx/btqWBAKA2kT/CDxL79Wz5f7nuIBi3IPBu1/img.png)
프로그램은 하드디스크에 저장된 실행 파일을 말한다. 프로세스는 프로그램을 실행한 상태 즉, 하드디스크에서 메인 메모리로 코드와 데이터를 가져와 현 재 실행되고 있는 상태를 말한다. 프로세스는 동시에 여러 개가 존재할 수 있다. 프로세스 상태 오늘날의 운영체제는 대부분 멀티프로세스 기반이다. 프로세스 여러 개를 동시에 실행할 수 있다. 프로세스를 실행하려면 독자적인 메모리 공간과 CPU가 필요하다. CPU는 한 번에 하나의 프로세스에만 할당할 수 있다. 여러 프로세스가 완벽하게 '동시에' 실행되는 건 불가능하다. 즉, 프로세스는 프로그램을 실행하는 순간부터 창을 닫을 때까지 계속해서 실행 상태로 있는 것이 아니다. 프로세스 상태는 상황에 따라 변한다. 총 다섯 가지 상태가 있다. 1. 생성(Created)..
클래스 메서드(class method)와 정적 메서드(static method)가 어떻게 다른지 예제를 보며 살펴보자. class MethodClass: @staticmethod def static_method(): print('static method') @classmethod def class_method(cls): print(cls.__name__) if __name__ == '__main__': stc_mtd = MethodClass() stc_mtd.static_method() stc_mtd.class_method() """ 결과 static method MethodClass """ static_method() 함수는 정적 메서드이다. 정적 메서드는 인자로 클래스나 객체를 받지 않는다. 함수의 ..
C++에서는 C스타일의 형 변환 연산자를 가리켜 '오래된 C스타일 형 변환 연산자(Old C-style cast operator)'라 부르기도 한다. 이렇듯 C스타일의 형 변환 연산자는 C언어와의 호환성을 위해서 존재할 뿐, C++에서는 새로운 형 변환 연산자와 규칙을 제공하고 있다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Car { private: int fuelGauge; public: Car(int fuel) : fuelGauge(fuel) {} void ShowCarState() const { cout
함수 템플릿과 static 지역 변수 template void ShowStaticValue(void) { static T num = 0; num += 1; cout
템플릿을 정의할 때 결정되지 않은 자료형을 의미하는 용도로 사용되는 T 또는 T1, T2와 같은 문자를 가리켜 '템플릿 매개변수' 라 한다. 그리고 템플릿 매개변수에 전달되는 자료형 정보를 가리켜 '템플릿 인자' 라 한다. 템플릿 매개변수에는 변수의 선언이 올 수 있다. template class SimpleArray { private: T arr[len]; public: T& operator[] (int idx) { return arr[idx]; } }; 이렇듯 템플릿 매개변수에도 변수가 올 수 있다. 그리고 이를 기반으로 다음의 형태로 객체생성이 가능하다. SimpleArray i5arr; SimpleArray d7arr; 위의 두 문장에서 템플릿 매개변수 len에 전달된 인자 5와 7은 해당 템플릿..
클래스 템플릿의 특수화 방법 및 개념은 함수 템플릿과 매우 유사하다. 클래스 템플릿 특수화 함수 템플릿을 특수화하는 이유는 특정 자료형에 대해서 구분이 되는 다른 행동을 보이기 위해서다. 마찬가지로 클래스 템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생생도니 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다. 즉, 클래스 템플릿을 특수화하면, 템플릿을 구성하는 멤버함수의 일부 또는 전부를 다르게 행동하도록 정의할 수 있다. 클래스 템플릿을 특수화하는 방법은 다음과 같다. 먼저 다음과 같이 정의된 클래스 템플릿이 존재할 때, template class SoSimple { public: T SimpleFunc(T num) { ... } } 이를 기반으로 자료형 int에 대해 특수화 한 템플..
클래스 템플릿의 정의방법은 함수 템플릿의 정의방법과 동일하다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; template class Point { private: T xpos, ypos; public: explicit Point(const T x = 0, const T y = 0) : xpos(x), ypos(y) {} void ShowPosition() const { cout
함수 템플릿과 템플릿 함수 다음의 정의를 가리켜 '함수 템플릿(Function Template)' 이라 한다. template T Add(T num1, T num2) { return num1 + num2; } 반면 위의 템플릿을 기반으로 컴파일러가 만들어 내는 다음 유형의 함수들을 가리켜 '템플릿 함수(Template Function)' 이라 한다. int Add(int a, int b) { return num1 + num2; } double Add(double num1, double num2) { return num1 + num2; } 템플릿 함수의 표시에서 와 은 일반함수가 아닌, 컴파일러가 만들어낸 템플릿 기반의 함수임을 표시한 것이다. 함수 템플릿 함수를 만드는데 사용되는 템플릿 템플릿 함수 템플..
C++ 표준 라이브러리에는 string이라는 이름의 클래스가 정의되어 있다. 해당 클래스는 문자열의 처리를 목적으로 정의된 클래스이며, 이 클래스의 사용을 위해서는 헤더파일 을 포함해야 한다. #include #include usging namespace std; int main(void) { string str1 = "C++ "; string str2 = "Language Love"; string str3 = str1 + str2; cout
C++에서는 객체간의 대입연산을 허용한다. 당연하게도 두 객체의 자료형이 일치할 때에만 대입연산이 가능하다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Number { private: int num; public: Number(int n = 0) : num(n) { cout
함수 호출에 사용되는 인자의 전달에 사용되는 ( )도 연산자이므로 오버로딩이 가능하다. 그리고 이 연산자를 오버로딩 하면, 객체를 함수처럼 사용할 수 있게 된다. adder(5, 7); 객체의 이름이 adder이고 이 객체에 ( )연산자가 멤버함수로 오버로딩 되어 있는 상태라면, 다음과 같이 해석된다. adder.operator()(5, 7); 연산자가 ( )이니 멤버함수의 이름은 operator()이다. 그리고 함수에 전달되는 인자의 정보는 5와 7이다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: exp..
스마트 포인터란 말 그대로 똑똑한 포인터이다. 그리고 스마트 포인터는 객체이다. 포인터의 역할을 하는 객체를 뜻한다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: explicit Point(const int x = 0, const int y = 0) : xpos(x), ypos(y) { cout
new와 delete도 연산자이기 때문에 오버로딩이 가능하다. new 연산자 기본적으로 제공되는 new 연산자가 하는 일은 다음과 같다. 메모리 공간의 할당 생성자의 호출 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 이 중 세 번째 내용은 C언어에서 사용하면 malloc함수와 달리, new 연산자가 반환하는 주소 값을 형 변환할 필요가 없음을 의미한다. new 연산자의 오버로딩은 1번에 해당하는 메모리 공간의 할당만 오버로딩할 수 있다. 나머지 두 가지 작업은 C++ 컴파일러에 의해 진행이 되며, 오버로딩할 수 있는 대상도 아니다. new 연산자 오버로딩은 다음과 같이 오버로딩 하도록 이미 약속이 되어있다. void* operator new(size_t size) { ... } 반환형은 반드..
#include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class BoundCheckIntArray { private: int* arr; int arrlen; explicit BoundCheckIntArray(const BoundCheckIntArray& ref) {} BoundCheckIntArray& operator=(const BoundCheckIntArray& ref) {} public: explicit BoundCheckIntArray(int len) : arrlen(len) { arr = new int[len]; } ~BoundCheckIntArray() { delete[]..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QNmRa/btqVvOEcrye/K4hJzwJ8u2FdU8ohUgpOhk/img.png)
함수 호출관계 모호함은 다음과 같은 상황에서도 발생할 수 있다. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Base { public: explicit Base() { cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OrZcr/btqVqFuMCGZ/KWJZ5p1dqPgp3sbND6k4y0/img.png)
가상함수의 동작원리를 이해하면, C++이 C보다 느린 이유를 조금이나마 알 수 있다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class AAA { private: int num1; public: virtual void Func1() { cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lR6qA/btqVnY75SVS/snAkmGISsZ5EUAr9qkGUr1/img.png)
가상함수 말고도 virtual 키워드를 붙여줘야 할 대상이 하나 더 있다. 그것은 바로 '소멸자'이다. 즉, virtual 선언은 소멸자에도 올 수 있다. 가상 소멸자(Virtual Destructor) virtual로 선언된 소멸자를 가리켜 '가상 소멸자'라 부른다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { private: char* strOne; public: explicit First(const char* str) { cout
함수를 override 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미이다. 하지만 포인터 변수의 자료형에 따라 호출되는 함수 종류가 달라지는 것은 문제가 있다. 다음의 예제를 보자. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { public: void MyFunc() { cout
다음은 List 사용의 main.c 파일의 내용이다. #include #include #include "List.h" /* clinet */ void* AllocData(double data){ double* p = (double*)malloc(sizeof(double)); *p = data; return p; } void FreeData(void* p){ free(p); } void PrintPrevious(LIST* lst){ printf("prev: "); for(ResetTailPos(lst); HasPrevious(lst); Previous(lst)){ printf("%lf ", *(double*)GetItem(lst)); } puts(""); } void PrintNext(LIST* lst){..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LhMW9/btqUwyuupEO/YjKkBjhBrtjdXPpEy5kVb0/img.png)
비트 필드는 구조체와 흡사하나 구조체는 바이트 단위로 멤버를 사용할 수있지만 비트 필드는 비트 단위로 멤버를 사용할 수 있다. 그래서 많은 상태를 저장하거나 비트별로 제어해야 하는 경우에 비트 필드를 사용한다. 비트 필드의 멤버는 unsigned형(unsigned int형)과 int형의 멤버를 가질 수 있고 비트 필드 변수의 크기는 int형 크기와 같은 4바이트(32비트)이다. signed와 unsigned는 char, short, int, long 등의 자료형 앞에 사용되어 부호가 있는 정수와 부호가 없는 정수를 나타내는 자료형으로 사용되며 signed는 보통 생략하여 사용한다. 비트 필드처럼 unsigned가 단독으로 사용되면 unsigned int형을 간략하게 표현한 형태이다. 다음은 비트 필드를 ..