본문 바로가기
반응형

65

Effective C# - Item 8 이벤트 호출 시에는 null 조건 연산자를 사용하라 이벤트를 호출하는 경우 다양한 문제가 발생할 수 있다. 이벤트를 호출할 때 이벤트 핸들러가 결합되어 있지 않은 경우에 대한 처리는 C# 6.0에서 추가된 null 조건 연산자를 사용하여 간단하게 처리할 수 있다. 이전에는 이벤트 핸들러가 결합되어 있는지 확인하기 위해 직접 null 체크를 하고 호출하는 방식이 많이 사용되었는 이 방식은 두 단계로 이루어져 있기 때문에 경쟁 조건이 발생할 가능성이 있습니다. 코드로 알아보기 01 Null 체크 안하는 경우 public class EventSource { private EventHandler Updated; public void RaiseUpdates() { counter++; Updated(this,counter); } private int counter;.. 2023. 11. 22.
Effective C# - Item7 델리게이트를 이용하여 콜백을 표현하라 콜백(Callback) 동기적인 상황에서 어떤 이벤트나 작업의 완료를 알리거나 처리 결과를 전달하는 방식으로 사용된다. C#에서 콜백은 대부분 델리게이트(delegate)를 사용하여 구현된다. 델리게이트는 메서드에 대한 형식 안전한 참조를 제공하며, 비동기적인 상황에서 콜백을 수행하기 위해 이를 활용할 수 있다. 델리게이트(Delegate) C# 문법 - Delegate(대리자) 1. Delegate 형식은 형식인데, 함수 자체를 넘겨주는 그런 형식! callback 형식 함수 자체를 인자로 넘겨주고 함수를 호출한다. 예시) 사장님(Function)의 비서(Delegate)에게 연락을 요청하지만 받지 않아 code-piggy.tistory.com 콜백과 델리게이트는 C#이 제공하는 관용구의 하나이며 람다.. 2023. 11. 22.
컴퓨터 구조 - 명렁어 사이클,인터럽트, 예외,하드웨어 인터럽트, 인터럽트 서비스 루틴 CPU가 하나의 명령어를 처리하는 과정에는 정해진 흐름이 있고 그 흐름을 반복하며 명령어들을 처리해 나간다. 하나의 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 한다. CPU는 정해진 흐름에 따라 명령어를 처리해 나가지만 간혹 이 흐름이 끊어지는 상황이 발생한다. 이를 인터럽트라고 한다. 명령어 사이클 프로그램은 수많은 명령어로 이루어져 있고 CPU는 이 명령어들을 하나씩 실행한다. 이때 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 명령어 사이클(instruction cycle)이라고 한다. 즉 프로그램 속 각각의 명령어들은 명령어 사이클이 반복되며 실행한다. 01 인출 사이클(fetch cycle) 메모리에 있는 명령어를 CPU로 가져오기 02 실행 사이클(exe.. 2023. 11. 22.
컴퓨터 구조 - 레지스터(프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터등), 스택 주소 지정방식, 변위 주소 지정 방식 프로그램 속 명령어와 데이터 실행 전후로 반드시 레지스터에 저장된다. 따라서 레지스터에 저장된 값만 잘 관찰해도 프로그램의 실행 흐름을 파악할 수 있다. 다시 말해 레지스터 속 값을 유심히 관찰하면 프로그램을 실행할 때 CPU내에서 무슨 일이 벌어지고 있는지 어떤 명령어가 어떻게 수행되는지 알 수 있다. 그러므로 레지스터만 잘 관찰해도 프로그램의 자세한 실행 과정을 알 수 있다. 상용화된 CPU속 레지스터들은 CPU마다 이름, 크기, 종류가 매우 다양하다. 대부분의 CPU들이 공통적으로 가지고 있는 레지스터들에 대해 알아보자 01 프로그램 카운터(PC, Program Counter) 기능 : 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장하고 다음에 실행될 명령어의 위치를.. 2023. 11. 19.
Effective C# - Item6 nameof() 연산자를 적극 활용하라 부산 시스템의 대중화로 인해 여러 시스템 간에 데이터를 주고 받아야하는 일이 늘어났다. 이는 서로 다른 플랫폼과 다양한 언어로 개발된 프로그램 간에 데이터 교환의 필용성을 증가시키고 있다. 이름이나 문자열 식별자를 활용하는 간다한 라이브러리들이 이러한 차이를 극복하는데 사용된다. 방법은 간편하지만 그에 준하는 추가 비용이 발생하며 타입 정보 손실의 주요 단점을 가지고 있다. 이로 인해 동적 타입 언어의 유연성은 얻을 수 있지만 정적 타입 언어의 주요 장점 중 하나인 타입 정보를 활용한 개발 도구의 지원을 받지 못한다. 그렇게 탄생된 것이 nameof()라는 연산자이다. nameof()연산자 프로그램의 요소의 이름을 문자열 형태로 변환하는 역할을 한다. 이를 이용하면 코드의 유지보수가 용이해지고 디버깅이 .. 2023. 11. 19.
컴퓨터 구조 - ALU,플래그,제어장치 ALU 01 받아들이는 정보 레즈스터로부터 피연산자를 받아들여 데이터를 일시적으로 저장하고 제어장치로부터 제어 신호를 받아들이면서 어떤 종류의 연산을 수행할지에 대한 정보를 담는다. 그리고 그 결괏값을 레지스터에 보낸다. 결괏값은 숫자가 될 수도 있고 문자가 될 수도 있고 주소가 될 수도 있다. 02 내보내는 정보 CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느립니다. ALU가 연산할 때 마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접하게 되고 이는 CPU프로그램 실행 속도를 늦출 수 있다. 그래서 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장하는 것이다. 플래그 연산 결과에 대한 부가 정보이다. 이렇게 내보내진 정보는 플래그 레지스터라고 하는 특수한 .. 2023. 11. 18.
반응형