일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 lab
- 구조체
- vim
- C언어 포인터
- jupyter
- 플러터
- Python
- gitlab
- dart 언어
- c#
- 유니티
- git
- Algorithm
- 다트 언어
- Houdini
- HTML
- 도커
- Unity
- c# 추상 클래스
- c# 윈폼
- c언어
- Flutter
- 포인터
- Data Structure
- github
- C++
- docker
- 깃
- c# winform
- C# delegate
- Today
- Total
목록Programming/C# (94)
nomad-programmer
.NET 프레임워크는 스레드의 상태를 ThreadState 열거형에 정의해두었다. 다음 표와 같다. 상태 설명 Unstarted 스레드 객체를 생성한 후 Thread.Start() 메소드가 호출되기 전의 상태이다. Running 스레드가 시작하여 동작 중인 상태를 나타낸다. Unstarted 상태의 스레드를 Thread.Start() 메소드를 통해 이 상태로 만들 수 있다. Suspended 스레드의 일시 중단 상태를 나타낸다. 스레드를 Thread.Suspend() 메소드를 통해 이 상태로 만들 수 있으며, Suspended 상태인 스레드는 Thread.Resume() 메소드를 통해 다시 Running 상태로 만들 수 있다. WaitSleepJoin 스레드가 블록(Block)된 상태를 나타낸다. 메소드..
프로세스는 사용자가 작업 관리자 등을 이용하여 임의로 죽일 수 있다. 하지만 프로세스 안에서 동작하는 각 스레드는 그런 식으로 죽일 수 없다. 살아 있는 스레드를 죽이려면 다음 예제와 같이 그 스레드를 나타내는 Thread 객체의 Abort() 메소드를 호출해줘야 한다. static void DoSomething() { try { for(int i=0; i 0) { Console.WriteLine($"{count--} left"); Thread.Sleep(10); } Console.WriteLine("Count: 0"); } catch (ThreadAbortException err) { Console.WriteLine(err); Thread.ResetAbort(); } finally { Console.W..
프로세스란? 프로세스는 실행 파일이 실행되어 메모리에 적재된 인스턴스이다. 가령 work.exe가 실행 파일이라면, 이 실행 파일을 실행한 것이 프로세스이다. 또한 프로세스는 반드시 하나 이상의 스레드(Thread)로 구성된다. 스레드란? 스레드는 운영체제가 CPU 시간을 할당하는 기본 단위인데, 프로세스가 밧줄이라면 스레드는 밧줄을 이루는 실이라고 할 수 있다. 멀티 스레드의 장점 1. 사용자 대화형 프로그램에서 멀티 스레드를 이용하면 응답성을 높일 수 있다는 점을 꼽을 수 있다. 예를 들어 제작한 프로그램이 파일을 복사하는데, 복사할 파일이 너무 커서 소요 시간이 30분 정도 걸린다고 해보자. 이 때 프로그램을 단일 스레드로 만든다면 프로그램이 파일을 복사하는 동안 사용자가 취소 명령을 내리고 싶어도..
BinaryWriter/Reader 와 StreamWriter/Reader는 기본 데이터 형식을 스트림에 쓰고 읽을 수 있도록 메소드를 제공한다. 하지만 프로그래머가 직접 정의한 클래스나 구조체 같은 복합 데이터 형식은 지원하지 않는다. BinaryWriter/Reader 와 StreamWriter/Reader로 복합 데이터 형식을 기록하고 읽으려면 그 형식이 갖고 있는 필드의 값을 저장할 순서를 정한 후, 이 순서대로 저장하고 읽는 코드를 작성해야 한다. 이 문제를 위해 C#은 복합 데이터 형식을 쉽게 스트림에 읽기/쓰기를 할 수 있는 하는 "직렬화(Serialization)" 라는 메커니즘을 제공한다. 직렬화란? 객체의 상태(객체의 필드에 저장된 값들을 의미)를 메모리나 영구 저장 장치에 저장이 가능..
텍스트 파일은 구조는 간단하지만 활용도가 높은 파일 형식이다. ASCII 인코딩에서는 각 바이트가 문자 하나를 나타내기 때문에 바이트 오더의 문제에서도 벗어날 수 있고, 이로 인해 플랫폼에 관계없이 생성하고 읽을 수 있다. 뿐만 아니라 프로그램이 생성한 파일의 내용을 편집기로 열면 사람이 바로 읽을 수도 있다. .NET 프레임워크는 텍스트 파일을 쓰고 읽을 수 있도록 StreamWriter/StreamReader를 제공한다. 이 두 클래스들은 Stream의 도우미 클래스이다. Stream이 NetworkStream이라면 네트워크를 통해 텍스트 데이터를 내보내거나 읽어들이고, FileStream이라면 파일로 텍스트 데이터를 내보내거나 이로부터 읽어들인다. StreamWriter StreamWriter sw..
FileStream 클래스는 파일 처리를 위한 모든 것을 갖고 있지만, 사용하기에 여간 불편한 것이 아니다. 특히 데이터를 저장할 때 반드시 byte 형식 또는 byte의 배열 형식으로 변환해야 한다는 문제가 있다. 이것은 파일로부터 데이터를 읽을 때도 마찬가지다. .NET 프레임워크는 FileStream의 이런 불편함을 해소하기 위해 도우미 클래스들은 제공하고 있다. 바로 BinaryWriter와 BinaryReader 클래스가 그 예이다. BinaryWriter : 스트림에 이진 데이터(Binary Data)를 기록하기 위한 목적으로 만들어진 클래스 BinaryReader : 스트림으로부터 이진 데이터를 읽어들이기 위한 목적으로 만들어진 클래스 이 두 클래스는 어디까지나 파일 처리의 도우미 역할을 할..
스트림은 영어로 시내, 강 또는 도로의 차선을 뜻하는 단어로, 파일을 다룰 때 말하는 스트림은 "데이터가 흐르는 통로"를 뜻한다. 메모리에서 하드디스크로 데이터를 옮길때에는 먼저 이 스트림을 만들어 둘 사이를 연결한 뒤에 메모리에 있는 데이터를 바이트 단위로 하드디스크로 옮겨 넣는다. 하드디스크에서 메모리로 데이터를 옮길 때도 마찬가지다. 하드디스크와 메모리 사이에 스트림을 놓은 후 파일에 담겨 있는 데이터를 바이트 단위로 메모리로 차례차례 옮겨온다. 스트림은 데이터의 "흐름"이기 때문에 스트림을 이용하여 파일을 다룰 때는 처음부터 끝까지 순서대로 읽고 쓰는 것이 보통이다 (이것을 순차 접근(Sequential Access 방식이라고 함). 이러한 스트림의 구조는 네트워크나 데이터 백업 장치의 데이터 입..
파일(File)은 컴퓨터 저장 매체에 기록되는 데이터의 묶음이다. 디렉토리(Directory)는 파일이 위치하는 주소로, 파일(서류)를 담는다는 의미에서 폴더(Folder)라고 부르기도 한다. .NET 프레임워크에서는 파일과 데릭테뢰 정보를 손쉽게 다룰 수 있도록 System.IO 네임스페이스 아래에 다음과 같은 클래스들을 제공한다. 클래스 설명 File 파일의 생성, 복사, 삭제, 이동, 조회를 처리하는 정적 메소드를 제공한다. FileInfo File 클래스와 하는 일은 동일하지만 정적 메소드 대신 인스턴스 메소드를 제공한다. Directory 디렉토리의 생성, 삭제, 이동, 조회를 처리하는 정적 메소드를 제공한다. DirectoryInfo Directory 클래스와 하는 일은 동일하지만 정적 메소드..
파이썬(Python)과 루비(Ruby)는 최근 유행하고 있는 동적 언어(Dynamic Language 또는 Dynamic Typed Language)이다. CLR(Common Language Runtime) 은 IL(Intermediate Language)로 컴파일할 수 있는 언어들은 지원하지만, 파이썬이나 루비처럼 실행할 때 코드를 해석해서 실행하는 방식의 동적 언어는 지원할 수 없다. 그래서 마이크로소프트는 동적 언어를 실행할 수 있도록 해주는 플랫폼인 DLR(Dynamic Language Runtime)을 선보였다. DLR은 CRL위에서 동적하며, 파이썬이나 루비와 같은 동적 언어를 실행할 수 있다. DLR의 장점은 그저 동적 언어를 .NET 플랫폼에서 실행할 수 있다는 정도에서 그치지 않는다. D..
COM 이란? COM은 Component Object Model의 약자로, 마이크로소프트의 소프트웨어 컴포넌트 규격을 말한다. OLE, ActiveX, COM+와 같은 파생 규격들이 모두 COM을 바탕으로 만들어졌다. 마이크로소프트에서 출시되는 대부분의 제품이 COM을 지원한다. COM은 부품 역할을 하는 소프트웨어이다. COM 컴포넌트는 그래픽 프로그래밍에 서툰 프로그래머가 화려한 차트 기능을 어플리케이션에 넣을 수 있도록 해주고, 엑셀 문서의 파일 구조를 몰라도 엑셀 문서를 읽거나 쓸 수 있도록 해준다. C#을 비롯한 .NET 언어들은 RCW(Runtime Callable Wrapper)를 통해 COM 컴포넌트를 사용할 수 있다. RCW는 .NET 프로엠워크가 제공하는 Type Library Impo..
dynamic 형식도 int, string과 같은 하나의 데이터 형식이다. 다만 형식 검사가 컴파일할 때 이루어지는 다른 형식과는 달리 형식 검사가 프로그램 실행 중에 이루어진다는 점이 다르다. class MyClass { public void FuncA() { } } class MainApp { static void Main(string[] args) { MyClass obj = new MyClass(); obj.FuncA(); // FuncB() 메소드는 정의되어 있지 않으므로 컴파일 에러 발생 obj.FuncB(); } } 위의 코드는 컴파일되지 않는다. MyClass 클래스는 FuncB() 라는 메소드가 선언되어 있지 않기 때문이다. class MyClass { public void FuncA()..
어트리뷰트(Attribute)는 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능이다. 어트리뷰트가 주석과 다른 점은 주석이 사람이 읽고 쓰는 정보라면, 어트리뷰트는 사람이 작성하고 컴퓨터가 읽는다는 것이다. 어트리뷰트를 이용해서 클래스나 구조체, 메소드, 프로퍼티 등에 데이터를 기록해두면 이 정보를 C# 컴파일러나 C#으로 작성된 프로그램이 이 정보를 읽어 사용할 수 있다. (예를 들어 컴파일러가 경고를 내도록 만들 수도 있음) 메타데이터 (Metadata) 메타데이터란 데이터의 데이터를 말한다. 가령 C# 코드도 데이터지만, 이 코드에 대한 정보, 데이터가 있을 수 있다. 이를 메타데이터라고 하는 것이다. 어트리뷰트나 리플렉션을 통해 얻는 정보들도 C# 코드의 메타데이터라고 할 수 있다. 어트리뷰..
리플렉션은 객체를 X-Ray 사진처럼 객체의 형식 정보를 들여다보는 기능이다. 이 기능을 이용하면 프로그램 실행 중에 객체의 형식 이름부터 프로퍼티 목록, 메소드 목록, 필드, 이벤트 목록까지 모두 열어볼 수 있다. 형식의 이름만 있다면 동적으로 인스턴스를 만들 수도 있고, 그 인스턴스의 메소드를 호출할 수도 있다. 심지어 새로운 데이터 형식을 동적으로 만들 수도 있다. 이렇듯 런타임에 형식 정보를 다룰 수 있게 하는 리플렉션은 한층 더 강력한 표현력을 선사한다. .NET은 모든 형식을 들여다 볼 수 있도록 장치를 설계했다. 바로 모든 데이터 형식의 조상인 Object 형식에 GetType() 메소드를 만들어 놓았다. Object.GetType() 메소드와 Type 클래스 Object는 모든 데이터 형식..
싱글턴(Singleton)이란? 해당 형식의 객체를 오직 단 하나만 마들고 이 객체를 전역에서 접근할 수 있도록 하는 디자인 기법이다. 기본값이 할당된 컬렉션은 참조용으로만 사용할 것이니 여러 개의 인스턴스가 필요 없다. 싱글턴을 이용하면 메모리 낭비를 줄일 수 있다. 표준 연산자 및 쿼리식 문법의 표 종류 메소드 이름 설명 C# 쿼리식 문법 정렬 OrderBy 오름차순으로 값을 정렬 orderby OrderByDescending 내림차순으로 값을 정렬 orderby ... descending ThenBy 오름차순으로 2차 정렬 orderby ..., ... ThenByDescending 내림차순으로 2차 정렬 orderby ..., ... descending Reverse 컬렉션 요소의 순서를 거꾸로 ..
LINQ는 매우 깔끔하고 쉽게 읽고 쓸 수 있지만, 일반적으로 알고리즘을 수동으로 작성하는 것보다 훨씬 더 많은 계산, 특히 더 많은 메모리 할당이 필요하다. 이 점을 반드시 알고 있어야 한다. using System.Linq; List data = new List(); data.Any(x => x > 10); var result = from x in data where x > 10 select x; 그렇기때문에 Unity에서는 LINQ를 사용하지 않도록해야한다. https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/let-clause let 절 - C# 참조 let 절 - C# 참조 docs.microsoft.com LIN..
메소드를 비롯하여 속성, 인덱서, 생성자, 소멸자는 공통된 특징이 있다. 이들은 모두 클래스의 멤버로서 본문이 중괄호{}로 만들어져 있다. 이러한 멤버의 본문을 식(expression)만으로 구현하는 것이 가능하다. 이렇게 구현된 멤버를 영어로 "Expression-Bodied Memeber" 라고 하고, "식 본문 멤버" 라고 한다. 문법은 다음과 같다. 멤버 => 식; 아래는 읽기 전용 속성과 인덱서를 식으로 구현하는 방법이다. 읽기 전용으로만 사용한다고 가정하면 get 키워드조차 생략할 수 있다. class Foo { public int Capacity => list.Capacity; public string this[int index] => list[index]; } 허나 읽기/쓰기 모두 가능한 ..
자료 구조에서 말하는 이진 트리 자료 구조라고 생각하면 된다. 각 노드는 부모-자식 관계로 연결된다. 뿌리가 되는 노드를 루트(Root) 노드라고 하며 루트로부터 뻗어 나온 노드 중 가장 끝에 있는 노드를 잎(Leaf) 노드, 또는 단말(Terminal) 노드라고 한다. 평범한 트리 자료 구조에서는 부모 노드가 여러 개의 자식 노드를 가질 수도 있지만, 식 트리는 한 부모 노드가 단 두 개만의 자식 노드를 가질 수 있는 "이진 트리(Binary Tree)"이다. 식 트리(Expression Tree)란, 식을 트리로 표현한 자료 구조를 말한다. 예를 들어 1 * 2 + (7 - 8) 이라는 식을 식 트리로 표현하면 다음과 같다. 식 트리에서 연산자는 부모 노드가 되며, 피연산자는 자식 노드가 된다. 위의..
Func와 Action을 사용하는 이유? Func와 Action으로 더 간편한 무명 함수를 만들 수 있다. 익명 메소드와 무명 함수는 코드를 보다 간결하게 만들어주는 요소들이다. 하지만 대부분의 경우 단 하나의 익명 메소드나 무명 함수를 만들기 위해 매번 별개의 대리자를 선언해야 한다. 번거로운 일이 아닐 수 없다. 이 문제를 해결하기 위해 MS는 .NET 프레임워크에 Func와 Action 대리자를 미리 선언해뒀다. Func 대리자는 결과를 반환하는 메소드를 참조한다. Action 대리자는 결과를 반환하지 않는 메소드를 참조한다. Func 대리자 Func 대리자는 결과를 반환하는 메소드를 참조하기 위해 만들어졌다. .NET 프레임워크에는 모두 17가지 버전의 Func 대리자가 준비되어있다. public..
람다식(Lambda Expression) 은 무명 함수(Anonymous Function) 라는 이름으로 부른다. // 기본적인 람다식 선언 매개변수목록 => 식 "=>" 연산자는 "입력" 연산자이다. 이 연산자가 하는 역할은 그저 매개 변수를 전달하는 것뿐이다. 람다식에서는 => 를 중심으로 왼쪽에는 매개 변수가 오른편에는 식이 위치한다. // 익명 메소드를 위한 대리자 선언 delegate int Calculate(int a, int b); // ... static void Main(string[] args){ Calulate calc = (int a, int b) => a + b; } C# 컴파일러는 람다를 한층 더 간결하게 만들 수 있도록 "형식 유추(Type Inference)" 라는 기능을 제..
알람 시계처럼 어떤 일이 생겼을 때 이를 알려주는 객체가 필요한 경우가 있다. 이런 객체를 만들 때 사용하는 것이 바로 "이벤트 (Event)" 이다. 이벤트의 동작 원리는 대리자와 거의 흡사하다. 이유는 이벤트는 대리자를 event 한정자로 수식해서 만들기 때문이다. 이벤트 선언 및 사용 절차 대리자 선언. 대리자는 클래스 밖에 선언해도 되고 안에 선언해도 된다. 클래스 내에 1에서 선언한 대리자의 인스턴스를 event 한정자로 수식하여 선언. 이벤트 핸들러를 작성. 이벤트 핸들러는 1에서 선언한 대리자와 일치하는 메소드면 된다. 클래스의 인스턴스를 생성하고 이 객체의 이벤트에 3에서 작성한 이벤트 핸들러를 등록한다. 이벤트가 발생하면 이벤트 핸들러가 호출된다. 이벤트 예제 using System; n..