Language 28

[C++] 싱글톤 패턴 (1) with C++

Singleton Pattern 개요 프로젝트 진행 중, 특정 클래스가 실행 동안 한 번만 초기화되어야 하는 상황이 발생할 때가 있다. 예를 들어, MySQL과의 연결을 관리하는 클래스는 여러 번 생성될 경우 메모리와 같은 자원의 낭비가 초래될 수 있으며, 데이터 일관성 또한 손상될 가능성이 있다. 다수의 프로그래밍 언어에서는 이와 같은 상황을 대비하여 싱글톤 패턴(Singleton Pattern)을 도입하였다. 이 패턴의 핵심은 애플리케이션 내에서 해당 클래스의 인스턴스가 유일하게 하나만 존재하도록 보장하는 것이다. 이를 통해 앞서 언급된 문제점을 해결할 수 있으며, 전역적으로 참조 가능한 액세스 포인트를 제공하여 다른 객체들이 이를 쉽게 활용할 수 있게 된다. 그러나, 이 패턴의 도입은 전역 상태를 ..

Language/C++ 2023.08.09

[C++] 배열 내의 원소 위치 찾기 with C++

배열 내의 원소 위치 찾기 개요 이번 글에서는 C++로 구현할 수 있는 배열 내의 원소 위치 찾는 방법들에 대해 알아보겠다. 먼저, 가장 기본적인 방식인 순차적인 탐색으로 원소를 비교하는 방법을 살펴본다. 그다음으로는 표준 라이브러리에서 제공하는 std::find와 std::distance 함수를 활용하는 방법을 공부해 보자. 각 방법의 특성을 분석하고, 특정 상황에서 어떤 방법이 최적인지에 대해 이해하도록 하겠다. 본문 먼저 일반적으로 배열에서 원소의 위치를 찾기 위해 for문과 if문을 활용한 방법이다. #include #include using namespace std; int main() { vector v = { 1,2,3,4,5,6,7 }; int target = 5; for (int i = ..

Language/C++ 2023.08.07

[C++] 정규 표현식 with C++

regex 개요 정규 표현식(Regualar Expreesion)은 문자열을 검색하거나 대체하는 데 사용되는 패턴이다. 이 패턴은 고정된 문자열이 될 수도 있고, 복잡한 문자열 패턴을 설명하는 규칙이 될 수도 있다. 이러한 표현식은 다양한 프로그래밍 언어에서 사용되며, C++에서는 regex 라이브러리를 사용하여 정규 표현식을 처리할 수 있다. 정규 표현식은 다음과 같은 경우에 유용하다. 특정 패턴을 가진 문자열을 찾을 때 문자열을 분리하거나 대체할 때 데이터 유효성 검사 이번 시간에는 regex 라이브러리를 활용해서 문자열을 분석하고 조작하는 다양한 방법들에 대해 알아보자. 본문 먼저 정규 표현식에 나오는 문법들에 대해 간단하게 알아보자. 여기서는 일반적으로 사용되는 몇 가지 기본적인 문법에 대해서만 ..

Language/C++ 2023.08.06

[C++] sort vs stable_sort with C++

sort vs stable_sort 개요 데이터를 정렬할 때 동일한 값들이 존재하는 경우가 발생할 수 있다. 이때, 우리가 사용하는 일반적인 정렬 알고리즘은 동일한 값들의 순서를 보장하지 않아서, 정렬 후의 순서가 원래의 순서와 다를 수 있다. 예를 들어, 이름으로 사람들을 정렬한 후, 나이로 다시 정렬하면 나이가 같은 사람들의 상대적인 순서가 정렬된 후에 변경될 수 있다. 본문 C++ 표준 라이브러리에는 정렬 함수로서 std::sort()와 std::stable_sort()가 존재한다. 이 두 함수는 기본적으로 배열 또는 벡터의 시작과 끝 위치를 인자로 받으며, 선택적으로 비교 함수를 추가하여 사용할 수 있다. 둘 모두 시간 복잡도는 평균적으로 O(n log n)으로, 대략적으로 n log n 번의 비..

Language/C++ 2023.08.05

[C++] 문자열 변환 - 대문자/소문자 변환

