Search

C# VS C++ (유니티 기준)

class
구조
상태
완료
날짜
목차

C# VS C++

유니티를 사용하면서 왜 C#을 선택한 이유에 대해 궁금해하신 적이 있나요?
이 점을 자세히 살펴보려 합니다.
언리얼과 다른 생태계를 선택함으로써 어떤 장점이 있는지, 또 어떤 단점이 있는지 알아보겠습니다.
그리고, C#과 C++의 주요 차이점에 대해서도 살펴보겠습니다.
C#과 C++의 차이점을 유니티를 기준으로 설명하겠습니다.

C# 개발 원칙

C#은 객체 지향 프로그래밍(OOP) 언어입니다. C#의 설계는 코드의 재사용성, 확장성 및 유지 보수성을 높이는 데 중점을 둡니다.
C#은 객체 지향 프로그래밍 언어로, SOLID 원칙을 준수해야 합니다. SOLID 원칙에 대한 자세한 내용은 다른 페이지에 정리해 두었습니다.

현대적이고 간결한 문법

C#은 현대적인 프로그래밍 요구를 충족시키기 위해 설계되었습니다. 명확하고 읽기 쉬운 문법을 제공함으로써 개발자가 더 직관적으로 코드를 작성하고 이해할 수 있도록 합니다.
#include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; }
C++
복사
using System; class Program { static void Main() { Console.WriteLine("Hello, World!"); } }
C#
복사
위 코드처럼 동일한 'Hello, World'를 출력하는 프로그램이지만 명확한 차이점이 있습니다.
C#의 코드는 C++보다 더 간결하며, using 지시문 덕분에 Console.WriteLine 메서드를 직접 사용할 수 있습니다. 반면, C++에서는 std:: 네임스페이스 접두어를 사용해야 합니다.

안정성과 타입 안전성

C#은 강력한 타입 시스템을 갖추고 있어, 컴파일 시간에 많은 오류를 잡아내고, 런타임 예외의 가능성을 줄입니다. 이는 변수와 객체의 타입이 명확하게 정의되고 엄격하게 관리되어, 프로그램의 안정성을 보장하는 데 도움을 줍니다.
#include <iostream> using namespace std; int main() { int i = 42; void* p = &i; // void 포인터에 int 주소를 저장 char* cp = static_cast<char*>(p); // void 포인터를 char 포인터로 변환 cout << *cp << endl; // 잘못된 메모리 해석 return 0; }
C++
복사
using System; class Program { static void Main() { int i = 42; // C#에서는 타입 안전성을 위해 아래와 같은 변환을 허용하지 않음 // 컴파일 오류: Cannot convert type 'int' to 'void*' // void* p = &i; // C#에서는 명시적으로 타입 변환을 해야 하며, 아래와 같은 잘못된 메모리 접근 시도는 허용되지 않음 // char* cp = (char*)p; // C#에서는 포인터를 직접 다루는 것이 제한됨 Console.WriteLine(i); } }
C#
복사
사실, C#에서 포인터를 사용하려면 unsafe 구문을 사용해야 합니다. 이 부분은 후에 마샬링과 관련하여 설명하겠습니다. 마샬링에 관한 설명은 유니티에서 C++.dll을 사용하는 방법과 연관 지어 설명하겠습니다.

자동 메모리 관리

C#에서는 가비지 컬렉션을 통해 메모리 관리가 자동으로 이루어집니다. 이는 개발자가 메모리 누수와 같은 일반적인 문제에 대해 걱정할 필요가 없게 하며, 결과적으로 개발 시간을 단축시킵니다. 반면, C++에서는 개발자가 직접 메모리 할당과 해제를 관리해야 합니다.
가비지 컬렉션(GC)에 관한 자세한 내용은 아래 다른 페이지에 정리되어 있습니다. GC

IL에 대하여

다수의 유니티 개발 블로그에서는, 유니티가 C#의 특성인 IL 언어 때문에 C++보다 느리다는 주장을 많이 보았습니다.
이는 유니티에서 Mono 대신 IL2CPP로 빌드할 때의 정보로 판단한다면, 잘못된 정보입니다. IL2CPP는 C#이 아니라 C++를 기반으로 빌드됩니다.
이에 대한 자세한 설명은 유니티 컴파일 과정에 관한 페이지에서 확인하실 수 있습니다.