말감로그

24.08.22 Unity_C# - C#와 C++의 차이, 구조체와 클래스, 박싱과 언박싱, 제네릭 본문

TIL

24.08.22 Unity_C# - C#와 C++의 차이, 구조체와 클래스, 박싱과 언박싱, 제네릭

habbn 2024. 8. 22. 16:58
728x90

C#과 C++의 차이점

메모리 관리 방식이 가장 큰 차이라고 생각합니다. 

C#가비지 컬렉터가 메모리 관리를 자동으로 처리합니다. 가비지 컬렉터는 메모리를 주기적으로 검사하여 더 이상 참조되지 않는 객체를 찾아서 메모리를 해제합니다. 주기적으로 실행되는 과정에서 일부 프로그램의 성능이 저하되고 오버헤드가 발생할 수 있습니다. 

 

C++은 개발자가 메모리를 직접 관리해야 합니다. 객체를 생성할 때 'new' 연산자를 사용하고, 사용이 끝나면 'delete'를 통해 메모리를 해제합니다.  수동으로 관리하기 때문에 오버헤드가 없고, 메모리 할당과 해제의 속도가 빠릅니다.

 

C#은 개발 편의성과 생산성을 중시하는 환경에 적합하며, C++은 성능과 하드웨어 접근이 중요한 시스템 수준의 프로그래밍에 적합합니다.

 

C#은 왜 다중상속이 안될까?

죽음의 다이아몬드 상속 때문입니다.

C++은 다중 상속이 가능한데, 클래스들이 서로 상속을 받게 되면서 다이아몬드 구조의 상속 관계를 갖게 되는데, 이때 모호성이 발생하면서 생기는 문제를 말합니다. 

C#은 편의성을 중시하는 언어이기 때문에 이러한 문제를 없애고자 다중 상속을 제한한 것입니다.

 

구조체와 클래스

구조체와 클래스는 데이터와 그 데이터를 처리하는 메서드를 묶는다는 공통점이 있지만

구조체는 값 타입으로 스택에 할당되고, 클래스는 참조 타입으로 힙에 할당됩니다.

그리고 구조체는 상속이 불가능하지만, 클래스는 상속이 가능합니다.

 

C#의 특성상 힙에 할당된 메모리는 가비지 컬렉터가 정리해주는데, 처리해야 할 양이 많으면 프로그램 동작 속도가 느려지거나 멈추기도 합니다. 그래서 굳이 힙(클래스)에 할당하지 않아도 되는 건 스택 메모리(구조체)에 할당하면 프로그램 속도 향상에 도움이 될 수 있습니다. 

 

박싱 VS 언박싱

박싱은 값 타입의 데이터를 참조 타입으로 변환하는 작업입니다. 예를 들면, int 같은 값 타입의 변수를 object 타입의 변수에 할당할 때 힙에 저장되는데, 이때 박싱이 발생합니다.

언박싱은 반대로, 참조 타입의 객체를 다시 값 타입의 데이터로 변환하는 작업입니다. 언박식을 할 때 유의해야 할 점은 캐스트를 사용하여 명시적으로 타입을 지정해주어야 합니다.

 

박싱과 언박식을 사용할 때 주의해야할 점

박싱과 언박싱은 CPU 처리능력을 소모하기에 과도하게 사용되면 성능 저하의 원인이 될 수 있고,

언박싱 시 잘못된 타입으로 캐스트를 시도하면 오류가 발생할 수 있습니다. 그래서 박싱하기 전 객체의 원래 타입을 정확히 알고 있어야 합니다.

박싱된 값은 힙에 저장되므로, 과도하기 사용되면 가비지 컬렉터에 많은 부담을 줄 수 있습니다.

 

제네릭이란?

제네릭은 데이터 메서드 등을 다룰 때 구체적인 데이터 타입을 지정하지 않고 일반화된 형태로 정의하는 방법입니다. 제네릭을 사용하면 코드의 재사용성을 높일 수 있고, 타입 안전성을 확보할 수 있습니다

 

728x90