C# 53

Memory Barrier

최적화는 비단 컴파일러만 수행하는 것이 아닌 하드웨어에 의해서도 수행됩니다.하드웨어가 판단하기에 빠르게 처리할 수 있는 코드의 경우 기존의 순서를 무시하고 우선 처리하게 됩니다,이는 싱글 스레드에서는 의미가 없지만,여러 개의 스레드가 각기 다른 작업을 처리하는 멀티 스레드 환경에서는 매우 큰 위험이 됩니다. 아래의 코드를 한번 살펴보겠습니다.class Program{ static int x = 0; static int y = 0; static int result1 = 0; static int result2 = 0; static void Thread_1() { y = 1; result1 = x; } static void Thread_2()..

C# 2024.11.27

캐싱

컴퓨터에서 CPU의 코어는 다음과 같이 구성되어 있습니다. ALU는 연산을 수행하는 장치이고,L1/L2 캐시의 경우 캐싱을 수행하는 장치입니다. 캐싱은 기록하는 작업을 의미하는데 캐싱을 수행하는 이유는 다음과 같습니다.RAM은 변동 사항을 반영해야 하는 메모리입니다.이때 변동 사항이 들어올 때마다 반영하는 것은 매우 비효율적인 작업입니다.따라서 어느 정도 기록을 한뒤에 한번에 모아서 반영하는 것이 훨씬 효율적입니다.그렇기에 캐싱이 수행됩니다. 캐싱은 2가지의 기준을 세워 수행합니다.하나는 시간적인 기준이고, 다른 하나는 공간적인 기준입니다. 시간적인 기준은 다음과 같습니다.가장 최근에 발생한 변동에서 또 다른 변동이 생길 가능성이 높으므로 가장 최근에 발생한 변동을 캐싱합니다.이를 영어로는 Tempora..

C# 2024.11.27

C#에서 쓰레드를 생성하는 방법

C#에서 멀티쓰레드를 생성하고 이를 사용하는 방법을 알아보겠습니다.C#에서는 대표적으로 3개의 방법이 있는데 각각의 방법과 사용예제를 한번 살펴보겠습니다. 1) ThreadThread 스레드이름 = new Thread(수행함수); 위와 같은 형태로 스레드를 생성하는 방법입니다.스레드를 원하는 만큼 만들수는 있지만,Core가 작업을 할당해야 하는 스레드가 늘어나는 것이므로 부하가 발생할 수 있습니다. 따라서 멀티스레드 프로그래밍에서는 권장하지 않는 방법입니다. 사용예제는 다음과 같습니다. class Program { static void AddedThread(object state) { for(int i = 0; i  main 스레드 외에 Added ..

C# 2024.11.25

람다식

이번 포스트에서는 C#에서의 람다식 활용법에 대해 알아보겠습니다.C++과 마찬가지로 C#에서도 람다는 일시적으로 사용되는 함수를 구현하는 경우에 사용됩니다. 그렇다면 람다식을 사용함으로써 얻는 이점을 실제 예제를 통해 알아보겠습니다. 예제에서 탐색할 대상이 되는 클래스는 위에서 보이는 Client 클래스입니다.이제 기본적으로 실행되는 클래스 Program으로 넘어가보겠습니다. 위와 같이 구성되어 있습니다.이제 총 3가지의 델리게이트에 예약될 함수를 구현하는 과정을 통해 람다 함수의 사용방법과 그 이점을 알아볼 것입니다.이때 판별할 조건은 ClientNumber가 Two이거나, ClientType이 VIP인 경우라고 가정하겠습니다. 1) 조건판별함수를 작성하는 경우 위와 같이 조건 판별함수를 작성하였습니다..

C# 2024.09.28

이벤트 키워드

이전 포스트에서는 델리게이트에 아직 문제가 남아있다고 말씀드렸습니다.무엇이 문제인지 한번 확인해보겠습니다.  위와 같이 델리게이트를 호출해야 하는 함수가 아닌 외부에서 델리게이트를 호출할 수 있다는 문제가 존재합니다.실제 실행해보면  위와 같이 실행되는 것을 확인할 수 있습니다.지금의 코드에서는 단순히 로그를 찍는 코드이므로 큰 문제가 되지 않지만,사용자의 정보를 갱신하는 것과 같은 중요한 데이터를 다루는 코드라면 델리게이트는 아무렇게나 호출되어선 안됩니다.이는 코드의 흐름과 설계의 규칙에도 위배될 뿐만 아니라 프로그램의 데이터 역시 망가트릴 수 있습니다. 이러한 문제를 해결하기 위해 C#에서는 event 키워드를 제공합니다.event 키워드를 사용하는 경우에는 오직 구독한 존재만이 델리게이트를 호출할 ..

C# 2024.09.14

델리게이트

이번 포스트에서는 C#에서 제공하는 기능 중 하나인 델리게이트에 대해 알아보겠습니다.델리게이트는 delegate로 작성하며 대리자라는 의미를 가지고 있습니다. 델리게이트는 C++에서의 함수자나 함수 객체와 비슷한 역할을 수행합니다.하지만, 함수자나 함수 객체와 다르게 훨씬 더 사용이 간편하고 구현이 쉽다는 장점이 있습니다.이러한 장점으로 인해 C++ 기반인 언리얼 엔진에서도 자체적으로 델리게이트를 구현하여 사용합니다. 그렇다면 예제로 자세하게 알아보기 이전에 델리게이트를 조금 더 알아보겠습니다. 1) 델리게이트란?델리게이트를 한 줄로 표현하면 다음과 같습니다. 함수 자체를 인자로 넘겨 로직의 안에서 함수를 호출(=콜백)하는 구조 델리게이트를 사용하기 이전에 델리게이트에 대해 선언해야 합니다.선언할 때의 ..

C# 2024.09.14

attribute와 reflection

C#에서는 매우 유용하면서도 강력한 기능인 어트리뷰트와 리플렉션이 있습니다.이 2개의 기능은 C#을 베이스로 하는 게임엔진인 유니티에서 매우 유용하게 사용되고 있으며,특히 리플렉션의 경우, 데이터에 대한 안정성을 높여주는 만큼 C++ 베이스인 언리얼 엔진에서도 사용하는 기능입니다.따라서 이번 포스트에서는 이 2개의 기능에 대해 알아보고 사용예제 역시 한번 알아보겠습니다. 1) 간단한 정리어트리뷰트와 리플렉션에 대해 본격적으로 배우기 전에 간단하게 정리를 해보겠습니다.두 기능 모두 런타임과 관련이 있는 기능입니다. 리플렉션은 런타임 중에 클래스의 정보와 같은 데이터를 뜯어볼 수 있는 기능을 의미합니다.이는 데이터의 안정성 면에서 매우 중요한데, 런타임 중에 발생할 수 있는 여러 문제에 대해 대응할 수 있게..

C# 2024.09.07

C#의 예외처리

다른 개발 언어와 마찬가지로 C#에서도 예외에 대한 처리를 제공합니다.따라서 이번 포스트에서는 C#에서의 예외처리에 대해 알아보겠습니다. C#에서는 모든 예외처리는 Exception 클래스에서 상속됩니다.따라서 존재하지 않은 사용자 정의 예외를  처리하기 위해서는 반드시 Exception 클래스로부터 상속되야 합니다. 그리고 C#에서는 사용자 정의 예외말고도 시스템이 제공하는 예외들이 있는데,대표적으로 0으로 수를 나누는 경우에 발생하는 DivisionByZero 등이 있습니다. 예외를 처리하는 과정은 크게 3가지로 표현할 수 있습니다. 예외 발생 - 예외 처리 - 예외 이외의 실행 각각의 과정은 3가지의 대표 키워드로 대신할 수 있습니다. try - catch - finally 이때 하나의 catch ..

C# 2024.09.07

Nullable 키워드

이번 포스트에서는 저번 포스트의 프로퍼티에 이은 C#의 기능 중 하나인 Nullable 키워드에 대해 알아보겠습니다.혹시 iOS에 대해 배워보셨다면 Nullable 키워드에 대해 빠르게 이해할 수 있을 것이라 생각합니다.iOS의 주요 언어 중 하나인 swift에는 optional이라는 키워드가 있는데 매우 흡사한 역할을 하기 때문입니다.그렇다면 nullable 키워드에 대해 한번 알아보겠습니다. 1) nullable이란?nullable이라는 이름에서 알 수 있듯이 nullable은 하나의 변수에 대해 null과 null이 아닌 상태를 동시에 허용합니다.이를 통해 변수는 두 개의 상태를 가질 수 있으며, 이로 인해 변수가 시시각각 변하는 상황에서 유용합니다.그렇다면 예제를 통해 nullable 키워드를 어..

C# 2024.08.31