문자열 변환 개요 문자열을 대문자/소문자로 변환하는 것은 사용자의 입력을 정규화하거나, 문자열을 비교하기 위해 종종 사용된다. 사용자로부터 받은 입력은 대소문자가 섞여 있거나, 불규칙한 형태로 들어올 수 있다. 이렇게 다양한 형태로 들어온 데이터를 일관된 형식으로 변환하는 것을 정규화라고 하는데, 대문자나 소문자로 변환하는 것은 이런 정규화 작업의 일부로, 이를 통해 데이터를 일관되게 다룰 수 있게 된다. 또한 대소문자를 구분하지 않은 문자열 비교를 수행할 때, 모두 대문자나 소문자로 변환하여 비교하는 것은 편리한 작업이다. 예를 들어, 사용자 이름이나 이메일 주소를 비교할 때, 대소문자를 구분하지 않도록 모두 같은 형식으로 변환한 후에 비교를 수행하면 오류를 줄일 수 있다. 이번 시간에는 이러한 방법들..

Language/C++ 2023.07.31

[Python] 클립 보드 with Python

클립 보드 개요 클립 보드 기능은 우리가 효율적으로 데이터를 관리하고 사용할 수 있게 한다. 우리는 일반적으로 텍스트를 복사하거나 붙여 넣을 때 이 클립 보드를 사용하지만, 이보다 더 다양한 활용법이 존재한다. 지난 게시글에서 클립 보드에 저장된 이미지를 특정 하위 디렉토리에 png 형식의 파일로 저장하는 방법에 대해 간략하게 소개하였다. 이번 글에서는 ImageGrab에 대해 좀 더 자세히 탐구하고, 클립 보드를 통한 이미지 관리법에 대해 알아보자. 본문 이 코드는 사용자가 클립 보드에 이미지 파일을 저장한 경우, 해당 이미지를 example.png라는 파일로 저장하는 프로그램이다. 이를 위해선 PIL(Python Imaging Library)이라는 라이브러리를 활용한다. PIL은 파이썬에서 이미지 처..

Language/Python 2023.07.29

[C++] Python 연동 with VS code

C++ Python 연동 개요 간단한 토이 프로젝트를 작업하던 도중, 클립보드를 캡처하는 기능이 필요해졌다. C++로 이를 구현하려고 하니, 윈도 API를 이용하면 가능하다는 걸 알았다. 하지만 이 방법에는 다른 OS와의 호환성이 떨어질 수도 있다는 문제점이 있다. 이에 대한 방안을 찾던 중, 파이썬에서는 이를 쉽게 구현할 수 있다는 걸 알게 되었다. 이번 시간에는 파이썬에서 작성한 코드를 C++에서 호출하는 기능을 알아보도록 하겠다. Python 3.11.4 버전을 쓰고 있으며, visual studio는 2022 버전을 사용하고 있다. 또한, 이를 통해 C++과 파이썬 사이의 간접적인 연동 방법을 알아보겠다. 이런 방법은 프로그래밍 언어 간의 장벽을 넘어, 더 효과적이고 확장 가능한 솔루션을 만들 수..

Language/C++ 2023.07.18

[C++] 진수 변환

진수 변환 개요 프로그래밍에는 여러 가지 다양한 알고리즘이 존재하며, 그중 십진수를 이진수로 바꾸는 알고리즘은 매우 중요한 개념이다. 이진수 변환은 많은 프로그래밍 문제에서 요구되는 기술로서, 백준 1094 막대기 문제나 프로그래머스의 다음 큰 숫자 문제와 같이 이진수에 관한 연산이 필요한 경우가 대표적이다. 이 게시글에서는 C++을 사용하여 십진수를 이진수로 변환하는 방법을 자세히 알아보도록 하겠다. 원리 일반적으로 10진수를 2진수로 변환하는 과정은 다음과 같다. 십진수 n을 2로 나눈 나머지를 구하고, 이 값은 이진수의 가장 낮은 자릿수가 된다. n을 2로 나눈 몫을 새로운 n으로 설정한다. n이 0이 될 때까지 이 과정을 반복한다. 이 원리는 이진수가 2의 지수 형태로 표현되는 것에서 기인한다. ..

Language/C++ 2023.07.06