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#은 모든 것을 객체로 취급하기에 컴포넌트 지향 프로그래밍 언어라 불린다.
컴포넌트(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