일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++
- gitlab
- 플러터
- docker
- 구조체
- git
- c#
- dart 언어
- Algorithm
- jupyter
- C# delegate
- C언어 포인터
- 도커
- github
- 깃
- c언어
- Flutter
- c# 윈폼
- Unity
- Data Structure
- Houdini
- HTML
- jupyter lab
- 포인터
- c# winform
- c# 추상 클래스
- Python
- vim
- 유니티
- 다트 언어
- Today
- Total
목록Programming (313)
nomad-programmer
프로그래밍은 예측불허의 여정이다. 코드가 실행되는 동안 예외 상황은 피할 수 없고, 심지어 예외 처리 메커니즘도 때로는 예외를 처리하지 못할 수 있다. noexcept와 set_terminate를 활용해 예외 처리와 예외 처리 실패에 대응하고 프로그램의 안정성과 신뢰성을 높이는 방법을 알아보자.예외 처리 생략 - noexcept함수에서 문제가 발생할 때 반드시 예외를 발생시켜야 하는 것은 아니다. 때로는 예외를 발생시키는 것이 득보다 실이 더 클 때도 있다.오류와 예외는 엄연히 다르다. 값이나 실행 흐름을 충분히 예측할 수 있을 때는 if문으로 처리하는 것이 성능 면에서 훨씬 이득이다.함수가 예외를 던지지 않음을 나타낼 때는 다음처럼 noexcept 키워드로 명시할 수 있다. 이처럼 함수가 예외를 던지지..
기본으로 제공되는 리터럴 외에 개발자가 리터럴을 직접 정의할 수도 있다. 리터럴을 나타내는 접미사를 함수 이름으로 만들면 되는데, 다음처럼 사용자 정의 리터럴 연산자 operator"" 를 사용한다.반환_타입 operator"" 러터럴_접미사(매개변수) 이렇게 하면 해당 접미사를 붙인 값은 사용자가 정의한 값으로 바꿔서 사용할 수 있다. 다음 코드는 마일(mile)과 킬로미터(kilometers) 단위를 리터럴로 정의한 예이다.#include using namespace std;const long double km_per_mile = 1.609344L;long double operator"" _km(const long double val){ return val;}long double operato..
PyPI(Python Package Index)는 파이썬 프로그래밍 언어를 위한 소프트웨어 패키지 저장소이다.PyPI는 파이썬 개발자들이 작성한 다양한 패키지와 라이브러리를 공유하고, 이를 다른 개발자들이 쉽게 설치하고 사용할 수 있도록 돕는 역할을 한다.PyPI에서 제공하는 패키지들은 pip 라는 패키지 관리 도구를 통해 간편하게 설치할 수 있다. 예를 들어, PyPI에서 제공되는 특정 패키지를 설치하고 싶다면 터미널에서 다음과 같은 명렁어를 입력한다.pip install 이렇게 하면 해당 패키지가 PyPI에서 다운로드되어 사용자의 로컬 환경에 설치된다. PyPI는 파이썬 개발자들 사이에서 매우 중요한 역할을 하며, 오픈 소스 커뮤니티의 성장과 발전을 촉진하는 데 기여하고 있다.https://pypi...
vcpkg는 Microsoft 및 C++ 커뮤니티에서 유지 및 관리하는 무료 오픈 소스 C/C++ 패키지 관리자이다. 2016년에 시작된 이 기능은 개발자가 프로젝트를 최신 버전으로 마이그레이션하는 데 도움을 준다. vcpkg는 Windows, MacOS, Linux에서 개발자가 사용하는 플랫폼 간 도구로 발전했다. vcpkg에는 모든 빌드 및 프로젝트 시스템을 지원하여 개발 프로세스를 용이하게 하도록 설계된 오픈 소스 라이브러리 및 엔터프라이즈 지원 기능의 대규모 레지스트리가 있다. vcpkg는 핵심 C++ 도구이며 CMake의 스크립트를 사용하여 C++로 작성된다. C/C++ 개발자 환경의 고유한 문제를 해결하기 위해 처음부터 설계되었다.vcpkg를 사용해야 하는 이유2,200개가 넘는 오픈 소스 라..
Rust 설치는 쉽다. 다음과 같이 명령어 한줄이면 설치가 완료된다.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh위의 명령어를 실행하고 아래와 같이 실행해 보자. 버전 정보가 나온다면 설치가 완료된 것이다.rustc --version참고https://www.rust-lang.org/tools/install Install RustA language empowering everyone to build reliable and efficient software.www.rust-lang.orghttps://rust-kr.org/pages/install/ 한국 러스트 사용자 그룹Rust 설치하기 A. Rustup 사용하기 rustup을 쓰면 윈도우,..
poetry 란?poetry는 python 프로젝트의 의존성을 관리하고, 패키지를 빌드 및 배포할 수 있도록 도와주는 도구이다.poetry는 `pyproject.toml` 파일을 사용하여 프로젝트의 의존성, 패키지 메타데이터, 그리고 빌드 시스템을 정의한다.https://github.com/python-poetry/poetry GitHub - python-poetry/poetry: Python packaging and dependency management made easyPython packaging and dependency management made easy - python-poetry/poetrygithub.compoetry 공식 사이트의 설치https://python-poetry.org/doc..
Ruff는 Rust로 작성된 매우 빠른 린터 및 포매터이다.https://github.com/astral-sh/ruff GitHub - astral-sh/ruff: An extremely fast Python linter and code formatter, written in Rust.An extremely fast Python linter and code formatter, written in Rust. - astral-sh/ruffgithub.compip install ruffRuff와 Black과의 차이점Ruff와 Black은 모두 Python 코드 품질 개선 및 유지보수성을 높이는 도구들이다. 허나 이들의 목적에는 차이가 있다.Ruff (Linter)기능코드 스타일 검사를 통해 PEP8 등 스타일..
프론트엔드 시스템과 백엔드 API 시스템은 일반적으로 HTTP 프로토콜을 기반으로 통신한다. 그러므로 HTTP의 대해서 잘 알아야 한다.HTTP는 HyperText Transfer Protocol의 약자로서, 웹상에서 서로 다른 서버 간에 하이퍼텍스트 문서, 즉 HTML을 서로 주고받을 수 있도록 만들어진 프로토콜 통신 규약이다. 웹상에서 네트워크를 통해 서버 사이에 통신할 때 어떠한 형식으로 서로 통신하자고 규정해 놓은 "통신 형식" 혹은 "통신 구조"라고 보면 된다. 서버 간의 통신에서 서로 이해할 수 있도록 공통의 통신 형식이 필요하다. 이러한 통신 형식을 프로토콜(protocol)이라고 한다.프로토콜 중 가장 널리 사용되는 프로토콜이 바로 HTTP이다.HTTP 통신 방식HTTP 통신 방식에는 2..
// 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..