본문 바로가기

반응형

C#

(91)
리플렉션 Reflection (2) : 복잡한 if 문 대신 리플렉션으로 생성 함수 호출하기 프로젝트를 진행하면서 아래 예제 코드와 같이 형타입에 따라 다른 객체를 생성해야 하는 경우가 있습니다. if( data is DataTypeA a) { var model = new DataModelA(a); list.Add(model); } else if( data is DataTypeB b) { var model = new DataModelB(b); list.Add(model); } // 엄청 긴 if 문~ 위 예제 코드와 같은 구조로 개발을 하게 되면 데이터 타입이 추가될 때마다, if 문은 계속 길어질 수 밖에 없고 데이터 타입에 따라 DataModel을 생성하는 논리가 달라지면서 if문 내부도 복잡해져갔습니다. 이러한 구조로 인해 점점 코드는 더러워집니다. 이를 해결하기 위해 아래와 같이 리플렉션..
IPC(Inter-Process Commnication) IPC Process는 완전히 독립된 실행객체이다. 서로 독립되어 있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있다. 그러나 독립되어 있으니만큼 별도의 설비가 없이는 서로간에 통신이 어렵다는 문제가 있다. 이를 위해서 커널영역에서 IPC라는 내부 프로세스간 통신(Inter Process Communication)을 제공한다. 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신을 할 수 있다. 바로 프로세스들 간의 의사소통을 하는 것이라는 뜻인데, 프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고 받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻입니다. IPC는 그러므로 컴퓨터 내부에서 보다 더 효율적으로 정보..
윈도우 메세지 종류들 List Of Windows Messages | WndProc Hex 값 Intager 값 Symbol 이름 0000 0 WM_NULL 0001 1 WM_CREATE 0002 2 WM_DESTROY 0003 3 WM_MOVE 0005 5 WM_SIZE 0006 6 WM_ACTIVATE 0007 7 WM_SETFOCUS 0008 8 WM_KILLFOCUS 000a 10 WM_ENABLE 000b 11 WM_SETREDRAW 000c 12 WM_SETTEXT 000d 13 WM_GETTEXT 000e 14 WM_GETTEXTLENGTH 000f 15 WM_PAINT 0010 16 WM_CLOSE 0011 17 WM_QUERYENDSESSION 0012 18 WM_QUIT 0013 19 WM_QUERYOPEN 0014 20 WM_ERASEBKGND 0015 21 WM_S..
GDI 개체 관리 메모리 관련 작업할 때 봤던 것인데 정리해둔다. GDI 개체 종류 Bitmap 브러시 메타파일 메모리 DC 색상표 펜 및 확장 펜 [출처] https://learn.microsoft.com/ko-kr/windows/win32/sysinfo/gdi-objects
리플렉션 Reflection (1) 리플렉션 Reflection 리플렉션은 프로그램이 동적으로 소스 코드를 해석할 수 있게 하는 기술이다. Activity나 Service 같이 특정 이름 규칙으로 클래스를 작성하면 개발자가 코드로 객체를 생성하거나 연결하지 않아도, 프로그램 내에 등록되고 사용할 수 있었던 마법의 원리는 프레임워크가 리플렉션 기술을 사용해 클래스의 이름을 바탕으로 클래스를 생성/관리/제거해주기 때문입니다. 객체를 프레임워크가 관리해주기 때문입니다. 객체를 프레임워크가 관리해주니가, 개발자는 프레임워크에게 요청하면 언제 어디서나 안정적으로 원하는 클래스를 얻을 수 있습니다. 즉 개발자는 클래스로 객체를 생성하는거나, 객체를 사용할 수 있게 준비하는 일정 부분을 프레임워크에게 믿고 맡길 수 있게 됩니다. public class..
덤프 파일 사용 방벙(.pdb 디버깅) 프로그램이 죽을 경우 덤프 파일 만들기 1. 솔루션 탐색기 - 프로젝트 우 클릭 - 추가 - 기존 항목 - MinidumpHelp.cs 추가 dbghelp.dll 파일은 윈도우에 기본적으로 설치돼있지만 배포할 컴퓨터에 없는 경우 실행 파일과 함께 배포 2. 컴퓨터의 운영체제와 동일한 솔루션 플랫폼으로 반드시 변경 솔루션 플랫폼이 없을 경우 : 구성 관리자 - 활성 솔루션 플랫폼 - 새로 만들기 64bit 운영체제의 경우 솔루션 플랫폼을 x64로 변경하여 빌드 Any CPU 불가 3. 소스 //Program.cs에 추가 namespace WindowsFormsApplication1 { static class Program { //이벤트 클래스(UI 예외) static void exceptionDump(ob..
병렬 프로그래밍 Parallel Programming (2) - 작업 병렬화 작업 병렬화 Task Parallelism 작업 병렬화는 일반적으로 생각하는 병렬 처리를 하는 방식입니다. 작업 병렬화는 데이터 병렬화와 달리, 데이터마다 동일한 처리를 하는 방법이 아닌, 독립적인 작업들을 동시에 처리하는 방식입니다. 데이터 병렬화와 마찬가지로 작업 병렬화도 TPL이 개발자를 대신하여 스레드를 관리합니다. 따라서 개발자는 병렬 프로그래밍을 Parallel.Invoke 메서도를 사용해 아래와 같이 손쉽게 구현할 수 있습니다. Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork()); 예제 코드는 Parallel.Invoke 메서드로 DoSomeWork() 과 DoSomeOtherWork()을 병렬로 처리하고 있습니다. 코드의 내부 동작을..
병렬 프로그래밍 Parallel Programming (1) - 데이터 병렬화 병렬 프로그래밍 Parallel Programming 병렬 프로그래밍은 비동기 프로그래밍이 아니다! 병렬 프로그래밍과 비동기 프로그래밍 모두 컴퓨터에게 제일 중요한 자원인 중앙처리장치(CPU)를 효율적으로 사용하기 위한 기법입니다. 다만 중앙처리장치를 효율적으로 사용하는 방법이 다를 뿐입니다. 병렬 프로그래밍은 작업을 분할 정복합니다. 반면 비동기 프로그래밍은 코드 흐름을 유연하게 변경합니다. 병렬 프로그래밍에서 주의할 점 소스 코드에 따라 병렬 처리가 적합하지 않을 수 있다. 특히 병렬 처리를 위해 드러나지 않는 사전 작업이 굉장히 많다. 따라서 단순한 작업을 위해 병렬 처리하는 건 오히려 실행 속도를 저하시킬 수 있다. 그리고 실행을 필요 이상으로 복잡하게 하여 디버깅을 어렵게 하기도 한다. 따라서 ..

반응형