일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 오블완
- 이벤트 함수 실행 순서
- 전쟁-전투
- KRAFTON JUNGLE
- 크래프톤 정글
- 추상클래스와인터페이스
- 크래프톤정글
- 4기
- project3
- kraftonjungle
- pintos
- 연결리스트
- 백준
- 파이썬
- 유니티
- 티스토리챌린지
- TiL
- 크래프톤정글4기
- 네트워크
- 알고리즘
- 다익스트라
- 알고리즘수업-너비우선탐색2
- User Stack
- 크래프톤 정글 4기
- 핀토스
- Unity
- anonymous page
- C
- BFS
- c#
- Today
- Total
말감로그
24.08.22 Unity_C# - C#와 C++의 차이, 구조체와 클래스, 박싱과 언박싱, 제네릭 본문
C#과 C++의 차이점
메모리 관리 방식이 가장 큰 차이라고 생각합니다.
C#은 가비지 컬렉터가 메모리 관리를 자동으로 처리합니다. 가비지 컬렉터는 메모리를 주기적으로 검사하여 더 이상 참조되지 않는 객체를 찾아서 메모리를 해제합니다. 주기적으로 실행되는 과정에서 일부 프로그램의 성능이 저하되고 오버헤드가 발생할 수 있습니다.
C++은 개발자가 메모리를 직접 관리해야 합니다. 객체를 생성할 때 'new' 연산자를 사용하고, 사용이 끝나면 'delete'를 통해 메모리를 해제합니다. 수동으로 관리하기 때문에 오버헤드가 없고, 메모리 할당과 해제의 속도가 빠릅니다.
C#은 개발 편의성과 생산성을 중시하는 환경에 적합하며, C++은 성능과 하드웨어 접근이 중요한 시스템 수준의 프로그래밍에 적합합니다.
C#은 왜 다중상속이 안될까?
죽음의 다이아몬드 상속 때문입니다.
C++은 다중 상속이 가능한데, 클래스들이 서로 상속을 받게 되면서 다이아몬드 구조의 상속 관계를 갖게 되는데, 이때 모호성이 발생하면서 생기는 문제를 말합니다.
C#은 편의성을 중시하는 언어이기 때문에 이러한 문제를 없애고자 다중 상속을 제한한 것입니다.
구조체와 클래스
구조체와 클래스는 데이터와 그 데이터를 처리하는 메서드를 묶는다는 공통점이 있지만
구조체는 값 타입으로 스택에 할당되고, 클래스는 참조 타입으로 힙에 할당됩니다.
그리고 구조체는 상속이 불가능하지만, 클래스는 상속이 가능합니다.
C#의 특성상 힙에 할당된 메모리는 가비지 컬렉터가 정리해주는데, 처리해야 할 양이 많으면 프로그램 동작 속도가 느려지거나 멈추기도 합니다. 그래서 굳이 힙(클래스)에 할당하지 않아도 되는 건 스택 메모리(구조체)에 할당하면 프로그램 속도 향상에 도움이 될 수 있습니다.
박싱 VS 언박싱
박싱은 값 타입의 데이터를 참조 타입으로 변환하는 작업입니다. 예를 들면, int 같은 값 타입의 변수를 object 타입의 변수에 할당할 때 힙에 저장되는데, 이때 박싱이 발생합니다.
언박싱은 반대로, 참조 타입의 객체를 다시 값 타입의 데이터로 변환하는 작업입니다. 언박식을 할 때 유의해야 할 점은 캐스트를 사용하여 명시적으로 타입을 지정해주어야 합니다.
박싱과 언박식을 사용할 때 주의해야할 점
박싱과 언박싱은 CPU 처리능력을 소모하기에 과도하게 사용되면 성능 저하의 원인이 될 수 있고,
언박싱 시 잘못된 타입으로 캐스트를 시도하면 오류가 발생할 수 있습니다. 그래서 박싱하기 전 객체의 원래 타입을 정확히 알고 있어야 합니다.
박싱된 값은 힙에 저장되므로, 과도하기 사용되면 가비지 컬렉터에 많은 부담을 줄 수 있습니다.
제네릭이란?
제네릭은 데이터 메서드 등을 다룰 때 구체적인 데이터 타입을 지정하지 않고 일반화된 형태로 정의하는 방법입니다. 제네릭을 사용하면 코드의 재사용성을 높일 수 있고, 타입 안전성을 확보할 수 있습니다
'TIL' 카테고리의 다른 글
24.08.27 Unity_C# - 동기 비동기(코루틴, async/await, Task.Run()) (1) | 2024.08.27 |
---|---|
24.08.26 Unity_C# - delegate, event , action (2) | 2024.08.26 |
24.08.21 Unity_C# - 추상 클래스와 인터페이스 ,virtual (0) | 2024.08.21 |
24.08.20 Unity_C# - 객체 지향 프로그래밍, SOLID 원칙 (0) | 2024.08.20 |
24.08.19 Unity_C# - Time.deltaTime, 유니티로 타이머 구현 알고리즘 설명 (0) | 2024.08.19 |