본문 바로가기

.NET/C#

(19)
[C#] ThreadPool 사용법 Thread를 사용하다 보면 직면하는 문제점이 있다. 프로그램이 종료되더라도 스레드가 여전히 백그라운드에서 동작중이라 완전히 종료되지 않는 문제가 발생하곤 한다. 일반적으로 스레드를 통해 반복적인 작업을 수행하게 되면 do-while 루프 등을 사용하여 내부적으로 무한 루프를 돌리고, 루프의 조건 변수로 bool 변수 등을 지정해서 스레드를 간접적으로 종료시키는 방법을 사용하게 된다. 아래와 같이. bool isRun; int count = 0; void button_Start_Click(object sender, EventArgs e) { if(isRun) return;// 이미 루프가 돌고 있는 상태라면 새로운 스레드를 생성하지 않는다. new Thread(counter).Start(); } void..
[C#] FileInfo 클래스로 파일 정보 확인 FileInfo 클래스는 파일의 정보를 제공하는 클래스이다. System.IO 네임스페이스에 선언되어 있으므로 FileInfo 클래스를 사용하기 위해 다음과 같이 네임스페이스를 추가한다. using System.IO; FileInfo 클래스의 인스턴스를 생성하기 위해 생성자에 정보를 확인하고자 하는 파일의 전체 경로를 인자로 넘긴다. 반드시 실제로 존재하는 파일의 경로를 지정할 필요는 없다. var finfo = new FileInfo("Test.txt"); FileInfo의 여러 가지 기능들을 사용해보자. 1. Exists 파일이 존재하는지의 여부를 나타내는 속성이다. 파일이 존재한다면 true이고, 존재하지 않는다면 false이다. var finfo = new FileInfo("Test.txt"); ..
[C#] StreamReader와 StreamWriter로 파일 읽기, 쓰기 C#에서 파일을 읽고 쓰기 위한 스트림으로 StreamReader와 StreamWriter를 사용할 수 있다. 이 클래스들은 System.IO 네임스페이스에 선언되어 있으므로 사용하기 위해서는 System.IO를 using 해줘야 한다. using System.IO; 1. 파일 읽기 파일을 읽기 위해서 StreamReader를 사용한다. 파일 경로를 통해 새로운 StreamReader 개체를 생성하자. void ReadFile(string path) { var sr = new StreamReader(path); } StreamReader의 생성자에 들어가는 path는 파일의 경로와 파일명(파일 이름 + 확장자)을 포함하는 전체 경로여야 한다. (단, 파일이 실행 프로그램(*.exe)과 같은 경로상에 존재..
[C#] using 구문 사용법 using 키워드는 단순히 네임스페이스를 임포트할 때 뿐만 아니라 다른 용도로도 사용이 가능한데, using의 유용한 두 가지 기능을 소개한다. 1. 별칭 선언 using 키워드를 사용해 특정 타입의 별칭을 선언할 수 있다. 이는 c나 c++의 typedef와 유사하다. using Element = System.Int32; class Program { static void Main(string[] args) { Element element = 15; Console.Write(element.ToString()); } } 그다지 사용될 일이 없어보여도 은근히 사용하면 유용할 경우가 생긴다. 가령 아래와 같이 여러 개의 클래스가 중첩되어 있는 상황에서 내부 클래스를 사용 및 접근하기 위해 외부 클래스의 이름을..
[C#] delegate와 delegate 체인 delegate(델리게이트)는 C++의 함수 포인터와 비슷한 기능을 하는 C#의 기능으로, '대리자'라는 의미처럼 메서드를 대신 호출해주는 기능을 한다. 메서드를 대신 호출해주는 기능이 왜 필요할까? 사실 알게 모르게 여기저기에서 우리는 delegate를 사용하고 있다. 가장 대표적인 곳이 WinForm에서 이벤트 처리기이다. 이는 WinForm 애플리케이션이 동작하는 중에 이벤트가 발생하는 각 포인트에서 적절한 대리자를 사용하여 대리자에 등록된 메서드를 호출해주는 것을 의미하며, 각 이벤트에 대한 세부적인 처리를 정의하는 것은 공백으로 남겨두어 WinForm 개발자들이 자유롭게 사용할 수 있도록 한다. 가령 TextBox와 같은 컨트롤들은 키가 입력됨을 판단하여 적절한 위치에서 KeyDown, KeyP..
[C#] 소켓 연결 시도에 타임아웃 넣기 Socket의 Connect() 메서드는 네트워크 연결을 시도하는 메서드이다. 만약 연결을 요청했을 때 연결이 되거나, 연결이 거부되거나 처럼 응답이 오면 빠르게 넘어갈 수 있으나, 문제는 응답이 없는 경우이다. 응답이 없는 경우 10초 내지 20초의 꽤 긴 시간 동안 응답을 기다리다가 처리가 넘어가게 된다. 연결을 요청하는 측에서도 타임아웃을 두고 지정된 시간동안만 대기하는 코드를 소개한다. public bool ConnectWithTimeout(Socket socket, string ip, int port, int timeOutSec) { var waiter = socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port), null, null); //..
[C#] as, is 키워드 사용법 형식을 변환하기 위해 캐스트 연산자를 사용한다. double pi = 3.14; int p = (int)pi;// double 타입 값 3.14를 int 타입으로 캐스팅 이런 식으로 값을 다른 형식으로 변환하거나, enum FruitType { Apple, Banana, Grape, Orange, Pineapple, Mango } static void Main(string[] args) { int i = (int)FruitType.Apple; FruitType f = (FruitType)2; } 이런 식으로 열거형에도 사용할 수 있고, private void button_Click(object sender, EventArgs e) { MessageBox.Show(((Button)sender).Text +..
[C#] 문자열 보간 기능 C#에서 문자열을 사용하다 보면 아래와 같이 코드가 굉장히 지저분해지고 가독성도 떨어지는 경우가 꽤 있다. // [학번] 이름 (나이) 주소 : 주소 형식으로 문자열을 생성해서 반환한다. // ex) [00000001] 홍길동 (21) 주소 : 서울특별시 서초구 string makeString(string studentNumber, string name, int age, string address) { return "[" + studentNumber + "] " + name + " (" + age + ") 주소 : " + address; } 문자열과 데이터가 섞여야 하는 경우 문자열 보간 기능을 이용하면 아주 깔끔하게 코드를 작성할 수 있다. // [학번] 이름 (나이) 주소 : 주소 형식으로 문자열을 ..
[C#] 확장 메서드를 사용해 메서드 호출을 간결하게 하기 C#에는 확장 메서드 기능이 있다. 어떤 타입에 대해 클래스 외부에서 해당 클래스의 멤버 메서드를 추가로 구현하는 것이라고 보면 이해하기 쉽다. (엄밀히 따지면 멤버 메서드는 아니다. private 멤버에는 접근할 수 없기 때문이다.) Column이 번호, 이름, 학번으로 구성된 ListView 컨트롤에 아이템을 추가하는 방법은 다음과 같다. var item = new ListViewItem(listView1.Items.Count.ToString()); item.SubItems.Add("홍길동"); item.SubItems.Add("12345678"); listView1.Items.Add(item); 그러나 매번 위 과정을 적기에는 생산성이 떨어지므로 아래와 같이 아이템을 추가하는 과정을 하나의 메서드로..