Visual C# 언어 개념
C++ 개발자를 위한 C#

다음 표에는 /clr를 사용하지 않는 네이티브 C++와 C# 사이의 중요한 차이점에 대한 비교 설명이 나와 있습니다. C++ 프로그래머의 경우 이 표를 통해 두 언어 사이의 중요한 차이점을 알 수 있습니다.

참고

C++ 프로젝트와 C# 프로젝트는 서로 다른 프로젝트 모델에서 파생됩니다. C++ 프로젝트와 C# 프로젝트 간의 차이점에 대한 자세한 내용은 프로젝트의 항목 관리솔루션 탐색기 사용을 참조하십시오.

기능 참조할 항목

상속: C++의 경우 클래스와 구조체는 사실상 동일한 반면, C#의 경우 이 둘은 전혀 다릅니다. C# 클래스에서는 인터페이스를여러 개 구현할 수 있지만 단일 기본 클래스에서만 상속할 수 있습니다. 또한 C# 구조체는 상속을 지원하지 않으며 명시적 기본생성자를 지원하지 않습니다. 생성자 하나가 기본적으로 제공됩니다.

class

interface

struct(C# 참조)

배열: C++의 경우 배열은 단순한 포인터입니다. C#의 경우 배열은 메서드와 속성을 포함하는 개체입니다. 예를 들어, Length속성을 통해 배열의 크기를 쿼리할 수 있습니다. C# 배열에는 배열에 액세스하는 데 사용되는 각 인덱스를 확인하는 "인덱서"도사용할 수 있습니다. C# 배열을 선언하는 구문은 C++ 배열을 선언하는 구문과 다릅니다. C#에서 "[]" 토큰은 변수가 아닌배열 형식 뒤에 사용됩니다.

배열(C# 프로그래밍 가이드)

인덱서(C# 프로그래밍 가이드)

부울: C++의 경우 bool 형식은 근본적으로 정수입니다. C#에서는 bool 형식과 다른 형식 간의 변환이 없습니다.

bool

long 형식: C++에서는 long 형식이 32비트인 반면 C#에서는 64비트입니다.

long

매개 변수 전달: C++의 경우 포인터나 참조를 사용하여 명시적으로 전달되지 않는 모든 변수는 값으로 전달됩니다. C#의 경우 ref 또는 out 매개 변수 한정자를 사용하여 참조로 명시적으로 전달되지 않는 클래스와 구조체는 각각 참조와 값으로 전달됩니다.

struct

class

ref(C# 참조)

out(C# 참조)

switch 문: C++ switch 문과 달리 C#에서는 case 레이블에 대해 순차 조건 검사를 지원하지 않습니다.

switch

대리자: C# 대리자는 C++의 함수 포인터와 비슷하지만 형식 안전성과 보안성을 제공한다는 점이 다릅니다.

대리자

기본 클래스 메서드: C#은 파생 클래스에서 재정의된 기본 클래스 멤버를 호출하기 위한 base 키워드를 지원합니다. 또한 C#에서는 override 키워드를 사용하여 가상 또는 추상 메서드를 명시적으로 재정의할 수 있습니다.

base

override 예제 참조

메서드 숨기기: C++는 상속을 통한 메서드의 암시적 "숨김"을 지원합니다. C#의 경우 상속된 멤버는 new 한정자를 사용하여 명시적으로 숨겨야 합니다.

new

조건부 컴파일에 전처리기 지시문을 사용합니다. C#에서는 헤더 파일을 사용하지 않습니다.

C# 전처리기 지시문

예외 처리: C#에서는 예외가 throw되었는지 여부와 상관없이 실행해야 할 코드를 제공하기 위한 finally 키워드를 제공합니다.

try-finally

try-catch-finally

C# 연산자: C#은 istypeof 같은 연산자를 추가로 지원합니다. 또한 일부 논리 연산자의 다양한 기능이 도입되었습니다.

& 연산자

| 연산자

^ 연산자

is

typeof

extern 키워드: C++의 경우 extern은 형식을 가져오는 데 사용됩니다. C#의 경우 extern은 동일한 어셈블리의 다른 버전을 사용하기 위해 별칭을 만드는 데 사용됩니다.

extern

static 키워드: C++의 경우 static은 모듈별 형식을 선언하거나 클래스 수준 엔터티를 선언하는 데 모두 사용할 수 있습니다. C#의 경우 static은 클래스 수준 엔터티를 선언하는 데만 사용할 수 있습니다.

static

C#의 Main 메서드는 C++의 main 함수와 다르게 선언됩니다. C#의 경우 이 메서드는 대문자로 시작하고 항상 static입니다. 또한 C#에서는 명령줄 인수에 대한 처리 지원 기능이 훨씬 더 강력해졌습니다.

Main()과 명령줄 인수(C# 프로그래밍 가이드)

C#에서 포인터를 사용할 수 있지만 이는 unsafe 모드에서만 가능합니다.

unsafe

C#에서는 연산자 오버로드가 다르게 수행됩니다.

C# 연산자

문자열: C++의 경우 문자열은 문자의 배열에 불과합니다. C#의 경우 문자열은 강력한 검색 방법을 지원하는 개체입니다.

string

String

foreach 키워드를 사용하여 배열 및 컬렉션을 반복 처리할 수 있습니다.

foreach, in

전역: C#의 경우 전역 메서드와 변수는 지원되지 않습니다. 메서드와 변수는 class 또는 struct 안에 포함되어야 합니다.

C# 프로그램의 일반적인 구조

형식 가져오기: C++의 경우 여러 모듈에 공통적인 형식은 헤더 파일에 배치됩니다. C#의 경우 이 정보는 메타데이터를 통해 얻을 수 있습니다.

using

메타데이터 개요

C#의 지역 변수는 초기화하지 않으면 사용할 수 없습니다.

메서드(C# 프로그래밍 가이드)

메모리 관리: C++는 가비지 수집 언어가 아니므로, 명시적으로 해제하지 않은 메모리는 프로세스를 종료할 때까지 할당된 상태를 유지합니다. C#은 가비지 수집 언어입니다.

가비지 수집

소멸자: C#에서는 관리되지 않는 리소스를 명확하게 해제하기 위해 다른 구문을 사용합니다.

소멸자

using 문(C# 참조)

생성자: C++와 마찬가지로 C#에서는 클래스 생성자를 제공하지 않으면 기본 생성자가 자동으로 생성됩니다. 기본 생성자는 모든 필드를 기본값으로 초기화합니다.

인스턴스 생성자

기본값 표

C#은 비트 필드를 지원하지 않습니다.

C++ 비트 필드

C# 입출력 서비스 및 형식 지정은 .NET Framework의 런타임 라이브러리에 따라 수행됩니다.

C# 언어 자습서

숫자 결과 형식 지정 표

C#에서는 메서드 매개 변수가 기본값을 가질 수 없습니다. 동일한 효과를 얻고 싶다면 메서드 오버로드를 사용합니다.

컴파일러 오류 CS0241

C#의 경우 C++ 템플릿과 비슷한 방식으로 형식 매개 변수화를 위한 제네릭 형식 및 메서드를 제공하지만 여기에는 중요한 차이점이 있습니다.

C#의 제네릭

as 키워드는 표준 캐스트와 비슷하지만, 변환에 실패한 경우 예외를 throw하는 대신 null 값을 반환한다는 점에서 차이가 있습니다. 이는 C++에서 static_cast를 사용하는 것과 비슷합니다. 이 경우 dynamic_cast와 달리 런타임 검사를 수행하지 않으므로 작업에 실패해도 예외가 throw되지 않습니다.

as(C# 참조)

C# 및 기타 프로그래밍 언어의 키워드에 대한 자세한 비교는 언어 관련 정보를 참조하십시오. C# 응용 프로그램의 일반적인 구조에 대한 자세한 내용은 C# 프로그램의 일반적인 구조(C# 프로그래밍 가이드)를 참조하십시오.



출처 : http://msdn2.microsoft.com/ko-kr/library/yyaad03b(VS.80).aspx

 
=================================================================================================================================
출처 : http://soyoja.com/342

앞으로 공적으로는 C++ 을 쓰고, 사적으로는 C# 으로 쓰기로 마음먹었다.
C# 자체도 좋은 언어이지만, WCF, WPF, Silverlight, ASP.Net 사용도 고려해 볼때 꼭 익혀놓아야 하는 언어임은 틀림없다.
C# 을 쓰면서 느끼는 C++ 과의 차이점들을 정리해 놓고자 한다.
1. Windows Application 개발 환경의 차이.
C# 의 개발 환경은 전통적인 Visual C++ 보다는 Visual Basic 에 가깝다. 폼을 디자인하고, 이 폼을 동작하는 코드를 별도로 코딩하는 환경은 보다 RAD 를 지향하고 개발생산성을 중시한 C# 의 철학을 잘 보여준다.
또한 윈도우즈 어플 개발시 Visual C++ 에서 나눠져 있던 SDI, MDI, Dialog Based 구분이 없어지고 C# 에서는 Windows Forms 이라는 하나의 형태로만 존재한다. ( 도구상자에 MDI Parent 라는 컨트롤이 존재하는 것은 확인했다. )
2. 보다 강력해진 Intellisense 
Visual C# 의 Intellisense 는 정말 강력하다.
예약어로 정의된 키워드들과, 라이브러리에 이미 정의된 멤버들이 팝업으로 표시되는 것은 물론이고, 심지어 개발자가 정의한 변수/함수 들도 인텔리센스에서 나타난다. 이걸 처음에 보고 얼마나 감동받았는지 ㅜ.ㅜ
덕분에 코딩 시간이 많이 단축된다.
여담이지만, TopCoder 를 할 때 C++ 개발자들은 조금이라도 코딩을 빨리 하기 위해서 자주 사용하는 긴 문장들은 매크로를 즐겨 쓴다.
예 )
#define FOR(i,a,b) for(int i = (a); i < (b); ++i)
#define REP(i,n) FOR(i,0,n)
그런데 C# 에서는 굳이 저릴 필요가 없다. 인텔리센스가 잘 받쳐주고 있으니까...
사실, 인텔리센스는 언어의 기능이 아니라 툴의 기능이므로, 이런 강력한 인텔리 센스는 Visual C++ 에도 충분히 도입할 수 있다고 보여지는데... C# 과 C++ 에 차이를 둔 것은 결국 정책적으로 MS 가 C# 을 밀고 있다는 이야기만 확인시켜주는 셈이다...
그리고 여담. 나는 ret 이란 변수를 즐겨 쓰는데 이걸 쓰다보면 인텔리센스가 return 으로 자꾸 인식해서 좀 불편하다.

3. C# 은 더욱 더 강력하게 객체지향적이다.
자료구조등을 새로 선언할때 class 형으로 만들어서 써야 한다. 자바랑 비슷하다.
자료구조나 컨트롤들 하나 하나가 모두 철저하게 객체로 관리하고, 객체지향적으로 코딩해야 한다는 느낌이 팍팍 한다. 간혹보면 C++ 을 C 처럼 쓰는 것 처럼 구조적 프로그래밍 방식으로 코딩하는건 C# 에서는 거의 불가능해졌다. 
 
4. 자료 구조의 차이
C++ STL 의 List, Vector 대신에 C# 에서는 ArrayList 가 제공된다.
C++ STL 의 Map 대신에 C# 에서는 Hashtable, Dictionary 가 제공된다.
C++ STL 의 Pair 대신에 C# 에서는 KeyValuePair 가 제공된다.
C++ 의 경우 STL 에서 제공하는 자료구조들을 쓰기 위해서 C# 에서는 Collection 을 인클루드 한다.

5. 형변환이 보다 엄격하면서도, 쉬워졌다.
예를 들어 C++ 에서 허용되는 다음과 같은 코드가 C# 에서는 에러가 난다.

                int start = 0;
                if( start ) data.Add(s);  // 암시적으로 int 형을 bool 형으로 변환할 수 없다.
반면에 데이터 타입의 변환은 Convert 라는 객체를 통해서 ToString, ToInt16, ToInt32, ToDateTime 과 같이 다양한 형태의 형변환을 메소드로 지원해서 형변환이 아주 쉬워진다.
6. 클래스 멤버들의 public, private, protected 구분이 더 엄격해졌다.
C++ 과 달리 C# 에서는 메소드, 변수 마다 붙인다.

public a;
public b;
private c;
 
public struct a
{
public int b;
public int c;
};
 
struct 의 경우 C++ 에서는 별도로 선언을 하지 않아도 암시적으로 모든 멤버가 public 으로 선언된다. 하지만 C# 에서는 struct 를 사용할때 위와 같이 멤버들에 대해서 명시적으로 public 인지 지정해야 한다.
7. C# 은 가비지 콜렉션을 지원하며 C++ 과 달리 new 는 존재하지만 delete 는 없다.
C# 에서 객체를 생성할때는 항상 new 로 생성한다. 하지만 C++ 과 달리 delete 를 해줘야 하는 것이 아니라, 가비지 콜렉터가 자동으로 매니지드 힙의 메모리 영역에서 생성된 객체의 메모리를 지워준다.
예를 들어 C# 에서 배열을 선언할 때 아래와 같이 쓴다.
int [] dat = new int [];
2차원 배열은 아래와 같이 할당한다.
int [,] dat = new int [100,100];  // 다중 배열에서 콤마를 쓰는 이런 방식이 처음엔 상당히 생소했다.
new 로 생성하지만 delete 를 하지는 않는다.
명시적으로 프로그래머가 힙 영역에서 데이터를 삭제할 때는 Dispose 명령을 사용한다. 
=========================================================================================================================================
방준영님께서 C++와 C#간의 차이점 정리에 덧붙여 글에서 몇 가지 잘못된 부분을 지적해 주셔서 Update 했습니다.

C++과 C#의 차이점 #1: 선행처리기의 지시어로 #include가 없습니다. Java import와 비슷하게 using 이라는 키워드를 써서 library 에 있는 class 들을 쓸 수 있습니다. 나름대로 그 역할에 충실했던 선행처리기는 자신의 문제점과 함께 갈수록 기능이 줄어 드는 것 같습니다. 그렇지만 C#에서는 Java와 달리 conditional compiler을 위한 지시어들은 계속 지원하는 것 같습니다. 방준영님의 글에 따르면 "C++와의 차이점이라면 선행처리기가 컴파일러 안에 통합되어 있다는 것"이 라네요. 컴파일된 object 자체에 풍부한 metadata 가 포함되어 있다는 의미겠죠. 그렇게 되면 object 파일이 어쩔 수 없어 커진다는 문제도 있습니다. 이건 Embedded System 용으로는 치명적인 약점이 될 수도 있을 것입니다(Java C# CSharp cpp 프로그래밍언어 비교 선행처리기)2008-07-08 23:18:16
C++와 C#의 차이점 #2: Java Byte Code와 비슷하게 IL(Intermediate Language)라는 중간 코드가 있습니다. IL은 Java Byte Code와는 다르게 여러 프로그래밍 언어를 지원하네요. VB, C#, C++ 등. 홍민희님이 그러시는데, JScript.NET, Boo, F# 등이 있다고 하네요(프로그래밍언어 C# C++ Java 비교 중간언어 cpp CSharp)2008-07-08 23:23:07
C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ? (프로그래밍언어 C# C++ Java 비교 cpp CSharp 프로그램진입점)2008-07-08 23:26:33
C++와 C#의 차이점 #4: Array가 단순 메모리 공간이 아닌 부가정보를 가진 객체입니다. 즉, 간단한 예로, array.Length 이런게 먹힌다는 거죠. Java 랑 정말 비슷합니다. C에서처럼 array의 element 개수를 주고 받느라 귀찮게 함수 형식인자 하나 더 쓸 필요가 없다는 것이고, C++에서처럼 element 개수를 가지고 있는 array class를 정의할 필요도 없다는 것이죠. 또는 vector 를 쓸 때처럼 초기화할 때 불편하게 초기화할 필요도 없겠죠. 초기화 방식이 built-in type 하고 똑같으니까요. 물론 최근 c++0x에서는도 언어수준에서 vector 같은 클래스에 대해 uniform initialization 이 가능하게 하려고 하고 있긴 하죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp array)2008-07-08 23:30:26
int[] ia = { 100 }; System.Console.WriteLine(ia[2]); 했더니 “처리되지 않은 예외: System.IndexOutOfRangeException: 인덱스가 배열 범위를 벗어났습니다”라는 run-time exception이 발생하네요. 이 얘기는 array access 할 때마다 range check 를 한다는 얘기인데… bug 를 막는데는 도움이 되겠지만 성능에는 좋지 않을 것입니다. 언어의 설계 철학을 느낄 수 있는 대목입니다.
C++와 C#의 차이점 #5: 설계 철학이 다릅니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 설계철학)2008-07-08 23:37:47
C++는 꼭 쓸사람만 비용을 부담하게 하자는 주의이고(수익자 부담의 원칙이랄까...), C#은 Modern Language 답게 비용이 부담되더라도 버그가 생길 여지를 아예 없애자라는 주의입니다. 요즘 같이 CPU 성능이 갈수록 좋아지는 때에는 Java 나 C# 같은 언어가 좋게 느껴질 수도 있지만 여전히 아주 다양한 Embedded System 에 쓰기는 무리일 것입니다. 세상은 우리가 생각하는 것보다 우리가 경험한 것보다 훨씬 다양하고 다채롭죠.
C++와 C#의 차이점 #6: sbyte, short, int, long, byte, ushort, uint, ulong, float, double, decimal, bool 등 기본 데이터 타입의 크기가 표준화되어 있습니다. 이건 참 맘에 든다. C++도 이렇게 표준화 됐었으면 좋으련만. 그럼 프로젝트 할 때마 OSAL에 int8, int16, int32, int64 이딴거 정의 안해도 될텐데 말입니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 기본데이터타입)2008-07-08 23:44:01
C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 방준영님의 글에 따르면 "엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다"라고 하네요. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다. 저에게는 object 는 마치 C++의 void * 같은 녀석처럼 보이네요. ^^(프로그래밍언어 C# C++ Java 비교 cpp CSharp 상속계층꼭대기기본클래스 object)2008-07-08 23:55:55
C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ? 방준영님의 글에 따르면 "자바도 C#과 마찬가지로 String 타입이 UTF-16이다"라고 하네요.) 유니코드 문자열 클래스인 string의 인스턴스이다. “hello” 라고 하면 내부적으로 적어도 10 bytes 가 할당되겠네. 메모리가 싼 요즘엔 별 이슈는 안되겠다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 문자열리터럴 string)2008-07-09 00:04:57
C++와 C#의 차이점 #9: C++와 달리 pointer 사용에 제약이 있는 것 같다(이건 정확한 게 아니라서 나중에 더 확인하고 정리해 보겠습니다). 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까. 방준영님의 글에 따르면 "C#에도 포인터가 있다. C#으로 만든 OS도 있다"고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp pointer 포인터)2008-07-09 00:10:38
C++와 C#의 차이점 #10: C++의 struct 는 또다른 class 이지만 C#의 struct 는 힙에 할당할 수도 없고, 상속 관계를 쓸 수도 없습니다. 무조건 object 에서 직빵으로 상속받는군요. 그리고 default accessibility 는 private 이네요(C++에서는 public 이죠)(프로그래밍언어 C# C++ Java 비교 cpp CSharp struct)2008-07-09 00:30:56
아주 간단한 concrete object 를 정의할 때나 써 먹는 게 낫겠습니다. 힙에 할당도 안되고, reference로 가리킬 수도 없고 값 형식만으로만 쓰기 때문에 큰 객체는 정의할 꿈도 꾸지 않는게 낫겠네요
new 로 할당하더라도 heap에 할당되는 게 아니라 스택에 할당됩니다. 그리고 모든 연산에 대해 항상 값 자체를 리턴합니다. matrix 를 struct 로 정의하면 모든 연산을 할 때마다 stack 안에서 엄청난 임시 객체들이 만들어지고, 계속해서 객체 복사가 일어난다는 뜻입니다. 허걱! struct를 써서는 각종 optimize 를 할 수가 없다는 뜻이겠죠. 웬만하면 class 를 써야겠네요.
C++와 C#의 차이점 #11: C#의 class 는 단일 상속만 허용됩니다. 그리고, 멤버 변수 및 멤버 함수 외에 속성, 인덱서, 이벤트 등의 멤버가 있고, access 도 internal, protected internal 이 있습니다. Java와 같이 interface 를 따로 뒀으니 단일 상속으로 해도 별로 문제 될 것 같진 않습니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 클래스 class)2008-07-09 00:46:52
C++와 C#의 차이점 #12: C#에서 함수 매개 변수 선언시에는 값 매개 변수 외에 참조 매개 변수(ref 키워드 사용), 출력 매개 변수(out 키워드 사용)를 지정할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 매개변수)2008-07-09 00:51:28
그리고 params 라는 키워드로 매개 변수를 배열로 지정할 수 있는데… 그건 C/C++에서 매개변수에 대해 '...'이라고 표시하고 함수 implementation 안에서는 va_arg 를 쓰는 것과 비슷합니다. 단지 매개 변수 배열로 넘기면 마치 array 쓰듯이 할 수 있다는 점이 다르겠죠. 단순 syntactic sugar 라고 생각됩니다.
함수의 signature 에는 ref, out 키워드가 붙어 있는지의 여부도 포함됩니다. 단, ref, out 만다른 함수 overload 는 불가능합니다.
C++와 C#의 차이점 #13: 초기화되지 않은 지역 변수를 사용하려고 하면 컴파일러 에러(경고가 아니라!!!)가 발생한다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 지역변수 초기화)2008-07-09 00:59:27
초보 프로그래머들이 저지르기 쉬운 실수를 미연에 막아준다. 좋은 특징이라고 생각됩니다. out 과 ref 를 구분해서 초기화되지 않은 경우를 컴파일러가 쉽게 알아낼 수 있도록 한 것도 눈에 띄네요. 똑똑한 것들!
C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ? 방준영님의 글에 따르면 "인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다"라고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 가상함수)2008-07-09 01:10:33
C++와 C#의 차이점 #15: 형식 매개 변수의 형태로 template과 같은 기능을 제공합니다. C#용어로는 지네릭이라고 합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만. 그리고, template이란 키워드를 사용하지 않고 <> 안에 형식 매개변수만 나열하면 됩니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp template)2008-07-09 01:15:30
C++와 C#의 차이점 #16: 클래스의 event 멤버는 signal/slot 기능을 언어 수준에서 제공해주는 것입니다. event는 delegate와 연결됩니다. Boost.Signal library 처럼 type safe signal/slot 기능을 제공해 줍니다. event 멤버를 정의하면 +=, -= 을 이용해서 event handler 를 등록하고 제거할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp class event member delegate)2008-07-09 01:26:13
C++와 C#의 차이점 #17: C++의 RAII idiom은 using 문으로 구현할 수 있습니다. using (resource 초기화) { // 실행 코드 } 이런식으로 작성하시면 됩니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp using구문 코드 블록)2008-07-09 01:32:35
C++와 C#의 차이점 #18: loop construct 로 foreach도 있습니다. int[] ia = {1,2,3}; foreach (int e in ia) { … } 이런게 가능합니다. c++0x 에서도 비슷한 기능을 도입하려고 하고 있죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp foreach)2008-07-09 01:35:42
C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데, 이렇게 하나로 통일하는 게 좋은 것 같네요(프로그래밍언어 C# C++ Java 비교 cpp CSharp scope operator)2008-07-09 01:38:54
=============================================================================================================================
 
이번주는 틈틈이 검색 엔진과 메타 블로그 사이트를 시간순으로 훑으면서 국내 블로거들이 C#을 주제로 쓴 글을 하나씩 읽어 보려고 계획하고 있는 중이다. 그 중 C++와 C#간의 차이점 정리라는 재미있는 글을 발견했는데 내용 중에 약간 잘못된 부분이 있어 지적하려고 한다.
C++과 C#의 차이점 #1: 선행처리기를 쓰지 않습니다.
C#에서도 선행처리기를 쓴다. C++와의 차이점이라면 선행처리기가 컴파일러 안에 통합되어 있다는 것.
C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ?
C#의 Main()은 리턴 값을 가질 수도 있고 안 가질 수도 있고 파라미터를 가질 수도 있고 안 가질 수도 있고 private으로 선언해도 되고 public으로 선언해도 되는 등 자바의 main()에 비해 유연성이 높다. 단순히 변수 이름만 바꾼 것보다는 조금 더 다르다.
C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다.
엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다(전체 명칭은 System.Object). 오남용하면 타입 시스템에 구멍이 생길 수 있는 건 맞지만 C# 2.0부터는 지네릭을 지원하기 때문에 논란의 여지가 될 수 있었던 것은 먼 과거의 일.
C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ?) 유니코드 문자열 클래스인 string의 인스턴스이다.
자바도 C#과 마찬가지로 String 타입이 UTF-16이다.
C++와 C#의 차이점 #9: Java처럼 pointer 가 없다. 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까.
C#에도 포인터가 있다. C#으로 만든 OS도 있다.
C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ?
C++도 가상 함수와 순수 가상 함수를 명시적으로 구분하지만 단지 괴악한 "= 0" 문법을 사용한다는 점이 C#과 다르다. 인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다.
C++와 C#의 차이점 #15: 형식 매개 변수라는 걸 통해 template과 같은 기능을 제공합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만.
형식 매개 변수가 아니고 지네릭을 통해 C++ 템플릿과 비슷한 기능을 제공한다(형식 매개 변수는 지네릭의 일부임). 지네릭을 제공하므로 당연히 지네릭 프로그래밍이 가능하고, 내 생각에는 C++보다 더 쓰기 쉽고 강력하다(C#이니까 다소간의 성능 저하는 이해와 사랑이 필요...^^).
C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데,
(이건 잘못된 내용은 아니지만 부연 설명 차원에서) C#에도 :: 연산자가 있다. 예를 들어 C++에서는 전역 네임스페이스를 나타낼 때 ::std처럼 쓸 수 있지만 C#에선 global::System이라고 쓴다. 주의: 모양은 비슷하지만 용법에 차이가 있다.
[출처] C++와 C#간의 차이점 정리|작성자 하이바

 

'개발지식창고 > C#' 카테고리의 다른 글

C++로 만든 DLL 을 C#에서 사용하기  (0) 2013.01.03
Serialize an ArrayList object to a binary file  (0) 2012.12.24
C# 관련 추천사이트  (0) 2012.12.04
Form 이벤트  (0) 2012.11.30
C++과 C#의 문법적인 차이점  (0) 2012.02.27
Posted by 모과이IT
,