C# - Class vs Struct구조적 차이점“값 복사 비용이 크면 struct 대신 class로 바꾸면 되지 않나?”“in 키워드로 참조 전달이면 struct도 사실상 class 아닌가?” C#에서는 Class와 Struct가 겉보기엔 비슷하게 보이지만, 그 내부 동작과 철학은 완전히 다르다.일반적으로는 값 전달 방식의 차이와 복사값의 차이(class는 얕은 복사(주소), struct는 깊은 복사(값) 발생)가 있다. in struct는 단순한 최적화가 아니라, “값형의 의미를 보존하면서 복사를 회피” 하는 언어적 장치이다. 이 차이를 이해하면 성능과 설계 안정성 모두를 잡을 수 있다. 항목 Class Struct 저장 위치힙(Heap)스택(Stack) 또는 인라인전달 방식참조 전달값 전달(복사)G..
C# 읽기 전용 참조 전달 (in 키워드) in 키워드 C#에서 값 형식(struct, int, float 등)을 메서드 인자로 전달할 때는 기본적으로 값 복사(by value) 가 일어난다. 이는 작은 구조체라면 상관없지만, 구조체의 크기가 커질수록 복사 비용이 눈에 띄게 커진다. in 키워드는 이러한 복사 비용을 줄이면서도 읽기 전용으로 참조를 전달할 수 있게 해준다. 즉, “성능 + 안전성” 두 가지를 동시에 잡는 키워드입니다. void Process(in LargeStruct data) { // data를 복사하지 않고 참조로 읽음 Console.WriteLine(data.Value); // data.Value = 100; ❌ 컴파일 에러 (읽기 전용)} 전달 방식 비교값 전달 ..
박싱과 언박싱 (Boxing & Unboxing) 박싱과 언박싱은 메모리 영역을 공부하면 알게되는 기법으로 값 형식의 데이터를 참조 형식으로 변환하는 과정을 박싱, 그 반대를 언박싱이라 한다. 박싱 (Boxing) 이해하기 쉽게 말하면, C#은 모든 객체의 최상단에 object가 있다. 즉, 모든 자료형은 object로 변환될 수 있다. 이러한 상황에서 int형 변수를 object로 바꾸어 보면 박싱이 되는 것이다. 박싱 (Boxing) int value = 42; // 값 타입 변수를 선언하고 초기화 object boxedValue = value; // 값 타입을 참조 타입으로 박싱하여 저장 주의할 점은 단순히 스택에서 힙으로 값을 복사하는 것이 박싱이 아니다. 클래스 객체를 new로 만들어 힙영역에 ..
메모리 풀링 (Memory pooling) 풀링이라는 단어 자체를 외우는 편이 좋다. 풀링은 특정 목적의 객체를 미리 특정 크기 혹은 갯수만큼 미리 생성/할당하고 필요에 따라 사용할 수 있도록 제공하고 사용이 끝나면 회수하여 다시 사용할 수 있도록 대비하는 것이다. (사용과 회수 과정에서는 필요에 따라 초기화 단계가 추가될 수 있다.) 대표적인 예로는 게임을 제작에 최적화를 위해 자주 사용되는 오브젝트 풀링 기법이나 게임 서버에서 자주 사용되는 IOCP가 있다. 목적 메모리 할당 및 해제는 많은 비용이 발생한다. 이는 메모리 단편화(fragmentation) 현상을 초래하여 성능저하에 큰 원인이 되기에 이러한 과정을 최소화할 수 있는 풀링 기법들이 다양한 부분에서 만들어졌다. 메모리풀링 기법들은 미리 만..