구조체와 클래스 차이
CPP
기본 접근 제한자가 class private, struct public
C#
구조체 가비지 대상아님
구조체 정적 바인딩
구조체 대입시 값의 복사가 됨
용량이 작고 임시적으로 쓰는 데이터를 구조체로 만드는 것이효과적
다른 구조체의 상속은 안되지만 인터페이스 상속은 된다.
(cpp 싱글포인터라고 생각하면 반먹고 들어감)
클래스 참조 자료형
동적바인딩으로 만들어진 힙에할당된 인스턴스를 참조하는 방식
클래스간의 대입시 인스턴스의 참조값이 대입됨
==========================================================================
- C++와 C#의 차이점 #2: Java Byte Code와 비슷하게 IL(Intermediate Language)라는 중간 코드가 있습니다. IL은 Java Byte Code와는 다르게 여러 프로그래밍 언어를 지원하네요. VB, C#, C++ 등2008-07-08 23:23:07
- C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ? 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 이 가능하게 하려고 하고 있긴 하죠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: 설계 철학이 다릅니다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 이딴거 정의 안해도 될텐데 말입니다.2008-07-08 23:44:01
- C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 방준영님의 글에 따르면 "엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다"라고 하네요. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다. 저에게는 object 는 마치 C++의 void * 같은 녀석처럼 보이네요. ^^2008-07-08 23:55:55
- C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ? 방준영님의 글에 따르면 "자바도 C#과 마찬가지로 String 타입이 UTF-16이다"라고 하네요.) 유니코드 문자열 클래스인 string의 인스턴스이다. “hello” 라고 하면 내부적으로 적어도 10 bytes 가 할당되겠네. 메모리가 싼 요즘엔 별 이슈는 안되겠다.2008-07-09 00:04:57
- C++와 C#의 차이점 #9: C++와 달리 pointer 사용에 제약이 있는 것 같다(이건 정확한 게 아니라서 나중에 더 확인하고 정리해 보겠습니다). 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까. 방준영님의 글에 따르면 "C#에도 포인터가 있다. C#으로 만든 OS도 있다"고 하네요.2008-07-09 00:10:38
- C++와 C#의 차이점 #10: C++의 struct 는 또다른 class 이지만 C#의 struct 는 힙에 할당할 수도 없고, 상속 관계를 쓸 수도 없습니다. 무조건 object 에서 직빵으로 상속받는군요. 그리고 default accessibility 는 private 이네요(C++에서는 public 이죠)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 를 따로 뒀으니 단일 상속으로 해도 별로 문제 될 것 같진 않습니다2008-07-09 00:46:52
- C++와 C#의 차이점 #12: C#에서 함수 매개 변수 선언시에는 값 매개 변수 외에 참조 매개 변수(ref 키워드 사용), 출력 매개 변수(out 키워드 사용)를 지정할 수 있습니다.2008-07-09 00:51:28
- 그리고 params 라는 키워드로 매개 변수를 배열로 지정할 수 있는데… 그건 C/C++에서 매개변수에 대해 '...'이라고 표시하고 함수 implementation 안에서는 va_arg 를 쓰는 것과 비슷합니다. 단지 매개 변수 배열로 넘기면 마치 array 쓰듯이 할 수 있다는 점이 다르겠죠. 단순 syntactic sugar 라고 생각됩니다.
- 함수의 signature 에는 ref, out 키워드가 붙어 있는지의 여부도 포함됩니다. 단, ref, out 만다른 함수 overload 는 불가능합니다.
- C++와 C#의 차이점 #13: 초기화되지 않은 지역 변수를 사용하려고 하면 컴파일러 에러(경고가 아니라!!!)가 발생한다.2008-07-09 00:59:27
- 초보 프로그래머들이 저지르기 쉬운 실수를 미연에 막아준다. 좋은 특징이라고 생각됩니다. out 과 ref 를 구분해서 초기화되지 않은 경우를 컴파일러가 쉽게 알아낼 수 있도록 한 것도 눈에 띄네요. 똑똑한 것들!
- C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ? 방준영님의 글에 따르면 "인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다"라고 하네요.2008-07-09 01:10:33
- C++와 C#의 차이점 #15: 형식 매개 변수의 형태로 template과 같은 기능을 제공합니다. C#용어로는 지네릭이라고 합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만. 그리고, 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 를 등록하고 제거할 수 있습니다.2008-07-09 01:26:13
- C++와 C#의 차이점 #17: C++의 RAII idiom은 using 문으로 구현할 수 있습니다. using (resource 초기화) 2008-07-09 01:32:35
- C++와 C#의 차이점 #18: loop construct 로 foreach도 있습니다. int[] ia = {1,2,3}; foreach (int e in ia) { … } 이런게 가능합니다. c++0x 에서도 비슷한 기능을 도입하려고 하고 있죠2008-07-09 01:35:42
- C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데, 이렇게 하나로 통일하는 게 좋은 것 같네요
댓글 없음:
댓글 쓰기