일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 유니티
- HTML
- git
- Flutter
- 다트 언어
- docker
- c# 추상 클래스
- 도커
- Data Structure
- 플러터
- 구조체
- dart 언어
- C언어 포인터
- 깃
- C# delegate
- Python
- Unity
- c# 윈폼
- C++
- github
- Houdini
- c#
- jupyter lab
- Algorithm
- c언어
- gitlab
- vim
- Today
- Total
목록Programming (305)
nomad-programmer
// string1.h #pragma once #include using std::ostream; using std::istream; class String { public: // 생성자와 기타 메서드 String(const char* s); // 생성자 String(); // 디폴트 생성자 String(const String& st); // 복사 생성자 ~String(); // 소멸자 int length() const { return len; } // 오버로딩 연산자 메서드 String& operator=(const String& st); String& operator=(const char* s); char& operator[](const int i); const char& operator[](cons..
FastAPI는 정말 빠른 프레임워크이다. 그리고 FastAPI의 동생이 있는데, 그것은 바로 Typer이다. https://fastapi.tiangolo.com/ko/ FastAPI FastAPI FastAPI 프레임워크, 고성능, 간편한 학습, 빠른 코드 작성, 준비된 프로덕션 문서: https://fastapi.tiangolo.com 소스 코드: https://github.com/tiangolo/fastapi FastAPI는 현대적이고, 빠르며(고성능), 파이썬 fastapi.tiangolo.com https://typer.tiangolo.com/ Typer Typer, build great CLIs. Easy to code. Based on Python type hints. typer.tiango..
함수 포인터는 표기법이 난해하다는 문제를 가지고 있다. const double* f1(const double arr[], int n); const double* f2(const double [], int); const double* f3(const double*, int); // 함수 포인터 배열 const double* (*pa[3]) (const double*, int) = {f1, f2, f3}; pa는 리턴형이 const double*이고, 매개변수로 const double*와 int형을 받을 수 있는 함수 포인터 3개를 저장할 수 있는 함수 포인터 배열이다. pa를 가리키는 포인터를 만드려면 어떻게 해야 할까? 명확하게, 선언은 pa를 선언하는 것과 유사하지만, *가 더 필요하다. 새로운 포인터..
재귀 호출은 하나의 작업을 서로 비슷한 두 개의 작은 작업으로 반복적으로 분할해가면서 처리해야 하는 상황에서 특별히 유용하다. 예를 들면, 눈금자를 그리는 데 이것을 적용할 수 있다. 두 개의 끝을 먼저 표시한 후 그들의 중간 지점을 찾아 눈금을 표시한다. 동일한 절차를 눈금자의 왼쪽 절반에 대해 수행한다. 그리고 나서 눈금자의 오른쪽 절반에 대해서도 같은 절차를 수행한다. 눈금 간격을 더욱 세분하려면 현재의 눈금 구획에 대해 동일한 절채를 다시 수행한다. 이러한 재귀적인 접근을 "분할 정복(divide-and-conquer)" 전략이라고 한다. #include using namespace std; const int LEN = 66; const int DIVS = 6; void subdivide(char..
cin.get(char)를 이용한 입력 일반적으로 문자 단위로 입력을 읽어들이는 프로그램들은 빈칸 문자, 탭 문자, 개행 문자까지 포함하여 모든 문자를 읽어들여야 한다. cin이 속해 있는 istream 클래스는 이런 요구를 만족시키는 멤버 함수들을 가지고 있다. 특별히 cin.get(ch) 멤버 함수는 빈칸 문자까지도 입력받아 ch 변수에 저장한다. #pragma warning(disable: 4996) #include using namespace std; int main() { char ch; int count = 0; cin.get(ch); while (ch != '#') { cout
vector 템플릿 클래스 vector 템플릿 클래스는 동적 배열에 속하는 string 클래스와 유사하다. 프로그램에 실행되는 동안 vector 객체의 크기를 세팅할 수 있고, 새로운 데이터를 마지막에 추가하거나 중간에 데이터를 삽입할 수도 있다. 기본적으로 동적 배열을 생성하기 위해 new를 사용하는 것을 대체할 수 있다. 실제로 vector 클래스는 메모리를 관리하기 위해서 new와 delete를 사용하지만, 그 과정은 자동으로 진행된다. 몇 가지 기본적이고 실질적인 문제를 살펴보도록 하자. 첫째, vector 객체를 사용하기 위해서는 vector 헤더 파일을 포함해야 한다. 둘째, vector 식별자는 std 이름 공간의 일부분이기 때문에 using 명령, using 선언 또는 std::vector..
때로는 프로그램이 1바이트로 표현할 수 없는 문자 세트(예를 들면 일본어, 중국어, 한국어 문자 세트)를 처리해야 하는 경우도 있다. C++는 이것을 두 가지 방법으로 처리한다. 첫째, 확장 문자 세트가 시스템의 기본 문자 세트이면, 컴파일러 개발업체가 char형을 처음부터 2바이트(16비트) 또는 그 이상으로 만드는 것이다. 둘째, 기본 문자 세트와 확장 문자 세트를 동시에 지원하는 것이다. 즉, 보통의 8비트 char형으로 기본 문자 세트를 나타내고, wchar_t형(wide character type에서 w, char, t를 각각 따 왔다)으로 확장 문자 세트를 나타내는 것이다. wchar_t형은 시스템에서 사용되는 가장 큰 확장 문자 세트를 나타낼 수 있을 만큼의 충분한 비트 폭을 가진 정수형이다..
asyncio는 비동기 프로그래밍을 위한 모듈이며, CPU 작업과 I/O를 병렬로 처리하게 해준다. 동기(synchronous) 처리는 특정 작업이 끝나면 다음 작업을 처리하는 순차처리 방식이다. 비동기(asynchronous) 처리는 여러 작업을 처리하도록 예약한 뒤 작업이 끝나면 결과를 받는 방식이다. 네이티브 코루틴 만들기 먼저 asyncio를 사용하려면 다음과 같이 async def로 네이티브 코루틴을 만든다. 참고로 파이썬에서는 제네레이터 기반의 코루틴과 구분하기 위해 async def로 만든 코루틴은 네이티브 코루틴이라고 한다. async def 함수이름(): 코드 import asyncio async def hello(): # async def로 네이티브 코루틴을 만듦 print('hello..
open으로 파일을 열 때 with as를 사용하여 파일 객체의 close를 자동으로 호출해주었다. 이런 방식으로 with as를 사용하려면 클래스에 __enter__와 __exit__ 메서드를 구현해주면 된다. class 클래스이름: def __enter__(self): # 시작할 때 실행할 코드 def __exit__(self, exe_type, exc_val, exc_tb): # 종료할 때 실행할 코드 with에 클래스의 인스턴스를 지정하고 as 뒤에 결과를 저장할 변수를 지정한다. with 클래스() as 변수: # 코드 다음은 open('hello.tt', 'w') 처럼 동작하는 OpenHello 클래스이다. class OpenHello: def __enter__(self): # 파일 객체를 속..
정규표현식은 일정한 규칙을 가진 문자열을 표현하는 방법이다. 복잡한 문자열 속에서 특정한 규칙으로 된 문자열을 검색한 뒤 추출하거나 바꿀 때 사용한다. 또는 문자열이 정해진 규칙에 맞는지 판단할 때도 사용한다. 문자열 판단하기 정규표현식은 re 모듈을 가져와서 사용하며 match 함수에 정규표현식 패턴과 판단할 문자열을 넣는다. re.match('패턴', '문자열') import re re.match('hello', 'hello, world') # 문자열이 있으므로 정규표현식 매치 객체 반환 re.match('python', 'hello, world') # 문자열이 없으므로 아무것도 반환되지 않음 문자열이 맨 앞에 오는지 맨 뒤에 오는지 판단하기 정규표현식은 특정 문자열이 맨 앞에 오는지 맨 뒤에 오는지..
파이썬은 데코레이터라는 기능을 제공한다. 데코레이터는 장식하다, 꾸미다라는 뜻의 decorate에 er(or)을 붙인 말인데 장식하는 도구 정도로 설명할 수 있다. 클래스에서 메서드를 만들 때 @staticmethod, @classmethod, @abstractmethod 등을 붙였는데, 이렇게 @로 시작하는 것들이 데코레이터이다. 즉, 함수(메서드)를 장식한다고 해서 이런 이름이 붙었다. class Calc: @staticmethod # 데코레이터 def add(a, b): print(a + b) 데코레이터를 만드는 방법 데코레이터는 함수를 장식한다고 했는데 도대체 어디에 사용하는 것일까? 데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용한다. 예를 들어 함수의 시작과 끝을 출력하..
코루틴의 이점은 무엇인가? 보통 두 루틴이 동시에 실행되는 멀티태스킹은 하나의 변수에 값을 동시에 쓰면(write) 동기화 문제가 발생한다. 따라서 크리티컬 섹션, 세마포어, 뮤텍스 등 동기화를 위한 락(lock)이 필요하다. 하지만 코루틴은 시분할 방식 멀티태스킹이라 동기화를 위한 락이 필요하지 않다. 함수를 호출한 뒤 함수가 끝나면 현재 코드로 다시 돌아왔다. 예를 들어 다음의 코드를 보자. def add(a, b): c = a + b print(c) print('add func') def calc(): add(1, 2) print('calc func') 이 소스 코드에서 calc함수와 add 함수의 관계를 살펴보자. calc가 메인 루틴(main routine)이면 add는 calc의 서브 루틴(s..
제네레이터는 제네레이터 객체에서 __next__ 메서드를 호출할 때마다 함수 안의 yield 까지 코드를 실행하며 yield에서 값을 발생시킨다(generate). 그래서 이름이 제네레이터이다. for와 제네레이터 for 반복문은 반복할 때마다 __next__ 를 호출하므로 yield에서 발생시킨 값을 가져온다. 그리고 StopIteration 예외가 발생하면 반복을 끝낸다. 참고로 제네레이터 객체에서 __iter__를 호출하면 self를 반환하므로 같은 객체가 나온다. (제네레이터 함수 호출 > 제네레이터 객체 > __iter__는 self 반환 > 제네레이터 객체) 그런데 generate라는 키워드를 사용하면 되지 왜 yield라고 이름을 지었을까? yield는 생산하다라는 뜻과 양보하다라는 뜻도 가..
__iter__, __next__ 메서드를 구현하여 직접 이터레이터를 만들어보자. 간단하게 range(횟수)처럼 동작하는 이터레이터다. class Counter: def __init__(self, stop: int) -> None: self.__current = 0 self.__stop = stop def __iter__(self): return self def __next__(self) -> int: if self.__current < self.__stop: r = self.__current self.__current += 1 return r else: raise StopIteration if __name__ == '__main__': for i in Counter(3): print(i, end=' '..
컴퓨테이셔널 씽킹은 4가지로 되어 있다. 분해: 복잡한 문제를 작은 문제로 나눈다. 패턴 인식: 문제 안에서 유사성을 발견한다. 추상화: 문제의 핵심에만 집중하고 부차적인 것은 제외한다. 알고리즘: 이렇게 정의한 문제를 해결하는 절차이다. (일반화와 모델링은 여기에 포함) 복잡한 문제를 해결하는 것은 어렵지만, 작은 문제를 해결하는 것은 비교적 쉽다. 작은 문제를 해결하다 보면 복잡한 문제를 해결하게 된다. 컴퓨터 공학에서 배우는 알고리즘은 대부분 정형화된 문제에 대해 검증된 해법을 제시하는 과목이다. 현실에서 컴퓨터로 해결하려는 문제는 정형화된 문제가 아니라 비정형화된 문제가 더 많다. 그래서 비정형화된 문제를 컴퓨터로 해결하는 과정. 즉, 문제를 이해하고 분해, 패턴 인식, 추상화, 알고리즘 작성까지..
// 예를 들어 int타입의 최대 값을 구하고 싶다면 헤더 파일을 포함시킨 후 // numeric_limits::max() 처럼 호출하면 된다. #include #include #include using namespace std; template void ShowRange(const char* typeName) { cout
STL은 이름 그대로 템플릿을 사용해서 만들어진 라이브러리다. STL은 일반적으로 많이 사용하는 클래스와 함수들이 만들어져 있는데, 예를 들어 링크드 리스트 클래스, 동적 배열 클래스, 정렬 함수, 검색 함수 등과 같이 범용적인 클래스와 함수들이 있다. 또한 이런 클래스와 함수들은 템플릿으로 만들어져 있기 때문에 확장이 용이하다. STL은 사용함으로써 얻을 수 있는 장점들이 있다. 첫번째, STL은 표준이다. 이는 지구 반대편에 있는 개발자도 나와 똑같은 클래스와 함수를 사용한다는 것을 의미한다. 때문에 상대방이 작성해놓은 코드를 쉽게 알아볼 수 있다. 두번째, STL은 전문가들이 만들어 놓은 것이기 때문에 직접 만든 것보다 효율적이고 안전하다. 물론 엄청난 실력자라 STL에 있는 것보다 훌륭하게 만들 ..
C++의 코딩 표준에 대해 알아보자. https://docs.popekim.com/ko/coding-standards/cpp C++ 코딩 표준 | 포프의 문서창고 제대로 대우받는 개발자 | 부족한 컴공지식 배우기 | MIT급 컴공인강 최저임금으로 고통받는 일회성 프로그래머는 그만! POCU 아카데미가 올해 연봉협상을 책임지겠습니다! docs.popekim.com
템플릿은 C++에서 없어서는 안될 아주 중요한 기능인데 템플릿을 사용하면 컴파일러가 개발자를 대신해서 클래스나 함수를 만들어내게 할 수 있다. 그리고 C++에는 이러한 템플릿을 사용해서 만들어진 다양한 클래스와 함수들을 STL이라는 이름으로 제공하고 있다. 왜 템플릿을 사용해야 할까? 템플릿은 C++에서 가장 눈에 띄는 기능이라고 할 수 있다. C++의 다른 기능들은 Java와 C# 같은 객체지향 언어에서도 대부분 지원하는 것들이지만 템플릿 만큼은 C++이 아니면 찾아볼 수 없는 독특한 기능이기 때문이다. 템플릿은 함수를 자동으로 생성하는 것에 더해서 클래스까지 자동으로 생성해줄 수 있다. 그리고 이 두 가지를 구분하기 위해서 템플릿 클래스, 템플릿 함수 등으로 나누어 부르게 된다. 템플릿 클래스 #in..
C++ 개발자가 선호하는 11가지 라이브러리를 소개한다. 1. 액티브 템플릿 라이브러리 (Active Template Library, ATL) 액티브 템플릿 라이브러리(Active Template Library, ATL)는 COM(구성 요소 개체 모델) 개체를 만들 수 있는 템플릿 기반 C++ 클래스의 세트이다. https://learn.microsoft.com/ko-kr/cpp/atl/active-template-library-atl-concepts?view=msvc-170 ATL(액티브 템플릿 라이브러리) 개념 자세한 정보: ATL(활성 템플릿 라이브러리) 개념 learn.microsoft.com 2. 아시오 C++ 라이브러리 (Asio) asio는 네트워크 프로그래밍을 위한 C++ 라이브러리다. 오..