C#

[C#] unsafe / fixed 키워드

우준세 2023. 9. 25. 11:49
728x90
반응형

 

이번 포스팅은 C# bitmap 클래스를 공부하면서 몰랐던 unsafe / fixed 키워드에 대해 작성하려 합니다. C#은 .Net 환경에서 메모리 관리를 자동으로 처리하는 기능을 제공하지만 가끔 직접 메모리를 조작해야 하는 경우도 있습니다. 이런 경우에 C#에서 unsafe와 fixed 키워드를 사용하여 메모리를 관리할 수 있으며 예시를 통해 알아보도록 하겠습니다.


| unsafe 키워드 

- unsafe 키워드는 이름 그대로 안전하지 않은 코드를 작성할 수 있게 해 줍니다. unsafe 키워드를 사용하면 C#에서 포인터와 같은 메모리 관리 작업을 수행할 수 있습니다. 주로 성능을 최적화하거나 메모리에 접근하는 작업에 사용되며 간단한 예시를 통해 unsafe에 대해 알아보겠습니다.

 

예시)

unsafe
{
    int x = 10;
    int* ptr = &x; // 포인터 선언

    *ptr = 20; // 포인터를 통한 값 변경
}

- 예시를 보면 C++에서 사용하던 포인터 사용 방법과 동일하지만 포인터 연산은 unsafe 블록 내에서만 수행할 수 있는 것이 다르며 사용할 때는 주의가 필요합니다. 잘못된 포인터 연산은 메모리 오류와 보안 문제를 발생시킬 수 있어 이 키워드를 사용할 때는 더 주의해야 합니다. 


| fixed 키워드 

- fixed 키워드는 배열과 함께 보통 사용됩니다. C#에서 가비지 컬렉션은 배열 메모리를 관리하기 때문에 배열이 메모리에서 이동하는 것을 방지하기 위해 fixed 키워드를 사용할 수 있습니다. 특정 상황에서 배열의 메모리 주소가 변경되는 것을 원치 않을 때, 배열의 메모리 위치를 고정시키기 위해 fixed 키워드를 사용하며 간단한 예시를 통해 알아보겠습니다.

 

예시)

unsafe
{
    int[] numbers = { 1, 2, 3, 4, 5 };
    fixed (int* ptr = numbers)
    {
        // ptr을 사용하여 배열에 직접 액세스
        ptr[0] = 10;
    }
    
    // fixed 블록을 빠져나온 후에도 numbers 배열의 값이 변경되어 있습니다.
    Console.WriteLine(numbers[0]); // 출력 결과: 10
}

- fixed 키워드를 이용해 numbers 배열을 고정시키면 배열의 주소가 고정되고 가비지 컬렉터에 의해 메모리 이동이 발생하지 않습니다. 그 결과로 배열의 첫 번째 요소에 접근하여 값을 변경한 후에도 numbers 배열의 값이 변경되어 있음을 확인할 수 있습니다. 

- fixed는 unsafe 블록 안에서만 사용할 수 있으며 메모리 특정 부분에 접근할 때 유용합니다. unsafe와 같은 포인터 연산을 수행하기 때문에 잘못된 작업은 메모리 오류를 유발할 수 있으므로 신중하게 사용해야 합니다.


| 마치며

- C#에서 Image를 다루는 작업을 하며 unsafe와 fixed 키워드를 보고 정리할 필요를 느꼈습니다. 

unsafe와 fixed는 메모리 작업을 가능하게 하며 최적화 같은 작업에서 더욱 유용하게 사용할 수 있습니다. 그러나 사용할 때 주의 해야 할 점이 있는 것을 알게 되었습니다.

 

다음 포스팅으로 찾아오겠습니다.

 

감사합니다 :) 

 

 

728x90
반응형