Computer Language/C & C++

[C++] C++와 C#의 차이

HONGGG 2023. 9. 24. 04:48

C란?

  • 1972년 개발된 언어로 다양한 언어에 영향을 주었다.
  • 과거 컴퓨터 리소스가 한정적인 시기에 하드웨어와 매우 밀적하게 작동하게 사용된 로우레벨(low level) 언어이기도 하다.
  • 메모리의 공간을 가장 효율적으로 사용하며 빠른 언어이다.

 

C++란?

  • C에서 Class라는 개념이 도입된 언어, C를 대체(Superset)하기 위해 만들어졌다.
  • OOP(Object oriented programming 객체지향)을 지원한다.
  • C만큼 하드웨어와 밀접하고 빠를 수 있다.

 

C#이란?

  • C#은 C++보다 Java에 가깝고 .Net 생태계를 위한 언어이다.
    • Java와 Oracle, C#과 .Net 이 두 환경이 가장 대표적인 개발 및 실행환경
  • 백엔드, 프론트엔드 iOS 등 다양한 환경에서 개발가능
  • C#은 컴파일러가 자동으로 해주는 작업이 많다. 그렇기에 C++보다는 느리다.

 

 

 

C, C++, C#의 차이

 


C++와 C#의 차이

 

이 두 언어는 공통적으로 객체 지향 언어이지만, C#은 모든 것을 객체로 취급하기에 컴포넌트 지향 프로그래밍 언어라 불린다.

 

컴포넌트(Component)란 프로그래밍에서 재사용 가능한 각 구성 요소(독립된 모듈)이다.

컴포넌트 기반 프로그래밍에서는 레고 블록 같이 존재하는 컴포넌트들을 조합하여 화면을 구성한다.

 

즉, 객체 지향 프로그래밍은 큰 바이너리 실행 파일로 결합된 '클래스 간 연관성'에 초점을 맞추지만, 컴포넌트 지향 프로그래밍은 자체적 동작하는 '교환 가능한 코드 모듈'을 사용한다.

 

 

차이점

C++ C#
유닉스 기반 시스템을 위해 설계되어 모든 플렛폼에 사용 가능 표준화는 되었지만, Windows 환경 외 거의 사용되지 않음
C++는 컴파일되어 기계 코드로 직접 변환 중간 언어(IL, Intermediate Language)로 ASP.NET에서 해석되는 CLR(공용 언어 런타임)로 컴파일
메모리 수동 할당/해제 메모리 관리를 자동으로 처리하는 가상 시스템 실행(가비지 컬렉터)
포인터 사용가능 C#은 포인터 사용을 권유하지 않음

 

상세 차이점

