C# 이것저것 14

[C#] Proxy 패턴

카테고리 : 구조패턴 개요 : Proxy 패턴은 클라이언트가 실제 사용을 원하는 객체를 직접 사용하는 것이 아니라 그 객체에 대한 대리자(Proxy) 역할을 하는 객체를 두고, 클라이언트가 대리자(Proxy( 객체를 통해서 실제 객체를 사용하도록 하는 방식이다. Proxy 패턴은 클라이언트와 실제 사용하고자 하는 객체(RealSubject) 사이에 대리자(Proxy)를 두고, 실제 객체(RealSubject) 대신 대리자를 호출하는 방식이다. 대리자(Proxy) 객체는 실제 객체와 동일한 인터페이스를 가지며, 클라이언트와 실제 객체 사이에는 하나 이상의 복수 Proxy 객체가 있을 수 있다. Proxy 패턴에서 대리자(Proxy)는 단순하게는 클아이언트 요청을 그대로 실제 객체에 전달 가능하며, 대리자(..

[C#] Decorator 패턴

카테고리 : 구조 패턴 개요 : Decorator 패턴은 기존 객체의 구조를 그대로 둔 채, 그 객체에 부가적인 기능을 동적으로 추가하기 위해 사용된다. 객체지향 프로그래밍에서 흔히 클래스에 새로운 기능들을 추가하기 위해 서브클래스를 만들어 사용하는데, 이것의 대안적인 방법으로 Decorator 패턴을 이용할 수 있다. 클래스 상속을 사용하면 너무 많은 서브클래스들이 만들어 지는 경우 Decorator 패턴이 유용하게 사용된다. 기능 확장을 위해 서브클래스를 사용하는 방식은 컴파일시에 결정되는 기능 확장 방식인 반면, Decorator 패턴은 객체를 전달하며 기능을 확장하는 방식으로 런타임시에 동적으로 기능 추가, 확장하게 된다. 서브클래싱 방식은 클래스 상속을 사용하게 되는데 상속으로 구현시, 서브클래..

[C#] Winform 콤보박스를 이용한 학점계산기 만들기

학점계산기를 만들어보았다. 구현 사항 1) 교과목, 학점, 성적을 표시하는 컨트롤 배열 2) Form1_Load() 메서드는 6개 교과목을 입력, 학생마다 신청과목이 다를 수 있으므로, 실행 화면에서 수정 3) 학점, 성적, 교과목을 표시하는 콤보박스와 텍스트박스의 배열 초기화 4) 학점, 성적 콤보박스에 표시될 Item을 배열로 만듬 5) 학점 콤보박스 배열 crds의 각 요소에 대해 arrCredit의 각 요소를 Items로 등록 후, 최초 3을 SelectedItem으로 지정 6) 성적 콤보박스 배열 grds의 각 요소에 대해 lstGrade 리스트의 각 요소를 Items로 등록 7) "평균평점" 버튼을 클릭시, 실행 되는 메서드 제작 8) totalSocre는 각 과목의 학점수와 성적을 곱한 값의..

