C# 콘솔 서버를 실무에서 사용해보면서 느껴진 신입의 입장에서 주관적인 장점과 단점을 정리해보았다.
장점
1. 메모리 관리 수월 : C++은 잘못된 메모리를 접근하고 쓰는 순간 망한다. 심지어 스마트 포인터를 사용하거나 new-delete 관리를 잘해줘도 파편화 때문에 터져버린다.
하지만 C#의 GC는 단순 소멸 생성 외에도 파편화, 순환 참조 까지 다 해결해줘서 코드를 쉽게 깔끔하고 문제없이 동작하도록 짤 수 있다.
2. 유니티 프로젝트와 찰떡 : 클라이언트에서 사용하는 기획 데이터 코드나 패킷 구조체등을 그냥 그대로 가져다 쓸 수가 있다. 똑같은 일을 두 번 하는 뻘짓을 줄여주는 것 외에도, 클라-서버 간에 공통 작업이 누락되어 생기는 문제 같은 것들을 원천 차단할 수 있어서 편리하다.
3. 치명적 오류(서버다운) 적음 : C#은 어떤 배열에 값을 넣을때도 매번 out of range인지 미리 체크한다. 이런 식으로 프로그래머 실수의 여지를 다 잡아서, 프로그램이 갑자기 죽는 일은 없도록 최대한 지원해준다.
4. 닷넷에서 지원해주는 수많은 기능들 : aync-await, 비동기 통신, 쓰레드풀, concurrent container, html client, xml reader, serializer 등 닷넷에서 지원해주는 기능들이 엄청나게 많아서, 검증이 필요한 외부 라이브러리를 안 쓰더라도 앵간한 기능들을 using 구문만으로 가져다 쓸 수가 있고, 인터페이스 마저 훨씬 단순하고 가독성이 좋다. 여차하면 CLR을 사용하여 C++ 코드와 이을 수도 있다.
5. 빠른 컴파일 속도 : C++은 Pimpl, Unity Build, 병렬 컴파일 등 여러가지 메커니즘을 쓰더라도 구문을 분석, 최적화하여 기계 코드를 즉시 만들어 내야 하기 때문에 느릴 수밖에 없다. 심지어 매크로, 헤더, 템플릿 등의 코드를 수정하면 영향이 가는 cpp 파일 전부를 다시 해석해서 obj 파일을 다시 내뱉는 끔찍한 일을 저지른다.
하지만, C#은 수정한 내용의 IL 명령어만을 다듬어서 내뱉기때문에 앵간히 큰 프로젝트가 아니고서는 수정 작업 후 10초 이상의 시간이 걸리지 않는다.덕분에 컴파일->담배 가 불가능해진다.
6. C++에서 발생하던 사소한 실수를 문법 차원에서 막아준다. : 의도치 않은 대입( if(a=5) ), 의도치 않은 복사 생성 (Class cA = cB;), 매개변수가 함수 안에서 변화하는지를 문법화(ref, in-out) 등 C++를 사용했다면 한 번쯤 골치 아팠을 내용을 언어 차원에서 최소화해준다.
7. OS 변경이 편하다. : 혹시라도 나중에 Windows 서버 -> Linux 서버와 같이 플랫폼을 변경할 때, C++이라면 대 참사가 벌어지지만,
C#(.Net Core)은 멀티 플랫폼 대응 언어이어서 매우 편하다.
거의 몇일 수준으로 리눅스 대응이 가능한 정도.
8. 생산성(개발툴/디버깅) 편의가 좋다. : C++은 매크로나 템플릿 프로그래밍과 같이 IDE 입장에서 해석하기 난해한 경우가 많아서, '이 함수를 어디서 호출하는지?', '이 함수는 어디에 정의되어있는지?', '이 심볼은 어디에 정의되어 있는지?'와 같은 것들을 찾는 게 매우 힘들다. 그래서 바닐라 Visual Studio로는 개발하는 게 매우 지옥 같고, Visual Assist를 반 강제적으로 사용하게 된다. (그래도 느리다.)
하지만, C#은 난해한 매크로나 문법이 존재하지 않아서 심볼을 찾는데 시간이 거의 걸리지가 않아 찾기에 지연시간이 없다.
9. 가독성이 좋다. : C++은 아무리 코드를 랩핑하더라도 범위 지정자, Iterator, 매크로/템플릿 등이 점철되어 있어서 가독성 및 디버깅 편의성이 떨어지는데,
C#은 스크립트 수준으로 코드가 간결하다.
단점
1. 느리다. : 마르고 닳도록 언급되는 내용. 컴파일 속도가 매우 빠른 만큼, 런타임에 IL 코드를 기계 코드로 해석해서 캐싱하기 때문에 느리다. 그리고 주기적으로 GC가 돌면서 CPU를 튀게 만든다. C++ 보다 더 고급언어인 만큼 어떤 형태로든 느리게 작동한다.
2. 매크로와 템플릿 사용 불가능. : 매크로와 템플릿을 사용하면 오히려 더 짧고 쉽게 짤 수 있는 코드들을 C#은 더 어렵거나 더 비효율적으로 짜야한다. 템플릿이 사실 존재는 하지만, 팔다리를 다 잘라놓은 수준이라서 템플릿 메타 프로그래밍 영역으로는 아예 사용이 불가능하다.
3. 쓸 수 없는 옵션이 다수 있음. : 일부 C++ 기능을 예쁘게 랩핑 해서 만든 언어인 만큼, C++에서 사용할 수 있는 모든 옵션을 다 쓸 수는 없다. 스레드나 소켓 등을 다루다가 없는 기능이 있으면 결국 C++ 코드를 연결하거나 우회해서 짜야한다.
정리
C#은 더 고급 언어인 만큼 원하는 기능을 코드로 작성해서 빌드하는데 까지 드는 시간이 C++ 보다 적고, 치명적인 문제가 발생할 확률이 낮다.
반대로 C++ 보다 실행 속도가 느리고, 디테일하고 커스터마이징 된 기법으로 최적화된 개발이 불가능하다.
그래서 고급 인력이 많고, C++ 개발(특히 메모리 관리)에 익숙한 사람들이 많다면 굳이 C#을 선택할 이유는 없을 것 같다.
하지만 반대로, 적은 인력으로 빠르게 큰 이슈 없이 유니티 프로젝트 서버를 대응하기는 괜찮은 언어인 것 같다고 생각한다.
Ps.
그리고 추가적으로 C#의 속도가 느리다고 해서 너무 겁먹을 필요는 없다.
서버가 부족하면 스케일 아웃으로 적절히 처리해줘도 충분하고,
애초에 C#으로 돌리지 못할 게임 서버는 C++로도 돌리지 못하는 잘못 짠 구조이다. (단순히 언어의 차이로는 그 정도의 차이를 낼 수 없다.)
'Programming > C# & Unity' 카테고리의 다른 글
C# 가비지 컬렉션 루트 오브젝트 (GC root object) (0) | 2021.10.31 |
---|---|
C# Tuple, ValueTuple (0) | 2021.09.03 |
C# try catch finally (0) | 2020.10.06 |
C# 자주 쓰는 Collection 집계 함수 (0) | 2020.01.29 |
C# 4.0 쓸만한 기능 (0) | 2020.01.10 |