본문 바로가기

분류 전체보기

(42)
[C# Reflection] GetValue()와 SetValue() 메서드 지난 글에서 GetField(), GetFields() 메서드를 통해 필드 정보를 FieldInfo 개체 형식으로 받아오는 방법을 알아봤다. [C# Reflection] GetField(), GetFields() 메서드와 FieldInfo 클래스 Type 클래스에 대해 GetField() 또는 GetFields() 메서드를 사용해서 타입에 속한 필드의 정보를 가져올 수 있으며 필드의 정보는 FieldInfo 클래스의 인스턴스 형태로 반환된다. 오늘은 이들에 대해 알아 cs-solution.tistory.com 이번에는 가져온 FieldInfo 개체를 사용해서 필드의 값을 읽거나 쓰는 방법을 배워본다. 1. GetValue(object) - 필드(또는 속성)의 값을 가져오기 class MyClass { p..
[C#] 속성(Property)이란 무엇인가? 속성(Property)은 C#에서 제공하는 특수한 메서드로, 비공개 멤버에 대한 접근이나 설정 방법을 안전하게 클래스 외부로 제공하기 위한 기술이다. 쉽게 말해서 접근자와 설정자인데, java를 배워본 사람이라면 알겠지만 흔히 private 멤버를 클래스의 외부에서 가져오거나 설정하기 위해 get(), set() 메서드를 만드는 바로 그것이다. 일반적으로 private 멤버는 클래스 외부에서는 접근할 수 없다. 그런데 만약 클래스 외부에서 값을 가져오거나 혹은 설정해야 할 일이 있을 경우 이런 방법으로 코드를 작성할 수 있다. class MyClass { private int myMember; public int GetMyMember() { return myMember; } public void SetM..
[C# Reflection] GetField(), GetFields() 메서드와 FieldInfo 클래스 Type 클래스에 대해 GetField() 또는 GetFields() 메서드를 사용해서 타입에 속한 필드의 정보를 가져올 수 있으며 필드의 정보는 FieldInfo 클래스의 인스턴스 형태로 반환된다. 오늘은 이들에 대해 알아보자. 먼저 GetField()와 GetFields() 등 리플렉션에서 타입에 속한 멤버를 검색해서 가져오기 위한 메서드를 사용하려면 BindingFlags에 대해 알아둘 필요가 있다. BindingFlags System.Reflection 네임스페이스에 정의되어 있는 enum으로, 검색 조건들을 열거형으로 나타낸 것이며, 비트 조합을 허용하는 Flags 특성이 적용되어 있어 비트 연산자를 사용해 여러 조건을 조합할 수 있다. 우리가 앞으로 주로 사용할 바인딩 플래그는 다음과 같다. ..
[C# Reflection] Reflection이란? 리플렉션(Reflection)은 어떤 Type에 대한 정보를 가져오거나 접근하는 등의 작업을 런타임에 동적으로 수행할 수 있도록 해주는 기능이다. 리플렉션을 사용하면 런타임에서 메서드를 호출하거나 필드의 값을 바꾸는 등의 작업을 할 수 있다. 실제로 어셈블리는 미리 생성된 스크립트를 기준으로 생성이 되며, 어셈블리가 동작할 때 메서드가 호출되거나 필드의 값을 변경하는 행위는 모두 프로그래머가 어셈블리를 빌드하기 전에 스크립트에 정의해놓은 일련의 작업일 뿐이다. 예를 들어 클래스 A에 존재하는 a, b, c라는 세 개의 필드에 사용자로부터 값을 입력받아 지정하고자 한다면 프로그래머는 클래스 A의 구성 요소에 대해 알고 있고, 수행해야 할 동작들에 대해서도 이미 정의되어 있기 때문에 아래와 같이 코드를 작성..
[C#] out 형식 파라미터 사용법 메서드에서 두 개 이상의 값을 반환해야 하는 경우는 매우 빈번하다. 하지만 반환형이 void가 아닌 메서드에 대해서 반환 값은 반드시 1개만 존재할 수 있다. 이러한 경우 out 형식 파라미터를 사용하여 여러 개의 값을 메서드의 결과물로써 받아올 수 있다. out 키워드의 사용법은 다음과 같다. // x를 y로 나눈 결과를 반환하는 메서드 bool TryDivide(double x, double y, out double result) { result = double.NaN;// out 형식 파라미터는 반드시 최소 1회 값을 지정해줘야 한다. if(y == 0) return false; result = x / y; return true; } 주석으로 명시해놨듯이 out 형식의 매개변수는 메서드가 종료되기 ..
[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..
[WinForm] Invoke() delegate 생성 없이 한 문장으로 간단하게 사용하기 참고하면 좋은 C# Solution의 다른 글 [C#] delegate와 delegate 체인 delegate(델리게이트)는 C++의 함수 포인터와 비슷한 기능을 하는 C#의 기능으로, '대리자'라는 의미처럼 메서드를 대신 호출해주는 기능을 한다. 메서드를 대신 호출해주는 기능이 왜 필요할까? 사 cs-solution.tistory.com [WinForm] 크로스 스레드(Cross Thread) 문제 해결 WinForm에서 Thread를 사용해 폼의 컨트롤을 갱신하려고 시도하면 크로스 스레드 예외가 발생한다. 이는 컨트롤을 생성해 관리하는 스레드는 메인 스레드인데, 사용자가 생성한 외부 스레드에서 메 cs-solution.tistory.com Thread에서 Form에 있는 Control의 값을 변경하려..
[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)과 같은 경로상에 존재..
[WinForm] Drag & Drop으로 파일 가져오기 파일을 마우스로 끌어서 WinForm의 RichTextBox 컨트롤에 가져다 놓으면 파일을 읽어서 내용을 RichTextBox에 출력해주는 프로그램을 만들어본다. 기본적으로 WinForm의 컨트롤은 Drag&Drop에 대한 처리가 구현되지 않았기 때문에 아래와 같이 파일을 가져다 올리면 🚫와 같은 모양으로 마우스 커서가 바뀌고, 파일을 놓아도 아무 일도 발생하지 않는다. Drag&Drop 이벤트를 구현하기 위해 몇 가지 단계를 거친다. 1. Drag&Drop을 처리할 컨트롤에서 AllowDrop 속성을 true로 설정해준다. AllowDrop 속성은 컨트롤에서 끌어서 놓기 작업을 수행할 수 있는지의 여부를 나타내는 속성이다. 만약 AllowDrop 속성이 속성 창에서 보이지 않는다면, 코드상에서 직접 A..