[C#] Bridge 패턴

카테고리 : 구조 패턴 개요 : Brdige 패턴은 실제 로직을 담은 구현 클래스를 직접 호출하는게 아닌, 이 구현체로 부터 추상층 클래스를 분리하여 클라이언트는 이 추상층 클래스를 거쳐 구현체 클래스를 사용하는 방식이다. Bridge 패턴은 클래스 자체와 그 클래스가 동작하는 구체적인 구현 내용을 분리하는 것으로, 클래스 자체는 추상화 하여 추상층 클래스로 만들고, 클래스가 실제 무슨 일을 하는 지는 별도의 구현체 클래스로 만들게 된다. 일반적인 객체지향 프로그래밍(OOP)에서의 서브클래스들은 상위의 부모/추상 클래스를 상속하여 서브클래스에서 다른 행위들을 정의하게 된다. 이러한 객체지향 프로그래밍의 서브클래스 상속은 컴파일 시, 부모/ 추상 클래스(abstraction)가 구현체인 서브클래스(impl..

[C#] Adapter 패턴

카테고리 : 구조 패턴(Structural Pattern) 개요 : Apater 패턴은 기존 라이브러리/시스템의 기능을 사용하고자 할 때, 그 인터페이스가 현재 시스템과 맞지 않을 때, 중간 Adapter 인터페이스를 통해 여러 다양한 시스템들을 바꿔가며, 사용하고자 할 때 사용됨 즉, 현재 시스템과 사용하고자 하는 시스템 간의 호환되지 않는 인터페이스를 중간에 Adapter 인터페이스를 사용하여 연결해 주는 디자인 방식이다. 기존 클래스의 코드를 수정하지 않으며, 다른 클래스와 연동해서 사용할 수 있도록 사용하는 곳에 사용됨 예를 들어 C타입 충전기를 7-pin이나 5-pin 기기와 연결하려면 변환해주는 어뎁터가 필요하다 ㅇ이러한 어뎁터를 사용한다면, 따로 충전기를 구매하지 않아도 사용이 가능하게 된다..

[C#] Object Pool 패턴

Object Pool 패턴 카테고리 : 생성패턴 개요 : 어떤 객체는 생성 시, 오랜시간이 걸리기도 하며, 그 일 자체가 성능에 영향을 미칠 수 있다. 이런 경우, 재사용한 가능한 객체들을 Object Pool 에 넣어 두고 클라이언트가 객체들을 다시 사용하도록 하는 것을 Object Pool 디자인 패턴이라 한다. 사용할 객체를 그때 그때 생성하고 소멸하는 것이 아니라, Pool에 객체를 저장해두고 이를 꺼내서 사용하는 방식이다. 클라이언트로 부터 객체 요청이 오면, Pool에 사용 가능한 객체가 있는지 보고, 재사용 가능한 객체가 있다면 객체를 리턴하고, 만약 없으면 새로 객체를 생성하여 리턴한다. 클라이언트가 객체 사용을 끝내면, 객체를 소멸시키지 않고, 그 객체를 다시 Pool에 리턴하게 된다. ..

[C#] ThreadPool & EventWaitHandle 기초

System.Threading.ThreadPool 스레드 동작 방식은 Thread 타입의 생성자에 전달되는 메서드의 코드 유형에 따라 크게 두가지로 나뉜다. 1. 상시 실행 - 스레드가 일단 생성되면 비교적 오랜 시간 동안 생성돼 있는 유형, 예를 들어 특정 디렉터리의 변화를 감시하는 스레드가 필요하면 이는 그 동작이 필요 없어질 때까지 스레드가 유지돼야 함 2. 일회성의 임시 실행 - 특정 연산만 수행하고 바로 종료되는 유형 상시 실행이 되는 유형을 위해서는 스레드를 생성하는게 당연하지만, 일회성 실행에 있어서 스레드를 생성하는 것은 자원낭비로 이어진다. 임시적인 목적으로 원할 때, 스레드를 사용할 수 있도록 만든 것이 스레드 풀(Thread Pool)이다. 프로그래밍에서 풀(pool)이라는 용어는 일..

[C#] VSPE를 사용한 Serial통신 구현 - 2

https://datasirup.tistory.com/198 [C#] VSPE를 사용한 Serial통신 구현 - 1 Serial 통신이란? 시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식이며, 컴퓨터나 마이크로컨트롤러 등의 디지털 장치 간에 데이터를 주고받을 때 널리 사용된 datasirup.tistory.com 지난 포스팅에서 VSPE를 이용해서 시리얼통신의 동작을 확인해봤다. 이번에는 C# 콘솔 프로그래밍을 통해서 송신과 수신을 구현해보자 Serial 통신은 C#에서 기본적으로 제공해준다 System.IO.Ports에서 사용이 가능하다. SerialPort_DataReceived 메서드를 통해서 데이터를 읽고 이것을 누적해서 보여줄 수 있도록 한..

[C#] VSPE를 사용한 Serial통신 구현 - 1

Serial 통신이란? 시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식이며, 컴퓨터나 마이크로컨트롤러 등의 디지털 장치 간에 데이터를 주고받을 때 널리 사용된다. 대중적인 장치들은 USB 타입의 연결을 많이 지원하지만 테스터와 같이 산업용 장치들에서는 안전성 때문에 여전히 많이 쓰인다. 시리얼 통신은 주로 두 장치 간에 직렬로 데이터를 전송하는 방식으로 이루어진다. 각 장치는 하나 이상의 시리얼 포트(일반적으로 UART(Universal Asynchronous Receiver/Transmitter) 포트)를 통해 연결되며, 데이터는 일련의 비트로 전송된다. 일반적으로 시리얼 통신에서는 데이터 비트의 길이(일반적으로 8비트), 정지 비트의 수(보통 1..

[C#] WinForm을 활용한 계산기 만들기

WinForm에 익숙해지기 위해 기본적인 사칙연산을 수행하는 계산기 프로그램을 만들어 봤다 구현사항 - 버튼의 이벤트 처리 - 계산 로직 - 결과 표시 - 오류 처리 - 소수점 계산등의 추가기능 나누기 버튼 예시 - 사칙연산 버튼 클릭 시 어떤 계산을 수행할지 currentOperator 변수에 Operator Enum을 설정하고(Add, Sub, Mul, Div 중 하나), 계산과정 창에 수행할 계산 기호 추가함 public partial class Form1 : Form { enum Operators { None, Add, Sub, Mul, Div, Res } Operators currentOperator = Operators.None; } private void ButtonDivide_Click(o..