반응형

앞으로 공적으로는 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# 에서는 에러가 난다.



반면에 데이터 타입의 변환은 Convert 라는 객체를 통해서 ToString, ToInt16, ToInt32, ToDateTime 과 같이 다양한 형태의 형변환을 메소드로 지원해서 형변환이 아주 쉬워진다.

6. 클래스 멤버들의 public, private, protected 구분이 더 엄격해졌다.

C++ 과 달리 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 명령을 사용한다.  


+ Recent posts