Python 개발자가 C#을 처음 접해보고 느낀 점
- 내 주력 언어는 단연 Python이다. 웹 애플리케이션 개발이나, 각 종 업무용 로컬앱 제작, AI 학습 및 추론, lora 제작 등 많은 작업을 파이썬으로 하고 있다.
- 그리고 Python만큼은 아니지만 어느정도 다룰 수 있는 언어가 javascript와 C++ 이다. 웹과 관련된 업무를 가장 많이 하는 나로서는 javascript는 싫어도 만날 수 밖에 없는 인연이고, 정말 임베디드 하드웨어를 하시는 분이 아닌이상 세상의 모든 개발자들 중에 javascript 를 조금이라도 다뤄본적이 없는 개발자는 없을 것 같다고 개인적으로 생각한다.
내가 좋아하는 영화의 유명한 대사를 빌리자면, "javascript actually... is everywhere." 라고 표현하고 싶다.
- C++ 은 어렵다. 하지만 리눅스를 다루다보면, 특히 aarch64 (arm64 아키텍처) 의 머신을 다루다보면 각종 패키지나 라이브러리를 직접 빌드하여 포팅해야하는 경우가 종종있다. 또한 파이썬의 느린 연산을 보완하기 위해 대부분의 파이썬 라이브러리는 사실 C++ 로 작성이된 바이너리를 파이썬으로 래핑만 해놓은 경우가 많다. 따라서 나처럼 파이썬 주력 + 리눅스 사용자라면 C++ 도 어느정도 다루게 되는 시점이 온다.
- 직접 C++를 다뤄보면 머리가 아픈 시점이 오는데, 바로 메모리 관리다. C++를 도전하는 사람들이 가장 먼저 좌절을 맛보는 부분이 이 부분이 아닐까 싶다. 포인터 및 메모리 가비지 관리는 고수준 인터프리터 언어를 편하게 사용하는 개발자들에게는 큰 허들이라고 생각한다.

