전체 글(76)
-
유니티 C# 버전 바꾸는 법
파일 스코프 네임스페이스를 쓰니까 버전 올리라는 경고가 떴다. 해결한 김에 기록해둔다. Edit -> ProjectSetting -> Other Setting -> Additional Compiler Arguments에 아래 사진처럼 -langversion:10.0을 추가하고 Apply 해주기
2026.06.09 -
소프트웨어 설계
최근에 회사에서 복잡한 시스템을 구현해야 했는데, 시간은 촉박하게 줘서 곤란했던 적이있었다. 그렇게 와다다다 구현을 하다보니, 이게 품질 좋은 코드가 맞을까하는 의문이 생겼다.그리고 동료 프로그래머나 미래에 내 코드를 유지보수할 프로그래머가 잘 이해할 수 있을지 염려가 되었다. 그래서 품질 좋은 코드가 뭐였는지 다시 고민해보고자, 예전에 가볍게 읽었던 코드 컴플리트라는 책을 꺼내서 고품질 코드 작성에 대한 부분을 복습했다. 공부하는 김에 블로그에 정리해보고자 한다. 소프트웨어 설계"소프트웨어 설계" - 컴퓨터 소프트웨어에 대한 명세를 동작 가능한 소프트웨어로 변환하기 위한 구상이나 창작, 도구를 뜻한다.설계는 규모가 큰 프로젝트에서는 꼭 필요한 작업이며, 작은 프로그램에서도 유용하다. 하지만 설계는 쉽지..
2026.05.23 -
동시성 컬렉션 (Concurrenct Collection)
프로그래머는 프로그램을 만들 때, 다양한 자료구조를 사용해서 데이터를 저장하고 그 데이터를 사용합니다.이러한 자료구조를 컬렉션이라고도 하는데요. 멀티스레딩 환경에서는 이 자료구조가 공유 자원이 되는 경우가 흔합니다.이때 여러 스레드에서 쓰기가 포함된 동시 접근이 발생한다면, 자료구조가 깨지거나 내부 데이터가 오염될 수 있습니다.따라서 동기화 전략이 반드시 필요한데요, 단순히 lock을 잡을 수는 있지만 성능 저하가 발생할 수 있습니다.고부하 환경과 고성능이 요구되는 환경에서는 lock으로는 성능을 만족시키기 어려울 수 있습니다. 이 때 .NET이 제공하는 동시성 컬렉션을 활용하면, 직접 복잡한 세밀한 락이나 락 프리 알고리즘을 짜지 않더라도 스레드 세이프한 컬렉션을 쓸 수 있습니다. 먼저 Concurre..
2026.05.20 -
async/await과 Exception
비동기 코드를 사용할 때 예외 처리를 어떻게 하는게 좋을지에 대한 내용을 공부하고 정리했습니다. 기본적으로 예외는 콜 스택을 따라서 위로 전파됩니다.그런데 비동기 코드에서 콜백 함수는 콜 스택을 따르지 않죠... 나중에 실행되고, 때로는 다른 스레드에서 실행되기 때문입니다. async/await을 쓸 때 예외에 관련된 내용은 비동기 코드가 직관적이지 않은 방식으로 실패하는 모든 상황을 디버깅할 때 중요합니다. 예외의 동작간단하게 예외에 대해 설명하겠습니다.예외가 던져지만, 예외는 콜스택을 따라 올라갑니다. 만약에 올라가다가 try 블록과 적절한 catch 구문을 만나면, 제어는 catch로 넘어가게 됩니다.만약에 콜 스택의 시작점까지 예외가 전파된다면 프로그램은 크래시되죠 async / await에서의 ..
2026.05.20 -
await 이후의 코드는 누가 실행하는 걸까
async/await는 컴파일러의 코드 변형을 통해서, 쉽게 비동기 코드를 동기 코드처럼 보이게 프로그래밍을 할 수 있게 해줍니다.그런데 문득 이런 궁금증이 들었습니다. await 다음에 나오는 Task가 완료된 후에는 그 이후의 코드(Continuation)를 어떤 스레드가 실행 해주는 걸까? 위 질문에 대한 답을 찾으려면 SynchronizationContext라는 클래스를 이해해야 합니다. SynchronizationContext이 클래스의 본직은 "작업 배송 담당자"입니다.특정 스레드나 특정 환경(Context)로 코들르 보내서 실행해주는 역할이죠 이게 왜 필요했을까요?윈도우 UI 프레임워크나 Unity같은 게임 엔진에서 UI 요소를 조작하는 것은 오직 '메인 스레드'만 할 수 있다는 규칙 때문에..
2026.05.19 -
Task : 비동기 프로그래밍
Task와 async/await: 진동벨로 이해하는 비동기 프로그래밍C# 비동기 프로그래밍에 있어서 Task는 굉장히 중요한 개념입니다. 쉽게 말해, Task는 "미래에 완료될 작업"을 표현하는 객체입니다. 만약 미래에 완료될 작업이 어떤 결과물(반환값)을 준다면 Task를 사용하며, 이때 T는 반환값의 타입을 의미합니다.Task의 핵심은 파일 I/O나 네트워크 I/O처럼 CPU보다 훨씬 느리지만 기다려야만 하는 작업이 있을 때, "요청만 던져놓고 바로 다른 일을 하러 갈 수 있다"는 점에 있습니다. 실생활 예시: 카페에서 커피 주문하기이해가 쉽도록 우리가 카페에 갔을 때의 상황을 비동기 프로그래밍과 매칭해 보겠습니다.커피를 고르고 주문합니다. (비동기 작업 요청)점원에게 진동벨을 받습니다. (Task ..
2026.05.17