C++ 언어는 메모리를 직접 관리해야 하는 프로그래밍 언어 중 하나입니다.

C++ 언어는 메모리를 직접 할당하고 해제하는 것뿐만 아니라, 메모리의 접근 권한을 설정하고, 메모리의 상태를 모니터링하는 등의 작업을 직접 수행해야 합니다.

C++ 언어는 객체지향 프로그래밍 언어로, 객체의 생성과 소멸을 직접 관리해야 합니다. 객체의 생성과 소멸은 메모리의 할당과 해제와 밀접하게 연관되어 있기 때문에, C++ 언어에서는 객체의 생성과 소멸을 신중하게 관리해야 합니다.

C++ 언어는 메모리를 직접 관리하는 것이 복잡하고 어렵기 때문에, 초보자에게는 어려울 수 있습니다. C++ 언어에서는 메모리를 직접 관리하는 것 외에도, 자동으로 메모리를 관리해주는 기능도 제공합니다.

프로그래밍을 할 때는 메모리를 직접 관리하는 것과 자동으로 관리하는 것을 적절하게 사용해야 합니다. 이를 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

C# 언어는 메모리를 자동으로 관리하는 프로그래밍 언어 중 하나입니다.

C# 언어에서는 메모리를 직접 할당하고 해제하는 것이 아니라, .NET 프레임워크가 메모리를 자동으로 관리합니다. .NET 프레임워크는 메모리를 할당하고, 필요한 경우 메모리를 자동으로 해제합니다.

C# 언어는 가비지 컬렉션(Garbage Collection)이라는 기능을 제공하여 사용되지 않는 메모리를 자동으로 탐지하고 제거합니다. 가비지 컬렉터는 메모리를 자동으로 관리하여 메모리 누수를 방지하고, 프로그램의 안정성을 높입니다.

C# 언어는 메모리를 자동으로 관리하기 때문에, 메모리를 직접 관리하는 것보다 쉽고 편리합니다. 하지만, 메모리를 자동으로 관리하는 것은 메모리 관리에 대한 이해와 지식이 필요하지 않다는 것은 아닙니다. C# 언어에서도 메모리를 효율적으로 사용하고, 메모리 누수를 방지하기 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

Java 언어는 메모리를 자동으로 관리하는 프로그래밍 언어 중 하나입니다.

Java 언어에서는 메모리를 직접 할당하고 해제하는 것이 아니라, Java 가상 머신(JVM)이 메모리를 자동으로 관리합니다. JVM은 메모리를 할당하고, 필요한 경우 메모리를 자동으로 해제합니다.

Java 언어는 가비지 컬렉션(Garbage Collection)이라는 기능을 제공하여, 사용되지 않는 메모리를 자동으로 탐지하고 제거합니다. 가비지 컬렉터는 메모리를 자동으로 관리하여 메모리 누수를 방지하고, 프로그램의 안정성을 높입니다.

Java 언어는 메모리를 자동으로 관리하기 때문에, 메모리를 직접 관리하는 것보다 쉽고 편리합니다. 하지만, 메모리를 자동으로 관리하는 것은 메모리 관리에 대한 이해와 지식이 필요하지 않다는 것은 아닙니다. Java 언어에서도 메모리를 효율적으로 사용하고, 메모리 누수를 방지하기 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

C언어는 메모리를 직접 관리해야 하는 프로그래밍 언어 중 하나입니다.

C언어는 메모리를 직접 할당하고 해제하는 것뿐만 아니라, 메모리의 접근 권한을 설정하고, 메모리의 상태를 모니터링하는 등의 작업을 직접 수행해야 합니다.

메모리를 직접 관리하는 것은 메모리 누수를 방지하고, 프로그램의 안정성을 높이는 데 중요합니다. 하지만, 메모리를 직접 관리하는 것은 복잡하고 어렵기 때문에, 초보자에게는 어려울 수 있습니다.

C언어에서는 메모리를 직접 관리하는 것 외에도, 자동으로 메모리를 관리해주는 기능도 제공합니다. 대표적인 예로는 malloc() 함수와 free() 함수를 이용한 메모리 할당과 해제, 그리고 C++의 스마트 포인터 등이 있습니다.

프로그래밍을 할 때는 메모리를 직접 관리하는 것과 자동으로 관리하는 것을 적절하게 사용해야 합니다. 이를 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

