개발자 면접 공부/C-C++

C++ vs C#

chogyujin 2024. 2. 18. 16:27
728x90

1. 개요

오늘은 C++ 과 C#의 차이점에 대해서 공부하도록 하겠습니다.

 


2. 둘의 역사

C++ 은 C를 기반으로 새로운 객체 지향 언어 개발하여 만들어진 언어입니다. 1985년에 만들어졌습니다.

C#은 Java를 대항하기 위해 마이크로 소프트가 2002년에 만들었습니다.


3. 결국 객체지향 언어

결국 C++ 이나 C#에 공통점은 객체 지향의 언어라는 점 입니다.(C++는 절차 + 객체 혼합인 "멀티 패러다임")

객체 지향의 언어임으로 다음과 같은 공통점을 가지고 시작을 합니다.

https://chogyujin-study.tistory.com/54

 

C++ 객체지향 언어 4가지 특징

오늘은 객체지향 언어 5가지 특징에 대해 공부하겠습니다. 개요 객체지향 언어는 실제 세상의 사물의 개념을 프로그램에서 객체라고 부르며 이러한 프로그램 기법은 프로그래머들에게 매우 직

chogyujin-study.tistory.com


4. 그럼 차이점은 무엇인가?

하지만 차이점은 분명히 존재합니다.
차이점은 다음과 같습니다.

 

다중 상속: C++은 다종상속 즉 여러 부모 클래스를 상속을 받을수 있습니다, 하지만 C#은 다중상속은 지원하지 않습니다.

그러므로 C#은 죽음의 다이아몬드라는 것을 피할수 있지만 C++은 피하기가 어렵습니다.
하지만 C++에는 가상상속을 통해 피하는 방식을 채택하였습니다.

https://chogyujin-study.tistory.com/61

 

가상상속

오늘은 가상상속에 대해서 공부하도록 하겠습니다. 가상 상속이란??? C++에는 다중 상속을 지원하지만 JAVA는 다중 상속을 지원하지 않습니다. 다중상속에는 장점도 있지만 매우 큰 단점이 하나

chogyujin-study.tistory.com

포인터 : C++에서는 포인터는 매우 중요한 위치에 있습니다. 직접 힙메모리를 가르킬수 있으니깐요 하지만 C#은 존재는 함니다만 안전하지 않음으로 표시 됨으로 레퍼런스를 사용하는것을 매우 권장하고있습니다.

 

정밀도 손실 :  C#은 암시적으로 형 변환으로 인한 정밀도 손실을 허용하지 않습니다. 정밀도 손실될 경우 명시적 변환이 필요합니다.


5. 메모리 관리는 어떠한가?

 

C#과 C++간의 가장 중요한 차이점은 메모리 관리입니다.

 

C에서는 동적 메모리를 할당할 때 malloc을 사용하고, 이를 메모리에서 해제하는 경우 free를 사용합니다.
프로그래머는 메모리를 수동적으로 관리해야 했기 때문에 많은 메모리 누수(memory leaks)가 일어나게 되었습니다.

C++의 메모리 관리 체계는 반자동 관리를 채택하여 개선되었습니다.
객체는 ‘스마트 포인터’를 사용해 메모리를 자동으로 할당, 해제할 수 있었습니다.
그러나 스마트 포인터 또한 여전히 순환 참조 같은 특정 상황에서 메모리 누수를 유발했기에 원활하게 해결되지는 않았습니다.

 

C#은 가비지 콜렉터(더 이상 사용하지 않는 객체를 메모리에서 자동으로 해제하는 방식)를 채택했습니다.
꽤 괜찮은 방법으로 보였으나, 때때로 가비지 콜렉터는 메모리 이외의 시스템 리소스(TCP 연결 혹은 파일)를 보유하고 있는 객체의 메모리 해제를 어렵게 만듭니다.
이 경우 ‘리소스 누수’라는 현상이 발생할 수 있으며, 프로그래머는 리소스를 보유하고 있는 객체를 수동으로 할당 해제해야 합니다. 이와 같은 상황에서는 C#의 소멸자의 사용이 비 결론적으로 변하기 때문에 C#의 메모리 해제가 C++보다 더 복잡해질 수 있습니다.


