c++ c#의 차이점
1. struct
c++ : 멤버변수가 public임
c# : 멤버변수가 private임
2. 참조방법
c++ : 참조변수(&) 또는 포인터(*)를 이용
c# : ref와 out으로 참조
3. class
차이없음
4. 얕은복사 깊은복사
차이없음. 깊은복사하려면 c++과 똑같이 새롭게 동적할당을하고 멤버들을 복사해주면 됨.
5. 접근제어자
c++ : public: 형식으로 표현하면 public:밑의 멤버들은 모두 public으로 선언됨
c# : 멤버 하나하나 접근제어자를 넣어줘야 함.
6. 메모리 해제
c++ : 반드시 프로그래머가 delete를 통해 메모리를 해제해야함
c# : 언어차원에서 관리해줌
7. this
c++ : this->a처럼 사용
c# : this.a처럼 사용
8. 생성자 초기화
c++ : 초기화 목록 사용가능
c# : 초기화 목록 불가능, 생성자마다 public키워드를 붙여야 초기화가 가능.
9. 생성자 위임
c++ : 생성자이름을 통해서 호출
c# : this(매개변수)를 통해서 호출
10. 입출력
c++ : cout << , cin >>
c# : Console.WriteLine(), Console.ReadLine()
11. static초기화
c++ : 초기화목록을 사용하여 초기화
c# : 선언한 곳에서 대입연산자를 통해서 초기화 예를들어, 'static public int a = 1;'과 같은 방식으로 씀.
12. 부모생성자 초기화
c++ : 부모생성자 명을 적어줌
c# : base를 통해서 초기화 예를들어, '자식생성자() : base()'와 같은 방법으로 초기화함.
13. 부모클래스 멤버에 접근
c++ : '부모클래스명::멤버'를 통한 접근
c# : 'base.부모멤버'를 통한 접근
14. 오버라이딩
c++ : 그냥 자식클래스에서 똑같은 함수명을 쓰면 됨.
c# : c++처럼해도 되고 좀 더 명확히 하기위해서 재정의한 함수명 왼쪽에 new키워드를 붙여줌.
예를들어, 'public new void ABC () {}' 형식으로 오버라이딩을 함.
15. 동적바인딩
c++ : 부모클래스의 함수에 virtual키워드만 붙여주면 됨
c# : 부모클래스에 virtual키워드를 붙여주고 자식클래스에는 override라는 키워드를 붙여줘야함. 대신 여기서 new키워드는 뺌.
예를들어,
부모클래스에서는 public virtual void ABC() { }; 라고 정의하고
자식클래스에서는 public override void ABC() { }; 라고 정의하면 된다.
16. 파일분리했을 때
c++ : #include를 통해서 헤더파일을 불러오는 코드를 넣어야함
c# : namespace가 동일하면 추가하지 않아도 됨.
17. 배열 선언
c++ : int arr[];
c# : int[] arr;
18. 범위기반 for문
c++ : for(int n : arr) {}
c# : foreach(int n in arr) {}
19. 다차원 배열
c++ : int arr[][];
c# : int[ , ] arr;
c#에도 int[][]가 있다. 예를들어, int[][] a = new int [3][];이라고하면 1차원배열은 자기맘대로 동적으로 할당하면된다.
a[0] = new int [1];
a[1] = new int [4];
a[2] = new int [2];
이렇게 동적으로 할당해주면 아래와같은 모양이 된다.
a[2] : [ . . ]
a[1] : [ . . . . ]
a[0] : [ . ]
20. template 기능(C#에서는 Generic)
c++ : template<type T>라는 형식으로 사용
c# : 클래스나 함수명 옆에 <T>만 붙여주면 됨.
예를들어, static void MyFunc<T>(T n) { } 이런식으로 사용.
또한, c#에서는 where키워드를 통해 조건설정가능하다.
조건에는 struct, class, new(), '클래스명' 등이 들어갈 수 있다.
예를들어, class MyClass where T : 조건
struct : T는 반드시 값형식이어야 된다는 조건
class : T는 반드시 참조형식이어야 된다는 조건
new() : 어떠한 인자도 받지않는 기본생성자가 있어야된다는 조건
클래스명 : 클래스나 그 클래스를 상속받은 클래스여야 된다는 조건
21. 다중상속과 인터페이스
c++ : 가능하지만 권장하지 않음. 대신 다중상속을 위한 원칙이 있음. 인터페이스는 없음
c# : 근본적으로 다중상속을 막아놓고 인터페이스를 지원함.
22. 추상클래스
c++ : 추상클래스를 만들기 위해서모든 메소드를 순수가상함수로 만듬.
c# : 추상 클래스 앞에 abstract키워드를 추가.
예를들어, abstract class MyClass{}
23. 함수포인터(C#에서는 Delegate)
c++ : 함수포인터를 사용
c# : delegate를 사용