가비지 컬렉터(GC) 없이 메모리 안전성을 제공하는 대표적인 언어로는 다음과 같은 것들이 있습니다.

      1. 러스트(Rust)

  • 모질라 재단에서 개발되고 있는 언어로, 메모리 안전성과 성능 및 편의성에 중점을 두고 있습니다.
  • 데이터 레이스나 널 포인터 등의 메모리 관련 오류를 사전에 방지할 수 있습니다.

    2. 스칼라(Scala)
  • JVM 기반의 언어로, 메모리 안전성을 제공합니다.
  • 가비지 컬렉션을 사용하지만, 메모리 안전성에 초점을 맞춘 언어입니다.

    3. 고(Go)
  • 구글에서 개발한 언어로, 메모리 안전성을 제공합니다.
  • 가비지 컬렉션을 사용하지 않고, 자동 메모리 관리 기능을 제공합니다.

    4. C++
  • C언어를 기반으로 객체 지향 프로그래밍을 지원하도록 설계된 언어입니다.
  • 메모리를 직접 관리해야 하기 때문에 메모리 관련 오류가 발생하기 쉬우며, 이를 방지하기 위해 메모리 안전성을 고려한 프로그래밍이 필요합니다.

    5. 오브젝티브-C(Objective-C)
  • C언어에 스몰토크의 메시지 전송 기능을 추가한 언어입니다.
  • 메모리 안전성을 제공하기 위해 가비지 컬렉션을 사용합니다.

마이크로소프트가 Rust 개발자를 모집하는 것으로 보아 Rust 채택이 가속화되고 있음
전년 대비 2% 감소한 인력에도 불구하고, 마이크로소프트는 C#에서 벗어나 Rust 기반 플랫폼으로의 이동을 위한 팀 구성을 지속중
Microsoft 365의 주요 소프트웨어 아키텍트 직무에는 Rust 컴포넌트 라이브러리, SDK, 기존의 C# 기반 서비스를 Rust로 재구현하는 기술적 방향, 설계 및 구현 가이드가 포함됨
마이크로소프트는 Rust 프로그래밍 언어 채택을 기반으로 전 세계적인 규모의 플랫폼 서비스를 현대화하기 위한 새로운 팀을 구성 중임
마이크로소프트는 메타, AWS와 함께 Rust 재단의 플래티넘 멤버로, 메모리 안전한 프로그래밍에 대한 열정이 증가함에 따라 이러한 움직임은 놀랍지 않음
오랫동안 Rust에 관심을 가지고 있었으며, 2023년에는 윈도우즈 커널에 Rust가 도입되었음을 발표함
Rust는 여러 해 동안 여러 컴포넌트에 점차적으로 통합되고 있음
마이크로소프트는 공개적으로는 여전히 C#에 전념하고 있지만, 지난 몇 년간의 행동과 채용 공고는 회사가 옵션을 열어두고 있음을 시사함

러스트 언어

러스트(Rust)는 모질라 재단에서 개발되고 있는 프로그래밍 언어로, 메모리 안전성과 성능 및 편의성에 중점을 두고 있습니다.

가비지 컬렉터 없이 메모리 안전성을 제공하는 대표적인 언어이며, C++의 대체재로 등장했습니다. 현대적인 프로그래밍 언어의 특징을 가지고 있으면서도 저수준 프로그래밍 언어의 특징도 가지고 있어서 시스템 프로그래밍에 적합합니다.

다음은 러스트 언어의 특징입니다.

메모리 안전성: 메모리 안전성에 초점을 맞춘 언어로, 데이터 레이스나 널 포인터 등의 메모리 관련 오류를 사전에 방지할 수 있습니다.
병렬성: 안전하게 병렬 처리를 할 수 있는 기능을 제공합니다. 스레드 간 데이터 경합을 방지하고 안전하게 병렬 처리를 할 수 있습니다.
속도와 효율성: 고성능 시스템 프로그래밍에 적합한 언어로, 빠른 실행 속도와 높은 효율성을 제공합니다. 메모리 관리 오버헤드가 적고, 효율적인 코드 작성이 가능합니다.
함수형 및 객체지향 프로그래밍 지원: 함수형 프로그래밍과 객체지향 프로그래밍을 모두 지원합니다. 사용자의 선호에 따라 선택하여 사용할 수 있습니다.
커뮤니티: 활발한 커뮤니티를 가지고 있습니다. 다양한 라이브러리와 도구를 제공하며, 개발자들 간의 정보 공유와 협업이 활발하게 이루어집니다.
러스트는 안전하고 효율적인 프로그래밍을 위한 언어로, 시스템 프로그래밍부터 웹 개발까지 다양한 분야에서 사용될 수 있습니다.

1. [C#] 가비지 컬렉션(Garbage Collection)

개요)
C#은 CLR(Common Language Runtime)에 의해 코드가 실행되고 관리된다.
CLR에서 가비지 컬렉터(Garbage Collector)는 자동 메모리 관리자 역할을 한다. 애플리케이션에서 메모리 할당 및 해제를 자동으로 관리한다.