C#을 접하게된 이유 : Unity
최근 [[Unity]] 작업을 시작해보게 되었다. 웹과 웹 브라우저를 좋아하기에 예전에 웹에서 돌아가는 2D 게임을 만들어서 배포해본 경험이 있다. "MAME RUN!!" 이라는 장애물 회피 기동을 하면서 목표를 향해 달리는 2D 횡스크롤 방식의 게임이었다.
등장인물과 스토리 서사가 내가 좋아하고 응원하는 일본의 아이돌그룹 "마메시바노 타이군"의 멤버 5명이 캐릭터로 등장하는 게임이었고, 순전히 "덕질"의 일환으로서 이들을 응원하는 기분을 전해보고 싶어서 3~4일 밤을 새워가면서 만든 게임이 있었다.
배포를 하고 X와 틱톡에 플레이 영상을 올렸었는데, 이 것이 의외로 상당한 반응과 관심을 받았다.
"마메시바노 타이군" 멤버들로부터도 'Likes'를 받았고, 많은 사람들이 실제로 찾아와서 플레이를 해줬다. 수백명이 찾아와서 상당한 수의 플레이를 해주었다. 이 반응이 꽤 신선했고 나에게 큰 동기부여가 되었다.
그러나 당시 배포했던 게임 MAME RUN!! 은 사실 나의 기획자료에는 스테이지 4까지 있고 그다음 엔딩까지 기획하였지만, 실제로는 스테이지 1밖에 구현하지 않았었다. 아직 사람들의 반응도 몰랐으니 일단 스테이지1까지만 만들어보고 사람들의 반응을 보자 라는 생각도 있었지만 그것보다도 더욱 큰 요인은 너무 힘들었다.
내가 구현한 방식은 완전 Vanilla javascript와 HTML5의 canvas기능 . 이 두 가지만으로 제작을 했었기 때문이다.
기획도 혼자, 캐릭터 디자인, 장애물, 백그라운드, 코인 등의 오브젝트 디자인도 혼자 하였고, 무엇보다도 게임엔진을 javascript로 직접 전부 제작했다.
스프라이트를 움직이는 애니메이션으로 만드는 로직, 중력 로직, 속도 로직, 게임 종료 로직, 시간 흐름에 따라 빨라지기, 점수계산, UI 와 인터랙션, 충돌, 게임종료판정, 게임종료시 이벤트, 장애물의 스폰 로직, 장애물의 랜덤 출현 로직 등등 게임플레이에 필요한 모든 로직을 직접 작성하다보니 다소 지쳤던 것도 사실이다.
그런데 문제는 스테이지1을 클리어하면 조만간 스테이지2를 만들겠다는 조그마한 UI 문구를 넣어서 플레이를 해준 사람들에게 약속을 해버리고 말았다는 것이 지금까지 나의 마음 한켠에 "부채의식"으로 계속 자리잡게 되었고, 이 부채의식에 대한 책임감이 결국 내가 Unity를 시작하게 된 계기가 되었다.
책임을 달성하기 위해
그런데 다시 그 지옥 같은 JS 엔진을 만질 엄두가 나지 않았다. 스테이지 2부터는 캐릭터 특수 능력과 아이템 등 구현해야 할 것이 더 많았기 때문이다.
그러다 문득 Unity나 Unreal Engine 같은 전문 도구를 쓰면 게임에 필요한 핵심 기능들이 이미 내장되어 있으니 훨씬 편하지 않을까 하는 희망을 품게 됐다. 사실 이전에도 이 툴들의 존재는 알았지만, C# 경험도 없고 왠지 거창해 보여서 "그냥 익숙한 JS로 대충 해보지 뭐" 하고 넘겼던 것이다.
하지만 MAME RUN!!을 제작하며 직접 부딪쳐보니 '생으로 만드는 고통'이 훨씬 크다는 것을 뇌가 학습해버렸다. 나는 고등동물인 인간이므로, 더 나은 도구를 고민하게 되었고 비록 C#/C++ 소굴일지라도 바닐라 JS보다는 낫겠지라는 생각으로 Unity를 새 파트너로 선택했다.
왜 Unity? Unreal 이 아니고?
사실 도구를 정할 때 망설였다. 조금이라도 익숙한 C++을 사용하는 언리얼엔진이 나으려나? 하는 마음도 조금은 있었다.
'잇힝... 난...C#..처음인걸..(부끄부끄)'
그래도 Unity로 결정한 명확한 이유가 있다.
-
사양의 한계: 내 작업 머신이 그리 고사양은 아니었다. AMD64(Windows) 환경에서 가장 좋은 사양이 5년 된 i7-12700F + RTX 2060 조합인데, 스트레스를 덜 받으려면 상대적으로 가벼운 유니티가 낫다고 판단했다.
-
칼의 용도: "쥐 잡는 데 소 잡는 칼을 쓸 필요는 없지 않나?" MAME RUN!!은 2D 게임이다. 내 머릿속의 언리얼은 '어쌔신 크리드'나 '레데리 2' 같은 3D 대작 오픈월드용이라는 이미지가 강해 2D 게임에는 과하다고 생각했다.
그렇게 유니티를 설치하고 공식 문서와 튜토리얼을 보며 조금씩 친해지기 시작했다.
C#에 대한 느낌
유니티 자체에 대해서도 할 말이 많지만, 이야기가 너무 길어질 것 같으니 이번에는 C# 언어 자체에 집중해 보려 한다.
깔끔하고 정돈된 느낌
이름 때문에 C++에 가까운 느낌일 줄 알았는데, 실제로는 C의 외형을 한 현대적 관리형 언어인 Java나 JavaScript와 훨씬 비슷했다. 중괄호 {}를 쓰고 if, for, class, return 같은 구조가 익숙해서 첫인상은 JS와 닮아 보였다.
예를 들면 이런 표면적인 느낌이 비슷하다.
if (score > 10)
{
Console.WriteLine("OK");
}
if (score > 10) {
console.log("OK");
}
그런데 조금 써보면, js와는 다른 상당히 정돈된 느낌이 난다. js에서는 느낄 수 없는 뭔가 정적인 느낌이랄까? 콕 집어 설명하긴 힘든데 가독성이 IDE지원도 C# 코드에서 잘되어 있어서 그런지 가독성도 좋고 정돈된 느낌이 나는 코드가 된다.
과연 java와 경쟁하는 언어구나. 하는 생각이 저절로 들 정도로 C++와는 달리 극한의 하드웨어 제어 메모리는 신경안써도 된다는 점이 편하면서도, 결국 2진 바이너리로 컴파일 후 런타임을 돌린다는 점에서 성능도 확보하는 꽤 현대적으로 성능과 사용성의 딱 중간에 있는 언어라는 점도 매력적이었다.
들여쓰기에 익숙한 Python 개발자의 느낌
Python의 indent 방식(들여쓰기 방식)에 길들여진 많은 개발자들이 javascript 코드를 보때 느끼는 그 괄호의 지옥.. {}, ()..
아, "젠장, 이 문장이 도대체 어디서 끝나는 거야? } 하나가 덜 닫힌 것 같은데...?"
javascript 의코드가 조금만 길어지고 복잡해지면 이런 기분은 항상 들게 된다. 그런데 특이하게도 C# 은
“생각보다 답답하지 않고 꽤 깔끔하네?”
이런 인상을 받았다. 사실 아직 그 이유는 아직 모르겠다. IDE(vscode사용중) 덕분일 수도 있고 프론트엔드의 복잡한 비동기 로직이 가득한 JS와 달리 백엔드적인 정적 구조가 코드에 녹아있어서 그런 것 같기도 하다. 아마 '강력한 타입 시스템(Static Typing)' 과 '네임스페이스 기반으로 구조화'가 되어있어서 개발자의 머릿속에서 무의식적으로 코드의 구조가 그려지기 때문인지도 모르겠다.
마치며
일단 웹개발자 입장에서 C#은 꽤 매력적인 언어라고 생각한다.
왜냐하면:
Python으로 FastAPI/Django/DRF 만 하다 보면 큰 GUI 앱, 게임, 실시간 상호작용 쪽 감각이 약해질 수 있는데 C#은 그 부분을 아주 잘 메워주는 것 같다. 그리고 Unity와 연결되면 인터랙션, 상태 관리, 이벤트, 오브젝트 구조화 감각을 익히는데 꽤 좋은 경험이 된다고 생각한다. 이런 경험은 다시 웹 프론트나 앱 설계에도 좋은 영향을 줄 것이다.
즉, C#과 Unity 는 웹 개발자에게 “동적인 프로그램을 구조적으로 설계하는 감각” 을 한단계 성숙하게 하는데 도움이 될 것 같다는 기분이 든다.
그리고 더 솔직하게 말하면, 성능을 위해서 C++를 다루는 것을 마음속 깊이 동경하고 있으면서도 C++은 역시 다소 거칠고 피곤한 반면, C#은 재미를 잃지 않고 시스템적 사고를 익히기 좋은 언어라고 생각한다.
그렇다고 C#을 해보라고 독자에게 권하지는 않는다. 언어라는 것은 어느것이 좋다 라는 개념이 존재하는 것이 아니라, 단지 나의 생각과 기획을 구현하는 도구일 뿐이며 나 역시 Unity가 필요했기 때문에 C#을 시작한 것에 불과하다.
앞으로 이 블로그에서 Unity 카테고리와 토픽을 열어서 나의 Unity와 C# 경험담으로 블로그를 채워나가 볼 생각이다.
관심있으신 분들은 이 블로그를 구독! Follow 부탁드린다.
Follow 기능은 우선 Mikihands 블로그 플랫폼에 가입한 뒤 사용이 가능하다.
가입은 무료이고 간단하므로 꼭 가입 및 follow를 부탁드린다.
여러분의 관심과 응원이 포스트작성의 동기부여가 되기 때문이다.