이번 포스팅은 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는 메모리 작업을 가능하게 하며 최적화 같은 작업에서 더욱 유용하게 사용할 수 있습니다. 그러나 사용할 때 주의 해야 할 점이 있는 것을 알게 되었습니다.
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'C#' 카테고리의 다른 글
[C#] Bitmap.Clone() vs new Bitmap() 비교 (0) | 2023.09.26 |
---|---|
[C#] Bitmap.LockBits 메서드 (0) | 2023.09.25 |
[C#] record(레코드) 정의와 사용 (0) | 2023.09.24 |
[C#] delegate(대리자) 마스터하기 (1) (0) | 2023.07.17 |
[C#] BackgroundWorker 클래스 정리 (0) | 2023.04.24 |