장점)
개발자가 수동으로 메모리를 관리할 일이 줄어든다. -> 개발 능률 Up
관리되는 힙(managed heap)에 메모리 할당이 효율적으로 이루어진다.
객체가 다른 객체에 할당된 메모리 자체에 사용할 수 없도록 하여 메모리 보안을 제공한다.

메모리 할당)
사용자에 의해 새 프로세스가 시작되면 런타임에서는 메모리에 인접한 주소 공간 영역을 예약한다.
이 예약된 주소 공간을 관리되는 힙(managed heap)이라고 한다.
관리되는 힙에서는 객체가 할당될 주소의 포인터를 관리한다.
모든 참조 형식(reference type)은 관리되는 힙에 할당된다.

과정)
애플리케이션에서 참조 형식을 처음 만드는 경우, 이 참조 형식에 대한 메모리는 관리되는 힙의 기본 주소로 할당된다.
애플리케이션이 다음 개체를 만들 때 런타음은 처음 만든 객체 바로 다음 주소 공간에 메모리를 할당한다.
이러한 방식을 반복하여 새 객체에 대한 메모리 공간을 계속 할당한다.
관리되는 힙은 관리되지 않는 힙(unmanaged heap)에서 할당하는 것보다 속도가 더 빠르다.
런타임에서 포인터에 값을 더하여 객체의 메모리를 할당하기 때문에, 스택에서 메모리를 할당하는 속도만큼 빠르다.
또한, 연속으로 할당된 새 객체는 인접한 주소를 통해 빠른 속도로 액세스할 수 있다.

메모리 해제)
가비지 컬렉터의 최적화 엔진은 수행 중인 할당에 따라 수집을 수행하기에 가장 적합한 시간을 결정한다.
애플리케이션에서 더 이상 사용되지 않는 객체에 대한 메모리를 해제한다.
애플리케이션의 루트를 검사하여 더 이상 사용되지 않는 개체를 결정한다.
애플리케이션 루트에는 다음이 포함된다.

정적 필드(static field)
스택 객체
CPU 레지스터 등

GC는 이 목록을 사용하여 루트를 통해 연결할 수 있는 모든 객체 그래프를 생성한다.
그래프에 연결되지 못한 객체는 가비지 컬렉터에서 가비지로 간주하고 할당을 해제한다.

가비지 컬렉션)
가비지 컬렉션은 다음 조건 중 하나가 충족될 경우 발생한다.
시스템 메모리 부족
관리되는 힙의 할당된 객체에 사용되는 메모리가 허용되는 최대치를 초과
GC.Collect 메서드 호출

세대)
관리되는 힙은 세대별로 나눠져 관리된다. 주로 0세대, 1세대, 2세대로 나뉜다.

0세대
새로 할당된 객체의 메모리 영역으로, 주로 이 세대에서 가비지 컬렉션이 자주 발생한다.
대부분의 객체는 0세대에서 정리되며 다음 세대까지 남아있지 않는다.
0세대가 가득 찼을 때 새 객체가 할당될 경우, 먼저 0세대 영역에서 검사가 이루어진다.

1세대
0세대 컬렉션을 수행한 후 살아남은 메모리를 압축하여 1세대로 승격한다.
컬렉션이 0세대에서 충분한 공간을 확보하지 못한 경우, 1세대와 2세대에서 수행한다.

2세대
가장 오랫동안 살아남은 객체들이 저장되는 공간이다.
대량 객체 힙(3세대)의 객체는 2세대에서도 컬렉션이 이루어진다.
관리되지 않는 리소스
대부분의 객체는 자동으로 관리되지만, 명시적인 정리가 필요한 관리되지 않는 리소스가 존재한다.

Dispose
이런 경우 IDisposable 인터페이스를 통해 Dispose 메서드를 재정의 하여 관련 작업을 수행한다.
public class MyClass : IDisposable
{
public void Dispose
    {
     //정리 로직 구현
    }
}
객체 사용을 마치면, 명시적으로 Dispose 메서드를 호출해야 한다.
Finalize
만일, 실수로 Dispose를 호출하지 않았을 경우를 대비하여 정리하는 방안도 마련할 수 있다.
객체가 가비지 컬렉션 될때 호출되는 Finalize를 재정의를 통해 수행하게 된다.
public class MyClass : IDisposable
{
public void Dispose {...}
    
    ~MyClass()
    {
     //정리 로직 구현
    }
}
다만 가비지 컬렉션 도중 특정 객체의 다른 작업이 수반되는 것이므로 성능 이슈가 발생한다.
이 방식은 되도록 사용하지 않는 것이 좋다.


+ Recent posts