6. 컴파일 : 바이너리 vs 바이트코드

C++은 컴파일하는 즉시 바이너리(이진) 코드로 변환됩니다.
C#은 .NET에 의해 바이너리 코드로 컴파일 가능한 바이트 코드로 컴파일됩니다. (.NET은 .Net Framework를 대체하는 마이크로소프트의 최신 크로스 플랫폼입니다.)

 

C++은 컴파일을 할 때 다양한 면에서 성능적인 이점이 있지만, C#은 런타임 도중 수집된 정보를 사용하여 객체를 인스턴스화하고, 메서드를 호출할 수 있는 ‘리플렉션’이라는 기능을 가지고 있습니다.
컴파일하는 도중에는 메서드 호출이 불가능하지만, 런타임 시에는 함수명을 사용해서 메서드를 호출할 수 있습니다.

반면, C++은 바로 컴파일되기 때문에 그 구조상 리플렉션을 가질 수 없습니다.
그 대신 C++에는 런타임 유형 정보(run-time type information)라는 기능이 있습니다.
이는 오직 가상 함수 유형에만 사용되기 때문에 리플렉션에 비해서는 덜 강력한 기능이라고 할 수 있습니다.

C++은 변수의 타입에 따라 컴파일 시 생성되는 코드 형태의 템플릿을 가지고 있습니다.
반면 C#에는 템플릿 대신에 제네릭(Generic)이 있습니다. 제네릭은 컴파일이 아닌 런타임 시에 확인됩니다.
따라서 템플릿은 제네릭보다 빠릅니다. 반면 제네릭은 변수 유형에 따라 메모리를 추가로 요구하지 않아 메모리 측면에서 효율적입니다.


7. 요약

  C++ C#
컴파일 바이너리로 직접 변환 바이트코드로 변환
컴파일 시간 긴 컴파일 시간 짧은 컴파일 시간
메모리 관리 수동 혹은 스마트 포인터를 사용해 반자동 관리 가비지 콜렉터를 사용해 자동으로 관리
런타임 속도 빠름 C++보다 느림
런타임 메모리 요구사항 최적 C++보다 많음
의도하지 않은 오류 경험이 없는 프로그래머에게는 오류가 발생하기 쉬움 C++보다 초보자 친화적
클래스 상속 단일, 다중 및 가상 단일, 인터페이스
제네릭 코드 템플릿 – 컴파일 도중 제네릭 – 런타임 도중
이식성 거의 모든 운영체제에서 사용할 수 있음, 그러나 모든 운영체제 별로 컴파일을 일일이 해야 함 컴파일된 바이트코드는 많은 운영체제에서 실행될 수 있음
학습 가파른 학습 곡선; 시간 소모적; 초보 개발자에게는 어려울 수 있음. C#에 비해 작은 커뮤니티 고급 언어; 읽기 쉬움; 상위 계층구조; 초보자가 쉽게 배울 수 있음. 더 크고 활발한 커뮤니티
리플렉션 사용할 수 없음, 런타임 유형 정보는 리플렉션 보다 사용성이 떨어짐 사용 가능하고 매우 편리함
암시적 형 변환 내장 유형에 대해 허용됨 안전한 경우에만 허용됨
모듈화 라이브러리 및 헤더를 이용해 가능함 언어에 내장되지 있음

8. Ref

https://blog.wishket.com/c-c-%eb%91%98%ec%9d%b4-%eb%ad%90%ea%b0%80-%eb%8b%a4%eb%a5%b4%ec%a7%80-%eb%91%90-%ec%96%b8%ec%96%b4%ec%9d%98-%ec%b0%a8%ec%9d%b4%ec%a0%90-%eb%b6%84%ec%84%9d/

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

초기화자 리스트(intializer_list)  (0) 2024.03.08
유니폼 초기화  (0) 2024.03.06
Move Semantics  (0) 2023.10.29
스마트 포인터의 new와 make의 차이  (1) 2023.10.03
Inline 에 대하여  (2) 2023.09.25