.NET/C#
[C#] TCP/IP 통신
1. TCP/IP 컴퓨터 사이에 데이터를 주고받으려면 나름대로의 규칙이 필요합니다. 어떠한 방법으로 어떠한 방식을 통해 전송할 것인가를 정해야 하고 그래야 데이터를 그 약속대로 보내고 받을 수 있을 것입니다. 데이터를 주고받기 위한 이러한 규칙을 '프로토콜'이라고 부르며 세상에 존재하는 다양한 프로토콜 중 'TCP/IP'는 사실상 인터넷의 표준 프로토콜이라 할 수 있습니다. TCP/IP는 논리적으로 몇개의 계층구조로 나누어지는데 최상단 응용계층부터 링크(네트워크 접근) 계층까지 각 계층마다 층을 이루고 있으며 이러한 층을 'TCP/IP 스택'이라고 합니다. 웹 브라우저에서 부터 카톡과 같은 메신저나 유튜브 등 다양한 인터넷 서비스들이 이 'TCP/IP 프로토콜'을 통해 이루어지고 있습니다. ● 패킷 인터..
[C#] Thread(스레드)와 Task(태스크)
1. 프로세스와 스레드 프로세스라 함은 실행파일이 실행되어 실행파일과 관련된 모든 데이터가 메모리에 적재되어 실행되는 상태를 말합니다. 프로세스는 자신만의 스레드를 가질 수 있으며 이 스레드로 프로그램에 필요한 동작을 수행합니다. 따라서 프로세스는 반드시 하나이상의 스레드를 가지며 스레드는 CPU가 프로그램 실행을 위해 시간을 할애하는 기본 단위가 됩니다. 프로그램이 내부에 여러작업을 수행해야 하는 경우라면 스레드를 여러 개 사용하는 '멀티스레드'를 구현합니다. 예를 들어 문서편집기 프로그램의 경우 사용자가 문서를 작성하고 있으면 주기적으로 자동 저장을 해야 할 때 문서작성용 스레드와 자동 저장을 수행하는 스레드가 각각 필요할 것입니다. 시간이 오래 걸리는 계산 작업을 수행하는 경우에도 사용자가 중간에 ..
[C#] 파일과 디렉터리 다루기
1. 파일 및 디렉터리 .NET 에서는 파일과 디렉터리를 다룰 수 있도록 아래와 같은 클래스를 제공하고 있습니다. File 파일을 다룰 수 있는 정적메서드 사용 FileInfo 정적메서드 대신 인스턴스메서드 사용 Directory 디렉토리를 다룰 수 있는 정적메서드 사용 DirectoryInfo 정적메서드 대신 인스턴스메서드 사용 정적 메서드를 사용할지 인스턴스를 통해 사용할지의 결정사항은 정확히 정해진 바 없으나 보통 파일이나 디렉터리의 복사, 이동 등 한두 가지 작업만 하는 경우라면 간단하게 정적 메서드를 사용하며 하나의 파일이나 디렉터리에 대해 여러 가지 작업을 수행하는 경우는 인스턴스를 사용합니다. 정적 메서드나 인스턴스 메서드나 메서드의 이름은 약간씩 다르지만 결국하는 일은 모두 비슷합니다. 우..
[C#] dynamic 형식
C# 4.0에 처음 등장한 dynamic형식은 형식검사를 컴파일 단계가 아닌 프로그램 실행 중에 합니다. 이러한 특징 때문에 아래와 같은 엉터리 코드도 정상적인 컴파일이 이루어집니다. class Program { static void Main(string[] args) { dynamic d = 1; d.WriteLine("안녕하세요."); } } 형식 검증이 컴파일 단계에서 이루어지는 형태가 아니다 보니 실제 WriteLine() 메서드가 존재하는지의 여부는 확인하지 않기 때문입니다. 컴파일 단게에서 진행되는 강력한 형식검사를 받지 않게 된다는 것은 곧 프로그램의 형식을 지키지 않는 코드의 작성이 가능하다는 얘기가 됩니다. 예를 들어 다음과 같은 경우 class Car { public void Drive..
[C#] 리플렉션과 애트리뷰트
1. 리플렉션 리플렉션은 프로그램 내부의 객체를 대상으로 형식(Type) 확인이 가능한 것을 말하는 것을 말합니다. 이것으로 해당 객체의 인스턴스를 만들거나 심지어는 인스턴스에 소속된 메서드를 호출할 수 있는 등의 동적이면서 유연한 활용이 가능합니다. 객체의 형식정보는 Object에 있는 GetType() 메서드를 통해 확인이 가능한데 이는 모든 데이터형 식이 이 Object를 상속하고 있으므로 어떠한 데이터 형식에서도 GetType() 메서드를 호출할 수 있다는 것을 의미합니다. 이 메서드에서는 Type형식을 반환하고 있고 이 형식을 통해 형식의 이름과 메서드, 프로퍼티 목록 등 객체를 이루는 거의 모든 것을 확인할 수 있습니다. class Program { static void Main(string[..
[C#] LINQ
LINQ는 Language INtegrated Query로서 '데이터'를 질의하는데 목적이 있습니다. 우리가 흔히 DB를 대상으로 어떤 데이터를 추출할 때 SQL이라는 언어를 사용해 데이터를 질의하는데 SQL이 DB에 한정된 것이라면 LINQ는 프로그램 안에 존재하는 단순 배열까지 포함하여 IEnumerable인터페이스를 상속하는 모든 개체가 질의의 대상이 될 수 있습니다. 예를 들어 아래와 같은 형태의 데이터집합이 존재한다고 가정했을 때 class Program { static void Main(string[] args) { List pb = new List{ new PhoneBook { Idx = 1, Name = "홍길동" }, new PhoneBook { Idx = 2, Name = "홍길순" }..
[C#] 람다식
람다식은 메서드(함수)를 최대한 간결하게 표시하는 방법을 말하며 무명 함수를 만드는 데 사용할 수 있습니다. class Program { delegate int Cal(int i, int j); static void Main(string[] args) { Cal c = (i, j) => i + j; WriteLine(c(100, 200)); } } 예제에서 Cal 대리자는 무명 함수를 위해 선언되었으며 '(i, j) => i + j;' 부분이 함수의 매개변수와 본문입니다. 이처럼 매개변수와 함수의 실행 부분으로 나뉘어 있는데 => 연산자가 매개변수로 전달된 값을 실행 부분으로 옮겨주는 역할을 합니다. 매개변수는 '(i, j)'로 간결하게 작성되었는데 본래 '(int i, int j)'와 같이 데이터 타입..
[C#] 대리자와 이벤트
1. 대리자 (델리게이트) 만약 아래와 같이 숫자를 계산해 주는 메서드가 존재할 때 class Cal { public int Sum(int i, int j) { return i + j; } } 이 메서드를 호출해 계산을 수행하려면 다음과 같이 메서드를 호출할 수 있습니다. class Program { static void Main(string[] args) { Cal c = new Cal(); WriteLine(c.Sum(100, 200)); } } 에제에서 메서드를 호출하기 위해 c.Sum(100, 200)처럼 하였는데 이렇게 직접적으로 메서드를 호출하는 것이 아니라 다른 매개체를 통해서 필요한 메서드를 대신 호출할 수도 있는데 이때 사용되는 매개체를 '대리자'라고 합니다. 즉, 대리자를 통해서 다른 ..