일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C# delegate
- c# 추상 클래스
- 포인터
- Python
- 다트 언어
- 구조체
- 플러터
- c# 윈폼
- Flutter
- github
- 깃
- Houdini
- gitlab
- jupyter lab
- 도커
- jupyter
- Algorithm
- C언어 포인터
- 유니티
- docker
- dart 언어
- git
- c#
- Data Structure
- C++
- vim
- c# winform
- Unity
- HTML
- c언어
- Today
- Total
목록Programming/C# (94)
nomad-programmer
??= 연산자는 C# 8.0 버전에서 추가된 아주 유용한 연산자 중 하나이다. ??= 연산자는 "null 병합 할당 연산자" 라고 부르며 ??= 연산자는 왼쪽 피연산자가 null로 평가되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산제 대입한다. 왼쪽 피연산자가 null이 아닌것으로 평가되면 ??= 연산자는 오른쪽 피연산자를 평가하지 않는다. ?? 연산자는 "null 병합 연산자" 라고 부르며 null이 아닌 경우 왼쪽 피연산자의 값을 반환한다. 그렇지 않으면 오른쪽 피연산자를 평가하고 그 결과를 반환한다. ?? 연산자는 왼쪽 피연산자가 null 아닌 것으로 평가되면 ?? 연산자는 오픈쪽 피연산자를 평가하지 않는다. if (variable is null) { variable = expression; } ..
CLR은 자동 메모리 관리(Automatic Memory Managment) 기능을 제공한다. 이 자동 메모리 관리 기능의 중심에는 가비지 컬렉션(Garbage Collection)이 있다. 가비지 컬렉션을 우리말로 바꾸면 "쓰레기 수거"라는 뜻으로, 여기에서 말하는 쓰레기란 더 이상 사용하지 않는 객체를 말한다. 가비지 컬렉션은 프로그래머로 하여금 컴퓨터가 무한한 메모리를 갖고 있는 것처럼 간주하고 코드를 작성할 수 있게 한다. C# 프로그래머는 무한한 메모리를 이용해 걱정 없이 코드를 작성하면 되므로 C/C++ 프로그래머들보다 훨씬 덜한 스트레스 속에서 일을 할 수 있게 된다. CLR 안에는 가비지 컬렉션을 담당하는 "가비지 컬렉터(Garbage Collector)"가 있다. 작성한 프로그램이 객체를..
파일 업로드 프로토콜 파일 전송을 위한 프로토콜 FTP(File Transfer Protocol)이 있긴 하지만 직접 프로토콜 설계를 해보자. 그러면 다른 프로토콜을 이해하는 데에도 도움이된다. 설계할 파일 업로드 프로토콜의 이름은 FUP(File Upload Protocol)이라고 해보자. 이 프로토콜은 헤더와 바디의 두 부분으로 나뉜다. 바디에는 실제로 전달하고자 하는 데이터를 담고, 헤더에는 본문 길이를 비롯하여 메시지의 속성 몇 가지를 담을 것이다. 바디의 길이는 담는 데이터에 따라 달라지지만 헤더의 길이는 16바이트로 항상 일정하다. 따라서 수신한 패킷을 분석할 때는 가장 먼저 16바이트를 먼저 확인하여 바디의 길이를 포함한 메시지의 속성을 확인하고, 그 다음 바디의 길이만큼을 또 읽어 하나의 ..
TcpListener와 TcpClient는 .NET 프레임워크가 TCP/IP 통신을 위해 제공하는 클래스이다. 이들 클래스가 속해 있는 System.Net.Sockets 네임스페이스에는 보다 다양한 옵션과 메소드를 제공하는 Socket 클래스도 있지만, 사용이 복잡하다는 단점이 있기 때문에 Socket 클래스 대신 TcpListener와 TcpClient 클래스를 이용한 TCP/IP 프로그래밍을 설명한다. TcpListener 클래스는 서버 애플리케이션에서 사용되며, 클라이언트의 연결 요청을 기다리는 역할을 한다. TcpClient는 서버 애플리케이션과 클라이언트 애플리케이션 양쪽에서 사용된다. 클라이언트에서는 TcpClient가 서버에 연결 요청을 하는 역할을 수행하며, 서버에서는 클라이언트의 요청을 ..
async와 await가 C#에 도입되기 전까지는 백그라운드 작업을 수행하면서도 사용자에게 잘 응답하는 프로그램을 만들기는 쉽기만한 일은 아니었다. async와 await가 도입됨에따라 개발자가 보다 쉽게 응답성이 좋은 프로그램을 만들 수 있게 되었다. Step 1. UI 구성를 구성한다. MainForm 위에 다음과 같이 컨트롤을 배치한다. Step 2. CopySync() & CopyAsync() 메소드 구현한다. 동기 파일 복사를 하는 CopySync()와 비동기 파일 복사를 하는CopyAsync() 코드를 추가해보자. private async Task CopyAsync(string fromPath, string toPath) { btnSyncCopy.Enabled = false; long file..
Form 및 Control 클래스는 응용 프로그램 시작 및 종료와 관련된 메소드를 제공한다. Form의 시작 Windows Forms 응용 프로그램을 시작할 때 기본 폼의 시작 이벤트가 다음과 같은 순서로 발생한다. Form.Load - Form이 로드되어 메모리에 올라올 때, 화면에 표시되기 직전에 발생. - 프로퍼티를 변경한다거나, 리소스를 할당하는등 Form의 동작에 필요한 초기화 수행. - Form의 생애 동안 딱 한번 발생하므로 일회적인 초기화에 적합. - From.Load 이벤트보다 Form 클래스의 생성자가 먼저 호출 된다. Form의 종료 Windows Forms 응용 프로그램이 닫히면 기본 폼의 종료 이벤트가 다음과 같은 순서로 발생한다. Form.Closing - Form이 닫히기 직전..
폼 디자이너를 이용한 WinForm UI 구성 비주얼 스튜디오는 사용하기 쉬우면서 강력한 폼 디자이너를 제공한다. 폼 디자이너는 비주얼 스튜디오 IDE의 일부로, 코드를 통해 컨트롤을 폼 위에 배치하고 프로퍼티를 변경했던 작업을 마우스 클릭만으로 가능하게 해준다. Qt의 Qt Designer 와 같다고 생각하면 된다. 폼 디자이너는 새 프로젝트를 "Windows Form 응용 프로그램" 템플릿을 선택하여 만들면 나타난다. 폼 디자이너는 도구 상자와 함께 사용해야 한다. 이 도구 상자에는 WinForm에서 제공하는 수많은 컨트롤들을 담고 있어서 "컨트롤 팔레트(Control Palette)"라는 이름으로 불리기도 한다. Step 1. GroupBox 컨트롤부터 배치한 뒤 그림에서 보이는 것처럼 컨트롤들을 ..
UI(사용자 인터페이스)는 응용 프로그램과 사용자가 대화를 하는 창구이다. 윈도우 운영체제는 사용자 인터페이스를 위해 메뉴, 콤보박스, 리스트뷰, 버튼, 텍스트박스 등과 같은 표준 컨트롤을 제공한다. .NET 프레임워크의 WinForm은 이들 표준 컨트롤을 아주 간편하게 창 위에 올릴 수 있도록 잘 포장해놨다. 이 컨트롤들을 제어하는 데 필요한 각종 메소드와 프로퍼티, 이벤트들도 잘 정리되어 있다. 컨트롤이란? 컨트롤(Control)이란, 윈도우 운영체제가 제공하는 사용자 인터페이스 요소를 말한다. 응용 프로그램을 제어하는 데 사용하는 도구라는 의미에서 붙여진 이름이다. 버튼, 텍스트박스 등이 컨트롤의 예이다. 유닉스의 모티프나 Java의 Swing같은 것을 GUI 플랫폼에서는 이것을 위젯(Window ..
Form 클래스는 윈도우 모양을 결정짓는 크기, 배경색, 전경색, 투명도, 제목, 폰트 등 여러 가지 프로퍼티를 갖고 있다. 다음 표에는 Form 클래스의 프로퍼티 중 윈도우의 모습을 결정짓는 항목들이 나타나 있다. 종류 프로퍼티 설명 크기 Width 창의 너비를 나타낸다. Height 창의 높이를 나타낸다. 색깔 BackColor 창의 배경 색깔을 나타낸다. BackgroundImage 창의 배경 이미지를 나타낸다. Opacity 창의 투명도를 나타낸다. 스타일 MaximizeBox 최대화 버튼을 설치할 것인지의 여부를 나타낸다. MinimizeBox 최소화 버튼을 설치할 것인지의 여부를 나타낸다. Text 창의 제목을 나타낸다. Width & Height 예제 using System; using Sy..
Form 클래스는 운영체제가 보내는 메시지 중 일부에 대해 이벤트를 구현하고 있다. 가령 사용자가 Form의 인스턴스, 즉 윈도우 위에서 마우스의 왼쪽 버튼을 누르면 WM_LBUTTONDOWN 메시지가 Form 객체로 전달되고, Form 객체는 이에 대해 MouseDown 이벤트를 발생시킨다. Form과 WinForm의 윈도우와 컨트롤 클래스들이 윈도우 메시지를 포장하여 이벤트로 구현해 놓았다. 개발자는 그저 미리 정의되어 있는 이벤트에 이벤트 처리기 메소드를 선언하여 등록해주기만 하면 된다. // 이벤트 처리기 메소드를 선언하고 Form 클래스의 MouseDown 이벤트 등록 class MyForm : Form { // 이벤트 처리기 선언 private void FormMouseDown(object s..
WinForm은 폼 디자이너라는 툴을 제공해서 프로그래머가 그림 그리듯 UI를 만들 수 있게 한다. 이른바 WYSIWYG(What You See Is What You Get) 방식의 개발을 지원하는 것이다. 컨트롤을 윈도우 위에 배치할 때마다 폼 디자이너는 프로그램의 UI를 표시하는 한편, 뒤로는 관련 C# 코드를 자동으로 만들어 준다. 프로퍼티를 변경할 때, 이벤트 처리기를 추가할 때도 자동으로 코드를 수정해준다. C# 코드로 WinForm 윈도우 만들기 Win32 API를 이용하여 윈도우를 만드는 절차 윈도우 클래스를 정의한다(윈도우에 대한 정보를 가지고 있는 구조체). 정의된 윈도우 클래스를 등록한다. 윈도우를 생성한다. 윈도우를 사용자에게 보여준다. 메시지 루프를 돌면서 프로그램을 시작한다. Wi..
Python언어에서의 with문과 똑같은 역할을 한다고 생각하면 된다. using문은 using 블록 내에서 예외가 발생하더라도 Dispose(또는 DisposeAsync)가 호출되도록 한다. try 블록 내부에 개체를 배치한 다음, finally 블록에서 Dispose(또는 DisposeAsync)를 호출해도 동일한 결과를 얻을 수 있다. 실제로 컴파일러는 이 방법으로 using 문을 변환한다. C# 8.0 버전부터 using 문은 IAsyncDisposable 개체의 올바른 사용을 보장한다. using문을 사용하지 않은 코드 예제 using System; using System.IO; namespace CSharpExample { internal class MainApp { static int Mai..
명명 규칙 규칙에 따라 일반적으로 대기 가능한 형식 (예: Task, Task, ValueTask, ValueTask)을 반환하는 메소드에는 "Async"로 끝나는 이름을 사용해야 한다. 비동기 작업을 시작하지만 대기 가능한 형식을 반환하지 않는 메소드는 "Async"로 끝나는 이름을 사용하지 않아야 하지만, "Begin", "Start" 또는 일부 다른 동사로 시작하여 이 메소드가 작업 결과를 반환하거나 예외가 발생하지 않음을 알려야 한다. 여기서 이벤트, 기본 클래스 또는 인터페이스 계약으로 다른 이름을 제안하는 규칙을 무시할 수 있다. 예를 들어, OnButtonClick과 같은 공용 이벤트 처리기의 이름을 변경할 수 없다. 정리하자면, * 반환형이 있는 비동기 메소드의 이름은 접미사로 "Async..
System.Threading.Tasks.Parallel 클래스 이 클래스는 For(), Foreach() 등의 메소드를 제공하여 Task를 이용한 병렬 처리를 더 쉽게 구현할 수 있도록 해준다. void SomeMethod(int i) { Console.WriteLine(i); } // ... Parallel.For(0, 100, SomeMethod); 위 코드에서 Parallel.For() 메소드는 SomeMethod()를 병렬로 호출하면서 0부터 100사이의 정수를 메소드의 매개 변수로 넘긴다. SomeMethod() 메소드를 병렬로 호출할 때 몇 개의 스레드를 사용할지는 Parallel 클래스가 내부적으로 판단하여 최적화한다. 병렬 처리로 소수를 찾는 예제 using System; using Sy..
병렬 처리와 비동기 처리의 차이 병렬 처리와 비동기 처리는 비슷한 용어 같지만 뜻이 엄밀히 다르다. 병렬 처리 : 하나의 작업을 여러 작업자가 나눠서 수행한 뒤 다시 하나의 결과로 만드는 것을 병렬 처리라한다. 비동기 처리 : 작업 A를 시작한 후 A의 결과가 나올 때까지 마냥 대기하는 대신 곧이어 다른 작업 B, C, D, ...를 수행하다가 작업 A가 끝나면 그 때 결과를 받아내는 처리를 말한다. 마이크로소프트는 더 쉽게 비동기 코드를 작성할 수 있도록 하는 도구와 장치를 준비했다. System.Threading.Tasks 네임스페이스의 클래스들과 async 한정자와 await 연산자들이다. .NET 프레임워크 4.0부터 도입된 System.Threading.Tasks 네임스페이스에는 병행성 코드나 ..
저수준 동기화 : Monitor.Wait() 메소드와 Monitor.Pulse() 메소드 lock 키워드 대신 Monitor 클래스를 사용해야 한다면 그건 Enter()와 Exit() 메소드 때문이 아니라 Wait()와 Pulse() 메소드 때문일 것이다. Monitor.Wait() 메소드와 Monitor.Pulse() 메소드는 단순히 lock 키워드만을 사용할 때보다 더 섬세하게 멀티 스레드 간의 동기화를 가능하게 해준다. 이 두 메소드는 반드시 lock 블록 안에서 호출해야 한다. lock을 걸어 놓지 않은 상태에서 이 두 메소드를 호출한다면 CLR이 SynchronizationLockException 예외를 던지기때문이다. Wait() : 스레드를 WaitSleepJoin 상태로 만든다. Pulse..
Monitor 클래스는 스레드 동기화에 사용하는 몇 가지 정적 메소드를 제공한다. Monitor.Enter()와 Monitor.Exit() 메소드다. 이 두 메소드는 lock 키워드와 완전히 똑같은 기능을 한다. Monitor.Enter() 메소드는 크리티컬 섹션을 만든다. Monitor.Exit() 메소드는 크리티컬 섹션을 제거한다. Monitor.Enter() 메소드는 lock 블록의 { (여는 괄호), Monitor.Exit() 메소드는 lock 블록의 } (닫는 괄호) 에 해당한다고 할 수 있다. // lock 키워드 public void Increase() { int loopCount = 1000; while (loopCount-- > 0) { lock (thisLock) { count++; }..
C# 에서 const와 readonly는 상수형 타입이다. const : 컴파일 상수 readonly : 런타임 상수 const 컴파일 타입의 상수이다. 컴파일 시 const 변수의 값을 가져온다. 내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용할 수 있다. 변수 선언과 동시에 값을 할당 해야 한다. 메모리 할당 위치는 heap memory이다. const는 선언과 동시에 static이 컴파일러에 의해 자동으로 붙게된다. (정적 필드가 됨) using System; namespace CSharpExample { class Foo { // 선언과 동시에 static이 컴파일러에 의해 자동으로 붙게되어 // 정적 필드가 된다. const int bar = 55; public int B..
애플리케이션을 구성하는 각 스레드는 여러 가지 자원을 공유하는 경우가 많다. 파일 핸들이나 네트워크 커넥션, 메모리에 선언한 변수 등이 그 예다. 그런데 공유되는 자원을 여러 스레드들이 한꺼번에 변경시키려하면 문제가 발생한다. 그래서 스레드들이 정연하게 자원을 사용할 수 있도록 질서를 잡아야 할 필요가 있다. 스레드들이 순서를 갖춰 자원을 사용하게 하는 것을 일컬어 "동기화(Synchronization)" 라고 한다. 이것을 제대로 하는 것이야말로 멀티 스레드 프로그래밍을 완벽하게 하는 길이라고 할 수 있다. 스레드 동기화에서 가장 중요한 것은 "자원을 한번에 하나의 스레드가 사용하도록 보장" 하는 것이다. .NET 프레임워크가 제공하는 대표적인 도구로는 lock 키워드와 Monitor 클래스가 있다. ..
스레드는 수명이 다해 스스로 종료되는 것이 가장 좋지만, 불가피하게 스레드를 강제로 종료시켜야 하는 경우가 있다. Abort() 메소드를 사용할 때는 도중에 강제로 중단된다 해도 프로세스 자신이나 시스템에 영향을 받지 않는 작업에 한 해 사용하는 것이 좋다. 스레드가 수행 중인 작업이 강제로 중단되는 경우 시스템에 악영향을 미칠 수 있다면 조금 더 부드러운 방법을 택해야 한다. Thread.Interrupt() 메소드는 스레드가 한참 동작 중인 상태(Running 상태)를 피해서 WaitJoinSleep 상태에 들어갔을 때 ThreadInterruptedException 예외를 던져 스레드를 중지 시킨다. Abort()와 비슷하지만 Thread.Interrupt() 메소드가 조금 더 나은 방법이라 할 수..