Modern C++ 공부 Day 6입니다.
오늘 공부할 내용은 C++ 시맨틱스입니다.
이전 포스트를 읽고 오시면 본 포스트를 공부하는 데 도움이 됩니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day5] 상수 참조에 의한 전달 Pass by const Reference
C++ Semantics
C++에서는 기본적으로 (By default) 객체나 변수를 다른 변수에 할당하거나 함수에 전달할 때 복사를 통해 전달합니다. 이를 '값 시맨틱스(Value semantics)'라고 합니다. (C++에서 참조를 통해 전달할 수도 있지만 그렇게 하기 위해서는 개발자가 추가적으로 address나 reference를 통해 전달해야 합니다.) 하지만, 이와 반대로 자바, 파이썬, C# 등 많은 언어들은 기본적으로 '참조 시맨틱스(Reference semantics)'를 사용합니다.
참조 시맨틱스 Reference Semantics
참조 시맨틱스는 객체나 변수를 다른 객체로 초기화하거나 함수에 전달할 때 새로운 객체를 생성하지 않고 기존의 객체나 변수를 참조합니다. 이렇게 되면, 새로운 메모리 할당이나 데이터 복사 없이 원본 객체와 같은 메모리를 공유하게 됩니다. 따라서 여러 객체가 원본 객체의 메모리를 공유하게 됩니다.
이런 참조 관계를 관리하기 위해 많은 언어들은 '가비지 컬렉터(Garbage collector)'라는 기능을 내장하고 있습니다. 가비지 컬렉터는 모든 객체를 추적하며, 객체 간의 관계를 확인하고 사용 여부를 판단합니다. 이 정보를 바탕으로, 메모리 해제가 안전한지 판단하고 필요하지 않은 복사나 초기화 작업을 방지합니다. 그러나 가비지 컬렉터 자체가 시스템의 시간과 메모리를 소비하며, 정확한 메모리 해제 시점을 파악하기 어려워집니다.
값 시맨틱스 Value Semantics
이러한 이유로, C++는 기본적으로 참조 시맨틱스를 사용하지 않고 값 시맨틱스를 사용합니다. 따라서 C++에는 가비지 컬렉터가 없습니다. 이로 인해 C++에서는 많은 복사 작업이 발생하며, scope를 벗어나는 순간 지역 변수들이 사라지고 메모리가 해제됩니다. 그렇기 때문에, scope를 벗어나더라도 계속 사용하고 싶은 변수나 객체가 있다면 개발자가 직접 메모리를 할당하고 관리해야 합니다.
이후의 포스트에서는 Modern C++에서 이 문제를 어떻게 완화하고 다루는지 알아보겠습니다.
(새로운 포인터가 등장합니다!)
'Programming > C++' 카테고리의 다른 글
[Modern C++ 공부 - Day8] String Operations (0) | 2023.07.05 |
---|---|
[Modern C++ 공부 - Day7] 선언과 초기화 Declaration & Initialization (0) | 2023.06.16 |
[Modern C++ 공부 - Day5] 상수 참조에 의한 전달 Pass by const Reference (0) | 2023.06.15 |
[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference (0) | 2023.06.15 |
[Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address (0) | 2023.06.15 |