[C#, 유니티] 02. C++과 C#의 차이점

2022. 6. 30. 19:44코딩 2막 <C#개념편>

728x90

C++를 이제 막 걸음마 땐 코린이라면

C#을 배우게 되면 장담컨데 멘붕이 올거야

이제 부터 그 이유를 큰 맥락에서 설명하겠음


1. 구조체와 클래스에서의 차이

흔히 말하는 기본데이터타입인 int, float, bool은 C#에서 구조체라는 놈이다.

C++에서는 구조체가 상속이 되었으나 C#에서는 구조체가 상속이 안된다. (하지만 클래스는 상속이 됩니다)C#에서는 스택, 힙 영역에 할당되는 부분이 조금 다르다.

일반적으로 구조체는 스택에 할당되고, 일반적으로 클래스는 힙에 할당된다.

그리고 C#에서는 구조체던 클래스던 접근제한자의 기본은 private다.

출력 결과


2. 접근제한자에서의 차이

C#에서 우리가 다루는 모든 스크립트들은 클래스(class)이다.

클래스에는 멤버변수와 멤버함수가 있다.

그리고 그 변수와 함수를 통제하는 접근제한자라는 놈이 존재한다.

접근제한자는 public, protected, private가 있는데,

C++에서는 접근제한자를 쓸 때 영역으로 구분했지만,

C#에서는 멤버 하나하나에 접근제한자를 붙여야 한다. 그리고 접근제한자가 없는 경우 class이기 때문에 private임

C#은 이런식으로 써야함


3. 배열에서의 차이

C++에서는 배열을 쓸때 아래 처럼 썼지만

C++에서의 배열형태

하지만 C#에서는 다음과 같이 배열을 쓴다.

C#에서의 배열형태

C#에서는 구조체와 클래스의 일반변수가 "포인터 변수"다. 즉 주소를 담는다.

그렇기 때문에 new를 통해 새로이 공간을 할당하고 주소를 부여받아야 한다.

단 구조체 중 기본데이터타입은 이미 그 부분이 구현되어 있어서 따로 해주지 않아도 된다.

그런데 C#의 경우 구조체는 new를 해도 스택에 할당되지만, 클래스는 new가 힙에 할당된다는 큰 차이가 있다.

그리고 C++에서는 new를 통해 heap영역에 할당되었다면, delete를 써서 메모리를 비워주어야 했다. (메모리누수)

하지만, C#에서는 delete를 쓰지 않는다. 즉, 메모리를 우리가 관리하지 않아도 된다는 말이다.

이것을 GC(가비지컬렉터)라고 부른다.


4. 벡터에서의 차이

C++에서는 다음과 같이 벡터를 썼다.

C++에서의 벡터형태

하지만 C#에서는 다음과 같이 벡터를 쓴다.

C#에서의 벡터형태

위의 List<int> 이것은 가변배열 벡터와 동일한 역할을 수행한다.

그리고 참고로 링크드리스트와 뭔가 비슷할것같은데 C#에서 링크드리스트는 다르게 쓰니 주의하자.


★★5. 얕은복사와 깊은복사

C++과 C#의 가장 큰 차이점을 보여주는게 바로 얕은복사와 깊은복사이다.

구조체는 일반적으로 깊은 복사(DeepCopy)를 쓰고, 클래스는 일반적으로 얕은 복사(ShallowCopy)를 쓴다.

깊은 복사란 값 자체를 복사하는 것(복사하려는 놈을 똑같이 하나 더 복사하는데 복사한것의 주소를 가리킴)을 말하고, 얕은 복사는 주소를 복사하는 것이다.


여기서 일반적으로라는 말은 예외가 있다는 것!! 극히 드물지만 그 예로 string이 그렇다.

C#에서는 string은 깊은 복사를 하지만 클래스다.


굳이 비유를 들자면 '얕은복사는 폴더를 바로가는 것이라면, 깊은복사는 복사한 폴더를 바로 가는 것'이라고 생각하면 된다.

(자주하는 질문) 깊은 복사와 얕은복사 vs 콜바이어드레스와 콜바이밸류
결론부터 이야기하면 다르다.
깊은 복사와 얕은복사는 복사의 타입에 대한 이야기이다. 

콜바이밸류와 콜바이어드레스는 복사되는 형태에 대한 이야기이다.

(자주하는 질문) ref 키워드 vs 참조자
C++에서는 참조자를 쓸 때 &를 썼지만
C#에서는 ref 키워드를 쓴다. 

 

출력 결과


끝으로 C#은 C++에 비해서 제약조건이 더 엄격해졌다. 이게 무슨 말이냐면 

위처럼 캐스팅이 엄격해져서 오류가 뜬다. int는 bool로 형변환이 되지 않는다.

 

공감해주셔서 감사합니다

728x90