C#은 '#include' 선행처리기 지시어가 없다.
C#은 Java의 'import'와 유사하게 'using' 키워드로 라이브러리의 클래스들을 사용한다.
C#은 조건부 컴파일링 지시어를 계속 지원한다. 조건부 컴파일러란? 
C#은 선행처리기가 컴파일러 안에 통합되었다. 컴파일된 object 자체에 풍부한 metadata가 포함되어서 object파일 규모가 커진다. 덕분에 Embedded System개발에는 문제가 될 수 있다.
C#은 IL(Intermediate Language)라는 중간 코드가 있다.
개발환경에 따른 실행에 영향을 완화하고 C#뿐 아니라 다른 언어로 개발된 IL들도 어떠한 .Net Framework 환경에서 실행되게 하기 위해 존재한다.
Java의 Byte Code와 비슷하게 중간 코드를 지원하지만 더 다양한 언어를 지원. (VB, C#, C++, F#, Boo, JScript, .Net 등)
C#, VB .Net, 다른 .Net 언어들을 통한 개발된 프로그램들을 VS로 컴파일하여 CIL(Common Intermediate Language, 공통 중간 언어) 바이트코드를 생성하고 컴파일 후 실행 시, VS는 해당 바이트코드를 Native Code로 컴파일 후 실행. 이 때 CLR이 CIL을 읽어 OS가 이해할 수 있는 Native Code로 전환 *참고
Application을 의미하는 클래스가 반드시 존재한다.
프로그램 진입점이 ApplicationClass.Main()이며 Java도 동일하다.
C++는 C 런타임 라이브러리의 CRT(C Run-Time library) crtexe.c코드에서 main을 호출하고 종료까지 확인한다.
"소스코드 빌드 결과인 exe파일 실행시 운영체제의 로더(Loader)가 프로세스 생성.
그 후 로더는 프로세스 커널 오브젝트, 가상 주소 공간을 생성.
실행 파일 코드, 데이터 및 DLL 파일들을 생성된 가상 주소 공간에 적재하며 바인딩도 발생.
작업이 끝나면 커널 런타임 시작 함수 호출. 런타임 시작함수에서 main() 호출 및 main() 반환값 확인.
main() 반환값을 받으면 해당 값으로 프로세스 정리"
 * 흥미로운 C++ main에 대한 리버싱
C#의 Array는 단순 메모리 공간이 아닌 부가정보를 가진 객체이다.
Array가 단순 메모리에 주소를 가진 객체가 아니라 리스트와 같은 부가적 함수와 선언이 있는 객체이다.
최신 C++에서는 Array를 vector 같은 클래스처럼 사용할 수 있게 하려 한다고 한다.
설계 철학이 다른다.
C++은 꼭 쓸사람만 비용을 부담하게 하자
C#은 비용이 부담되더라도 버그가 생길 여지를 제거하자
C#은 기본 데이터 타입의 크기 표준화가 잘되어있다.
sbyte, short, int, long, byte, ushort, uint, ulong, float, double, decimal, bool 등
C#은 상속 계층 꼭대기 언어 수준의 object라는 class가 존재한다.
일반적으로 언어는 상속이 암시적이기에 Object에서 상속을 선언하는 클래스가 필요치 않다. 하지만 .Net환경의 모든 클래스는 Object에서 파생되기에 Object 클래스에 정의된 모든 메서드를 시스템 모든 개체가 사용한다.
Object는 정수, 문자열 등 특정 형식의 타입이 아닌 모든 것을 아우르는 형태의 데이터형이다.
* 참고자료
C++는 문자열이 char *, C#과 Java는 utf-16 유니코드 문자열 클래스인 string을 사용한다.
"hello"를 C++은 5바이트, C#과 Java는 10바이트 가량 차지한다는 의미
struct(구조체)가 C++는 클래스이지만 C#에서는 힙에 할당하거나 상속 관계에 쓸 수도 없다.
C#에서는 구조체를 특정 값으로 넘길때, 구조체의 인스턴스 주소가 아닌 원본 인스턴스를 복사한 새로운 구조체를 넘긴다.
C++에서는 public, C#에서는 private이 기본 접근 지정자이다.
C#은 단일 상속만 허용한다.
단, Java와 같이 interface를 사용한다.
C#은 함수 매개 변수 선언시 매개 변수 외 참조 매개 변수(ref), 출력 매개변수(out) 지정이 가능하다.
참조에 호출을 지원하기 위한 예약어들이며 둘의 차이는 매개 변수 초기화이다.
* ref 매개 변수는 함수에 전달하기 전 초기화를 해야한다. (함수 내부에서 수정)
* out 매개 변수는 함수에 전달하기 전 초기화가 불필요하고 이전 값 모두 무시 (함수 내부에 생성된 값 반환)
C#은 초기화되지 않은 지역 변수 사용시 에러가 발생
가상함수(virtual)과 순수 가상 함수(abstract)가 나뉘어있다.
가상함수 
추상함수 
인터페이스 
형식 매개 변수의 형태로 template과 같은 기능 제공
C#에서는 지네릭(Generic)을 지원해준다. template 키워드 대신 <>안에 형식 매개변수만 나열하는 방식이다.
C++의 RAII idiom은 using 문으로 구현이 가능하다. (?)
RAII idiom : 
scope operator가 '.'로 존재한다.
C++에서는 경우에 따라 '::'와 '.'가 존재하는데 이를 C#에서는 '.'로 통일하였다.
클래스 event 멤버는 signal/slot 기능을 언어 수준에서 제공한다. (?)
foreach가 존재한다.

 

 


참고자료

 

C++와 C#간의 차이점 정리

방준영님께서 C++와 C#간의 차이점 정리에 덧붙여 글에서 몇 가지 잘못된 부분을 지적해 주셔서 Update 했습니다. C++과 C#의 차이점 #1: 선행처리기의 지시어로 #include가 없습니다. Java import와 비슷하

yesarang.tistory.com

 

C 언어, C++, C#의 차이점 이해하기(개발자 구인하기] | 이랜서 블로그

우리 회사에 맞는 프로젝트는 어떤 프로그래밍 언어일까요? C언어, C++, C#의 각 특성과 차이점, 장단점을 알아보세요. | C C++, C 언어 의미, C 언어 연산자, C 언어 문자열, C 언어 기초, C 언어 코딩, C

www.elancer.co.kr