본문 바로가기

프로그래밍226

C++ ] 예외처리 try-catch C++에서 try-catch 문은 예외가 발생할 수 있는 코드 블록을 감싸고, 발생한 예외를 적절하게 처리하는 메커니즘을 제공한다. try-catch 기본 구문 try { // 예외가 발생할 수 있는 코드 } catch (예외_유형1& e) { // 예외_유형1에 해당하는 예외 처리 } catch (예외_유형2& e) { // 예외_유형2에 해당하는 예외 처리 } catch (...) { // 기타 모든 예외를 처리하는 블록 } try 블록: 예외가 발생할 수 있는 코드를 포함하는 블록. 이 블록 내에서 예외가 발생하면 예외를 던진다. catch 블록: 발생한 예외를 처리하기 위한 블록. catch 블록은 발생한 예외의 유형에 따라 여러 개를 사용할 수 있다. 가장 specific한 예외 유형부터 순서대.. 2023. 5. 28.
C++ ] filesystem 라이브러리 filesystem 라이브러리는 파일 및 디렉토리 작업을 단순화하고 일반화하는 기능을 제공한다. C++ 17 표준 부터 포함되었으며, gcc/g++ 8 이상 최신 컴파일러에서 지원된다. experimental/filesystem 헤더를 포함하면 이전 버전에서 사용할 수 있을 수도 있다. 📂 현재 경로 출력 #include #include using namespace std; namespace fs = filesystem; int main() { fs::path currentPath = fs::current_path(); cout 2023. 5. 28.
C#, WinForms ] 자식 폼에서 부모 폼으로 데이터 전달 방법, 이벤트 / 프로퍼티 자식폼에서 dataGridView의 selectedIndex 전달 받기 1. 이벤트 활용 방법 자식폼 public partial class DeviceListForm : Form { // ... public event EventHandler OnItemSelected; // OK 버튼 클릭 시 private void buttonOk_Click(object sender, EventArgs e) { if(deviceList.SelectedIndex != -1) { OnItemSelected?.Invoke(this, deviceList.SelectedIndex); } } // ListBox 더블클릭 시 private void deviceList_MouseDoubleClick(object sender, Mous.. 2023. 5. 14.
WinForms ] Anchor, Dock properties Anchor 속성의 default 값은 Top, Left인데 이 값을 변경하면 bold 체로 바뀐다. Anchor 속성 미사용시 Anchor 속성 사용 Dock 속성 default 값은 None이다. toolStrip은 top에 dock하고 statusStrip은 bottom에 dock할 수 있다. 여러 컨트롤을 같은 방향에 dock할 수 있고 어떤걸 먼저 dock하느냐에 따라 화면에 표시되는게 달라진다. textBox의 multiLine 속성을 true로하고 dock 속성을 fill로 하면 마치 메모장같은 GUI를 볼 수 있다. splitContainer를 먼저 만들고 그 안에서 컨트롤을 dock하는 것도 가능하다. 2023. 5. 14.
C#, WinForms ] Event 와 delegate C#에서 이벤트를 사용하면 프로그램의 느슨한 결합(loose coupling)을 통해 객체 간 상호작용을 구현할 수 있다. 이벤트는 객체가 발생시키는 특정한 동작을 나타내며, 이벤트를 구독하는 다른 객체는 해당 이벤트를 수신하고 이벤트 처리기를 호출한다. 이를 통해 클래스 내부에서 발생한 동작을 외부에서 알림으로써 더욱 유연하고 효율적인 프로그래밍을 구현할 수 있다. 이벤트를 발생시키는 쪽이 Publisher이고 이벤트를 수신하고 처리하는 쪽이 Subscriber가 된다. 1. delegate 정의 및 이벤트 선언하기 Publisher 쪽에서 메서드를 참조하는 형식인 delegate를 사용하여 이벤트를 선언하면 된다. 직접 delegate 정의를 할 수도 있고 system namespace에 이미 정의된.. 2023. 5. 14.
C++ ] JSON 데이터 포맷, rapidjson 라이브러리 사용해 파싱 HTML 삽입 미리보기할 수 없는 소스 JSON(JavaScript Object Notation) 은 데이터 교환을 위한 경량화된 포맷으로, 객체와 배열 등의 데이터 구조를 표현한다. 객체는 중괄호 {} 로 감싸진 key-value 쌍들의 집합이며, 각각의 key는 문자열이고, value는 JSON에서 허용되는 모든 데이터 타입으로 표현될 수 있다. 배열은 대괄호 [] 로 감싸진 값들의 리스트이며, 역시 값은 JSON에서 허용되는 모든 데이터 타입으로 표현될 수 있다. JSON에서 객체의 속성들과 배열의 원소들은 콤마 , 로 구문하며 배열과 객체는 함께 사용할 수 있다. 객체는 배열의 요소로 포함될 수 있는데, 이 경우, 객체는 배열의 요소가 된다. 또한, 객체 안에 배열이 포함될 수 있으며. 이 경우,.. 2023. 5. 14.
C#, WinForms ] CRC Checker private void button1_Click(object sender, EventArgs e) { // 초기 디렉토리 설정 openFileDialog1.InitialDirectory = "C:\\"; // 파일 필터 설정 openFileDialog1.Filter = "모든 파일 (*.*)|*.*|텍스트 파일 (*.txt)|*.txt|바이너리 파일 (*.bin)|*.bin|데이터 파일 (*.dat)|*.dat"; // 마지막으로 파일 대화 상자에서 선택한 디렉토리를 기억하고, 다음번 파일 대화 상자를 열 때에는 이전에 선택한 디렉토리를 자동으로 선택 openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogRes.. 2023. 5. 14.
C#, WinForms ] Drag & Drop 으로 파일 경로 얻기 파일 시스템에 액세스하기위해 using System.IO; 선언 Form의 AllowDrop 속성 true 일반적으로 Form이나 Control에는 파일을 Drop할 수 없기 때문에, 해당 Form이나 Control에 AllowDrop 속성을 true로 설정해주어야 한다. this.AllowDrop = true; DragEnter, DragDrop 이벤트 핸들러 추가 this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop); this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter); DragEnter 이벤트 : 사용자가 무언인가를 .. 2023. 5. 14.
C# ] delegate C#의 delegate는 메서드를 참조하는 객체로 C/C++의 함수포인터와 비슷한 개념이다. C#의 메서드포인터라고 보면 된다. 이 Delegate는 이벤트 핸들러나 콜백 함수를 구현하거나, 대리자 메서드를 호출하는 등 용도로 사용할 수 있다. using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.Perform(); } } class MyClass { // 1. delegate 선언 private delegate void printInt2Consol(int i); public void Perform() { // 2. delegate 인스턴스 생성... 2023. 5. 14.
C++ ] stream 상속관계 ios_base : 다른 입출력 클래스들의 기반이 되는 클래스로서, 입출력 스트림의 상태와 플래그를 관리 ios : ios_base 클래스를 상속하며, 입출력 스트림의 상태와 플래그를 조작할 수 있는 멤버 함수를 제공 istream : 입력 스트림을 다루는 클래스. 콘솔 입력 및 파일 읽기 등을 다룰 수 있다. ostream : 출력 스트림을 다루는 클래스. 콘솔 출력 및 파일 쓰기 등을 다룰 수 있다. fstream : 파일 입출력을 다루는 클래스. 파일의 읽기 및 쓰기를 다룰 수 있다. stringstream : 메모리상에서 문자열을 읽고 쓰기 위한 클래스. std::string과 유사한 인터페이스를 제공하며, 문자열을 파싱하거나 변환하기 위한 용도로 사용된다. ifstream : 파일 입력에 특화된.. 2023. 5. 14.
C#, WinForms ] 폼 시작시, 종료시 이벤트 호출 순서 HTML 삽입 미리보기할 수 없는 소스 폼이 Show() 메소드로 호출되면 다음과 같은 순서로 이벤트가 발생한다. 1. 폼의 생성자(Constructor)가 호출된다. 2. 폼의 Load 이벤트(이벤트 핸들러)가 발생한다. 3. 폼의 Shown 이벤트(이벤트 핸들러)가 발생한다. 생성자는 Form 객체를 생성할 때 호출되며, Load 이벤트는 Form이 로드될 때 발생하고, Shown 이벤트는 폼이 처음 화면에 표시될 때 발생한다. 폼 Load 이벤트 호출 시점에는 폼과 관련된 컨트롤들이 메모리에 로드되고 초기화되지만, 아직 폼이 화면에 보이지는 않는 상태이다. 따라서 이 때 폼의 크기나 위치를 변경하거나, 다른 컨트롤의 위치나 크기를 폼에 맞게 조정할 수 있다. 또한 Form이 화면에 나타나기 전이므로.. 2023. 5. 14.
C#, WinForms ] program.cs C# 프로그램 진입점 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Appname1 { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } using 문을 .. 2023. 5. 14.
Winforms ] ToopStrip, MenuStrip 속성 ToolStrip 화살표클릭 - Dock 을 통해 ToolStrip의 위치를 정할 수 있으며 ToolStrip size는 Form의 size에 맞게 자동 조정된다. 그리고 아래 버튼을 클릭해 다양한 컨트롤을 ToolStrip 안에 추가할 수 있다. ToolStrip 을 선택하며 속성을 변경할 수 있고, ToolStrip 내의 컨트롤을 클릭하여 각자 속성을 변경할 수도 있다. ToolStrip 내의 컨트롤을 우클릭하여 주요 속성을 변경할 수도 있는데 ToolStripButton 의 경우 DisplayStyle 을 Text/Image/ImageAndText 중에서 선택할 수 있다. AutoSize 를 False로 하면 ToolStrip의 크기를 임의로 조절할 수 있다. 우클릭 - 이미지 설정 또는 속성의 I.. 2023. 5. 14.
C# ] namespace 네임스페이스(namespace)는 C#에서 클래스, 구조체, 인터페이스 등을 그룹화하는 데 사용되며, 각 그룹에 대한 유일한 식별자 역할을 한다. 네임스페이스를 사용하면 다른 네임스페이스에선 동일한 이름의 클래스 등을 정의할 수 있어 클래스 이름이나 함수 이름 등이 충돌하는 것을 방지할 수 있으며, 클래스나 함수 등을 논리적으로 그룹화하여 코드의 가독성을 높일 수 있다. C#에서는 기본적으로 System이라는 네임스페이스가 제공되는데 이 네임스페이스에는 C#에서 기본으로 제공되는 클래스들이 포함되어 있다. 또한, 사용자가 직접 네임스페이스를 정의하여 사용할 수 있다. namespace MyNamespace { // 클래스, 구조체, 인터페이스 등의 정의 } 같은 네임스페이스 안에 있는 클래스들은 서로를 .. 2023. 5. 14.
C# ] NuGet 패키지 관리자 사용하여 프로젝트에 패키지 추가 C#에서 라이브러리를 추가하는 방법은 크게 두 가지가 있다. 1. NuGet 패키지 관리자를 사용하는 방법 : NuGet은 오픈 소스 라이브러리 패키지 관리 도구로, 이걸 사용하면 Visual Studio에서 간편하게 패키지를 검색하고 설치할 수 있다. NuGet을 통해 패키지를 설치하면 해당 패키지가 포함하는 라이브러리 파일들이 프로젝트에 자동으로 추가된다. 2. 프로젝트 참조를 사용하는 방법 : 프로젝트 참조를 사용하는 방법에는 두 가지가 있다. 2-1. DLL 추가 : DLL을 추가하는 방법은 프로젝트에서 외부 라이브러리를 사용하려는 경우에 사용된다. 추가할 DLL 파일을 프로젝트의 참조에 추가하면 해당 DLL에 있는 모든 클래스, 인터페이스, 메서드 등을 사용할 수 있다. - 프로젝트를 우클릭하고.. 2023. 5. 14.
WinForms ] 콘솔창 출력 솔루션 우클릭 Properties - Application 탭 - Output type : Console Application 선택 이제 Console.WriteLine();으로 출력할 수 있다. 2023. 5. 14.
[C#] 현재 .NET SDK에서는 .NET 6.0을(를) 대상으로 하는 것을 지원하지 않습니다. .NET SDK 버전 확인 dotnet --list-sdks Visual Studio 2022는 .NET Core 6.0을 기본적으로 지원하며, .NET 6 SDK도 함께 제공하니 Visual Studio 2022를 사용하면 된다. 2023. 5. 14.
C언어 ] setjmp(), longjmp() setjmp()와 longjmp()함수를 사용하기 위해서는 먼저 setjmp.h를 포함해야한다. #include 쉽게 생각하면 setjmp()는 시스템 복원 지점을 만들고, longjmp()는 시스템 복원을 하는 것과 같다. setjmp() int setjmp(jmp_buf env); setjmp() 함수는 현재의 위치(스택 환경)을 저장하고, 나중에 longjmp() 함수를 호출되었을 때 그 위치로 다시 돌아가는 데 사용된다. longjmp() void longjmp(jmp_buf env, int val); longjmp() 함수는 setjmp() 함수를 통해 저장된 위치로(스택환경으로) 프로그램 실행을 이동(복원)하는 데 사용된다. longjmp() 함수가 호출되면 setjmp() 함수 호출 이후에 .. 2023. 5. 7.
C언어 ] 맵 자료구조 구현 map 생성시 사이즈를 직접 결정할 수 있도록 해보았다. 근데 링버퍼처럼 범용적으로 쓸 거 같진 않아서 사실 고정길이배열로 mapManger 구조체안에 둬도 될 것 같다. map.h #include "main.h" #define MAP_MAX_KEY_LEN20 // 맵 자료구조 typedef struct { char key[MAP_MAX_KEY_LEN+1]; uint32_t value; } map_t; // 맵 자료구조 관리 구조체 typedef struct { map_t* maps; uint32_t currentSize; uint32_t maxSize; } mapManager_t; void map_create(mapManager_t* mapManager, map_t* maps, uint32_t maxS.. 2023. 5. 7.
WinForms ] ImageList와 ColorDepth 속성 ImageList는 이미지를 저장하고 관리하는 데 사용되는 컨트롤인데, ImageList를 사용하면 다른 컨트롤에서 이미지를 쉽게 가져올 수 있으며, 동일한 이미지를 여러 컨트롤에서 사용할 수 있다. 도구상자에서 imageList를 추가하면 하단에 imageList가 나타난다. 우클릭 - 이미지 선택 아래 이미지 컬렉션 편집기에서 imageList의 멤버를 추가할 수있다. 0번 인덱스부터 추가되며 순서 변경이 가능하다. 이렇게 추가된 이미지 리스트를 Button, CheckBox, ComboBox, Label, ListBox, ListView, MenuStrip, PictureBox, RadioButton, TabControl, ToolBar 컨트롤 등 다양한 컨트롤에서 불러다 쓸 수 있다. 사용시 주의.. 2023. 5. 7.
JDK (Java Development Kit) 설치 1. 오라클 사이트에서 윈도우용 JDK를 다운받는다. https://www.oracle.com/java/technologies/downloads/#jdk20-windows 2. 실행해 기본경로로 설치하고 경로를 기억해두자. 3. 시스템 환경 변수 편집 변수 이름 : JAVA_HOME 변수 값 : C:\Program Files\Java\jdk-20 (설치경로) 변수 이름 : CLASSPATH 변수 값 : %JAVA_HOME%\lib 변수 이름 Path에 아래와 같이 추가 %JAVA_HOME%\bin 4. CMD창에서 java --version 명령어를 치고 잘 설치되었는지 확인한다. 2023. 4. 13.
C#, WinForms ] decimal to hex / hex to decimal converter 깃허브 주소 : https://github.com/joeteo/num2hex GitHub - joeteo/num2hex Contribute to joeteo/num2hex development by creating an account on GitHub. github.com 프로그램만 다운받기 : 먼저 디자이너에 대해 얘기해보면 comboBox는 사용자가 입력할 수 없게 DropDownStyle을 DropDownList로 만들었다. 그리고 콤보박스에서 선택된 항목이 변경되었을 때 호출되는 SelectedIndexChanged 이벤트 핸들러를 추가했다. 참고로 index는 처음 아무것도 선택하지 않았을 땐 -1이고 첫번째 아이템부터 인덱스 0으로 시작한다. 정수형 데이터 타입 선택 시 옆에 range를 보여.. 2023. 4. 12.
C ] float to hex / hex to float Converter 2023.04.09 - [프로그래밍/C# (WinForms)] - C#, WinForms ] float to hex / hex to float Converter C#, WinForms ] float to hex / hex to float Converter 필요에 의해서 만들었다. 내가 예전에 소개한 float to hex converter 사이트랑 달리 시스템 아키텍쳐에 따라 메모리에 저장된 대로 보여준다. 디자이너 부분을 먼저 살펴보면 Form은 사용자가 크기를 eteo.tistory.com 위 글에서 WinForms로 만든 float to hex / hex to float Converter를 C언어로 간단히 구현해 본 것. 예외처리나 옵션 없이 리틀엔디안으로 변환하는 기능만 넣었다. #include .. 2023. 4. 9.
C#, WinForms ] float to hex / hex to float Converter 엔디안을 선택하면 시스템 아키텍쳐에 따라 메모리에 저장된 대로 보여주고, Hex값은 0x 접두사를 붙이거나 혹은 공백 구분자를 두거나 선택할 수 있게했다. 디자이너 부분을 먼저 살펴보면 Form은 사용자가 크기를 변경할 수 없도록 FormBorderStyle을 FixedSingle로 하고 Form에 있는 Font들이 다 상속받을 수 있도록 기본 Font를 설정한다. 라디오버튼과 변환 부분은 panel을 사용해 구분 짓고, 변환 후 결과를 보여주는 textBox는 사용자가 copy만 할 수 있게 ReadOnly 속성을 true로 하였다. this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Font = new System.. 2023. 4. 9.
C#, LINQ ] Enumerable 클래스, Range(), Select(), Where(), ToArray() 메서드 LINQ LINQ(Language Integrated Query)는 .NET Framework에서 데이터 쿼리를 지원하기 위해 도입된 기술로, C# 및 VB.NET에서 사용할 수 있는 쿼리 언어이다. SQL과 유사한 쿼리 구문을 사용하여 데이터를 검색, 정렬, 필터링, 그룹화 및 조작할 수 있으며, System.Linq 네임스페이스에 속하는 다양한 클래스와 메서드를 제공한다. 이 네임스페이스에는 Enumerable, Queryable, Grouping, Lookup, OrderedEnumerable 등의 클래스가 포함되어 있고, Enumerable 클래스는 LINQ to Objects를 위한 확장 메서드를 제공하며, Queryable 클래스는 LINQ to SQL, LINQ to Entities, LIN.. 2023. 4. 9.
WinForms ] Label vs TextBox 컨트롤 결론 : 사용자가 편집할 수 있게끔 하려면 TextBox, 아닌 경우 Label 사용 추천 There are a few pro's and con's to both. Label Pro's: Text is not copy able Cursor does not change Sets size based on text (if autosize is on, I think its on by default) Option to align text to the right (autosize off) Con's: Text is not selectable/copy able Text might outgrow form/parent with autosize TextBox Pro's: Text is copy able Fixed size.. 2023. 4. 9.
C ] 시간복잡도가 O(1)인 2의 거듭제곱 판별 int isPowerOfTwo(int n) { return (n && ((n & (n - 1)) == 0)); } 2의 거듭제곱은 가장 왼쪽에 있는 1을 제외하고 뒷부분이 전부 0이라는 걸 고려할 때 위와 같은 코드로 판별할 수 있다. 그리고 어떤 정수를 2의 거듭제곱 수로 나눈 나머지 연산을 해야할 때 성능향상을 위한 최적화 기법으로 %연산이 아니라 &연산을 쓰기도 한다. 위와 같은 논리이다. #define SOME_NUMBER_POWER_OF_TWO8 int getRemainder(int n) { return n & (SOME_NUMBER_POWER_OF_TWO - 1); } 2023. 3. 31.
C++ ] accumulate 함수 사용시 주의사항 헤더 #include accumulate 함수를 사용하기 위해선 numeric 헤더를 포함한다. 함수 원형 template T accumulate(InputIt first, InputIt last, T init); 구간 [first, last)에 속한 요소들의 합을 구한다. init으로 누적값을 초기화하고, 구간 내의 모든 요소들을 차례대로 더해서 누적값을 반환한다. ❗ 주의할 것은 인자인 first Iterator는 이상이고, last Iterator 미만이다. 때문에 last에는 합을 마지막 요소의 다음 위치를 가르키는 iterator가 온다. vector의 끝까지 연산하는 경우는 vec.end()가 온다. 사용 예시 벡터 내의 모든 요소의 합을 계산한다. #include #include #inclu.. 2023. 3. 31.
Python ] struct 모듈 This module converts between Python values and C structs represented as Python bytes objects. Compact format strings describe the intended conversions to/from Python values. The module’s functions and objects can be used for two largely distinct applications, data exchange with external sources (files or network connections), or data transfer between the Python application and the C layer. Funct.. 2023. 3. 31.
C++ ] 2차원 vector 사용법 1. 생성 및 요소 접근 2차원 벡터는 vector 형태로 생성할 때, 첫 번째 인자에 행의 개수를 넣고, 두 번째 인자에는 열의 개수를 넣는다. 또한, 세 번째 인자로는 2차원 벡터의 모든 요소를 초기화할 수 있는 값을 넣는다. 예를 들어, 위의 코드에서는 0으로 모두 초기화한다. 이렇게 생성한 2차원 벡터는 matrix[i][j]와 같이 2개의 인덱스로 요소에 접근할 수 있다. #include #include using namespace std; int main() { vector matrix(3, vector(3, 0)); matrix[0][0] = 1; matrix[1][1] = 2; matrix[2][2] = 3; for(int i=0; i 2023. 3. 31.