C#/TIL(Today I Learned)16 2025-04-26 <Action과 Func와 람다 함수> Func와 Action의 차이점Func와 Action은 C#에서 제공하는 델리게이트 타입이다.델리게이트는 메서드를 참조하는 타입으로, 코드를 외부로부터 받아 실행할 수 있게 해준다.두 타입은 구조는 비슷하지만 반환값 유무에 따라 역할이 다르다.Func반환값이 있는 델리게이트다.기본 형태는 Func이다.매개변수들을 입력받아, 마지막 타입으로 명시된 반환값을 리턴한다.예시:Func add = (a, b) => a + b;int result = add(3, 4); // result = 7위는 int 두 개를 받아서 int 하나를 반환하는 Func이다.Action반환값이 없는 델리게이트다.기본 형태는 Action이다.입력받은 매개변수로 작업만 수행하고 반환값은 없다.예시:Action greet = name =>.. C#/TIL(Today I Learned) 2025. 4. 26. 2025-04-26 <형변환> C#에서 as, is, 명시적 형변환 정리1. as 형변환as 키워드는 참조 타입 또는 nullable 값 타입끼리 변환할 때 사용한다.타입 변수 = 식 as 타입;변환 성공 시: 변환된 객체를 반환한다.변환 실패 시: 예외를 발생시키지 않고 null을 반환한다.예시object obj = "Hello World";string str = obj as string;if (str != null){ Console.WriteLine(str);}특징실패해도 프로그램이 죽지 않는다.단, 변환 후에는 null 체크가 필수이다.값 타입에는 사용할 수 없다.2. 명시적 형변환 (Explicit Cast)명시적 형변환은 (타입) 형태로 개발자가 직접 변환을 지시하는 방식이다.(타입)식변환 성공 시: 변환된 객체를 반환.. C#/TIL(Today I Learned) 2025. 4. 26. 2025-04-24 <박싱과 언박싱> 박싱(Boxing)과 언박싱(Unboxing) 이해하기C#과 같은 .NET 기반 언어에서는 값 타입(value type)과 참조 타입(reference type)의 개념이 뚜렷하다.이 두 타입 간의 상호작용 중 중요한 개념이 박싱(Boxing)과 언박싱(Unboxing)이다.박싱(Boxing)이란?박싱은 값 타입을 참조 타입으로 변환하는 과정이다.예를 들어, int, float, bool과 같은 값 타입을 object 형식으로 취급하고자 할 때 발생한다.박싱이 일어나면, 값 타입의 데이터를 Heap(힙) 메모리에 할당하고, 그 참조를 object 타입 변수에 저장한다.int number = 123;object obj = number; // 박싱위 코드에서 number는 값 타입이고, obj는 참조 타입.. C#/TIL(Today I Learned) 2025. 4. 24. 2025-04-23 <const와 readonly> const (상수)const는 컴파일할 때 값이 결정되는 상수다.따라서 선언과 동시에 초기화되어야 하며, 모든 인스턴스에 대해 공통인 특징을 가지고 있다.(마치 static처럼)값 타입과 문자열만 가능하며, 런타임 값(예 : DateTime.Now)으로는 초기화할 수 없다.const int MaxPlayerCount = 4;const string Greeting = "Hello, world!";만약 다른 프로젝트에서 참조하는 라이브러리의 const 값이 바뀌면, 해당 라이브러리를 참조한 프로젝트는 다시 컴파일해야 반영된다.readonly (읽기 전용)readonly도 const와 마찬가지로 한 번 초기화하면 값을 바꿀 수 없지만,const에 비해 초기화 시기와 할당 가능한 값의 범위가 유연하다.요컨대 r.. C#/TIL(Today I Learned) 2025. 4. 23. 2025-04-19 <ArraySegment> ArraySegment에 대하여System.ArraySegment는 .NET에서 제공하는 제네릭 구조체로,배열의 일부를 참조할 수 있게 해주는 기능이다.이 구조체는 실제 배열을 복사하지 않고동일한 배열 내의 특정 부분을 슬라이스(slice)하여 사용할 수 있기 때문에,메모리 효율성, 성능, 구현의 간결성 측면에서 유리하다.1. ArraySegment란?ArraySegment는 내부적으로 다음과 같은 세 가지 정보를 가진다.Array: 실제 배열 참조Offset: 세그먼트의 시작 인덱스Count: 세그먼트의 길이즉, ArraySegment는 원본 배열의 특정 범위를 "참조"하는 뷰(view)로 볼 수 있다. 배열 복사가 일어나지 않기 때문에 대용량 데이터를 처리할 때 매우 유용하다.선언 예시byte[] b.. C#/TIL(Today I Learned) 2025. 4. 19. 2025-04-18 <SocketAsyncEventArgs 이해하기> 고성능 비동기 소켓 서버의 핵심, SocketAsyncEventArgs.NET에서 수많은 클라이언트의 연결을 동시에 처리하려면 비동기 네트워크 프로그래밍이 필수이다.특히 서버 사이드 개발에서는 효율성과 성능이 무엇보다 중요하다. 이를 위해 .NET은 IOCP(입출력 완료 포트) 기반의 고성능 네트워크 프로그래밍을 제공하며,이때 중심에 있는 클래스가 바로 SocketAsyncEventArgs이다. 이번 글에서는 이 객체가 실제로 어떻게 활용되는지 예제 코드를 바탕으로 설명하고, 그 기반이 되는 스레드와 IOCP에 대한 개념도 함께 정리한다.1. 비동기 네트워크 구조의 배경: 스레드와 IOCP스레드는 왜 중요한가?스레드는 프로그램이 CPU에서 작업을 수행하는 실행 단위이다. 일반적인 소켓 서버에서 각 연결당.. C#/TIL(Today I Learned) 2025. 4. 18. 2025-04-18 <C# 비동기 멀티스레드 서버 구현하기> 1. 개요TCP 서버는 클라이언트와의 안정적인 연결을 제공하기 위한 기본적인 통신 구조이다.특히 C#에서는 System.Net.Sockets 네임스페이스를 통해 비교적 간단하게 TCP 서버를 구현할 수 있다.그러나 단일 스레드로는 여러 클라이언트를 동시에 처리하기 어렵기 때문에,멀티스레드 구조를 도입하여 동시성(concurrency) 을 확보하는 것이 중요하다.이 글에서는 C#으로 멀티스레드 TCP 서버를 구성하는 방법을 설명한다.2. 기본 구조Node.js로 서버를 구현할 때와 마찬가지로, 소켓 프로그래밍의 흐름은 언제나 비슷하다. 소켓을 만들고 서버가 사용할 IP 주소와 포트 번호를 결합한다.해당 포트에서 연결 요청이 수신되는지 주시(listen)한다.클라이언트가 접속하면 전용 게임 세션을 생성하고.. C#/TIL(Today I Learned) 2025. 4. 18. 2025-04-07 <캐시 철학에 대하여> 캐시 철학: Temporal vs. Spatial Locality캐시(Cache)는 컴퓨터 시스템에서 자주 접근되는 데이터를 임시로 저장해두는 저장소로, 성능을 극적으로 향상시킬 수 있는 중요한 개념이다. 캐시의 핵심 철학은 지역성(Locality) 이라는 개념에 기반을 두고 있다. 지역성에는 크게 두 가지 종류가 있으며, 이를 각각 시간 지역성(Temporal Locality) 과 공간 지역성(Spatial Locality) 이라고 한다.이 글에서는 이 두 가지 지역성의 개념과 그 철학이 어떻게 캐시 설계에 영향을 미치는지를 설명하고자 한다.1. 시간 지역성 (Temporal Locality)시간 지역성이란 한 번 접근된 데이터는 가까운 미래에 다시 접근될 가능성이 높다는 개념이다.예를 들어, 루프 내.. C#/TIL(Today I Learned) 2025. 4. 7. 2025-04-03 <DotNetEnv 패키지 활용법> C#에서 .env 파일을 사용하는 방법 - DotNetEnv 패키지 활용법C# 프로젝트에서 설정값을 관리할 때는 일반적으로 appsettings.json 또는 환경 변수를 사용한다. 하지만 Node.js처럼 .env 파일을 활용하여 설정을 외부화하고 싶을 때는 DotNetEnv 패키지를 사용할 수 있다. 이 글에서는 DotNetEnv 패키지를 이용해 .env 파일을 불러오고, 이를 코드에서 읽어 구조체 혹은 클래스로 바인딩하는 방법까지 정리한다.1. DotNetEnv란?DotNetEnv는 .env 형식의 환경 변수 파일을 읽어 시스템 환경 변수처럼 사용할 수 있게 해주는 경량 패키지이다. JavaScript의 dotenv와 매우 유사한 사용법을 제공한다.설치는 NuGet을 이용하면 된다.dotnet ad.. C#/TIL(Today I Learned) 2025. 4. 3. 2025-04-02 <Race Condition 해소를 위한 전략> 🔒 BASIC1. Monitor (lock)C#의 대표적인 임계 구역(critical section) 보호 방법.한 번에 하나의 스레드만 진입 가능.내부적으로 Monitor.Enter()와 Monitor.Exit() 호출.유저 모드에서 동작하므로 오버헤드는 낮고 빠르지만, 블로킹이 발생하면 결국 커널 모드로 전환됨.lock (myLockObj){ // 임계 구역}💪 근성 (계속 들이대는 방식)1. SpinLocklock과 유사하지만 스레드가 잠금을 얻을 때까지 CPU를 계속 소비하며 반복 검사(spin)함.커널 모드 진입 없이 작동하기 때문에 짧은 시간 동안만 잠금이 필요한 경우 고성능.다만, 장시간 락을 잡고 있으면 CPU 점유율 급등 가능.SpinLock spinLock = new SpinL.. C#/TIL(Today I Learned) 2025. 4. 1. 2025-03-24 <C# 스택 클래스와 성능 최적화> C# 스택 클래스와 성능 최적화에 대하여큐(Queue)와 스택(Stack)의 성능 비교하기큐와 스택의 차이점은 명확하다.큐는 선입선출이고, 스택은 후입선출의 구조를 가진 자료형이다.사실 이런 건 너무 흔히 알려진 개념이라, 굳이 블로그에까지 정리할 필요는 없을 것이다.대신 오늘의 글에서 정리해보고 싶은 건 큐와 스택의 원리에 의해 벌어지는 성능 차이에 대한 것이다.예를 들어보자.큐와 스택을 구현해야 한다고 했을 때 가장 간단한 방식은 무엇일까.아마 배열을 고르는 게 보편적일 것이다.index : [0] [1] [2] [3] [4]value : 4 9 2 5 0 여기서 Dequeue() 혹은 Pop()을 사용해본다고 상상해보자.4번 인덱스의 0을 넣었다 빼는 건 다른 인덱스 요소에 아무런 .. C#/TIL(Today I Learned) 2025. 3. 24. 2025-03-21 <해시 테이블(Hashtable)이란?> 해시 테이블(Hashtable)이란?해시 테이블은 (Key, Value) 쌍으로 데이터를 저장하며, key를 해시 함수(Hash Function) 에 넣어서 나온 해시 값을 기반으로 데이터를 저장하거나 검색하는 구조이다.작동 원리해시 함수(Hash Function)Key를 받아서 정수 인덱스로 변환해주는 함수이다.예: "apple" → 해시 함수 → 42이 인덱스를 이용해 내부 배열의 위치를 정한다.배열(Array)해시 테이블은 내부적으로 배열을 사용한다.배열의 인덱스는 해시 함수의 결과로 결정된다.이 때문에 평균적으로 O(1)의 성능으로 접근 가능하다.충돌(Collision)서로 다른 키가 같은 해시 값을 가질 수 있다.이를 해시 충돌이라고 부르며, 이를 처리하는 방식이 중요하다.충돌 해결 방식체이닝(.. C#/TIL(Today I Learned) 2025. 3. 21. 이전 1 2 다음