C#

c++ c#의 차이점

코다람쥐 2022. 1. 24. 18:17

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를 사용