프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 2.7 포인터

Victory_HA 2022. 3. 31. 22:30

포인터 (Pointer)

  • C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다.
  • char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.
  • 포인터를 사용하여 허가된 모든 메모리(스택) 영역에 접근할 수 있습니다.

포인터 사용에 대한 오해

- 포인터를 사용하면 성능이 향상된다.(속도가 빨라진다.)
- 프로그래밍을 하려면 포인터는 넘어야 할 산이다.
- 포인터를 숙지해야 진정한 프로그래머다.

포인터 사용에 대한 오해 - 반론

  • 컴파일러가 최적화 기술이 발달하면서 성능 향상에 대한 차이가 사라졌습니다.
  • 포인터를 잘못 사용하여 메모리 영역을 잘못 건드리게 되면 프로그램이나 시스템에 치명적인 손상을 입힐 수 있습니다.

포인터 사용 예제

  • 2개 요소만 저장할 수 있는 배열에 3개 데이터를 저장하는 예제입니다.
  • 3번째 데이터는 배열이 확보되지 않은 메모리에 기록하게 됩니다.
  • 컴파일에 문제는 없는 코드입니다.
  • 다만, 3번째 데이터를 메모리에 기록할 때, 사용중인 메모리에 기록한다면, 다른 프로그램이나 시스템의 치명적인 손상을 입힐 수 있습니다.
class UnsafeTEST
{
    static void Main()
    {
        byte[] arr = new byte[2];
        unsafe
        {
            fixed(byte* a = &arr[0])
            {
                byte* p = a;
                *p++ = 1;
                *p++ = 2;
                *p++ = 3;
            }
        }
    }

fixed 키워드

  • unsafe 컨텍스트에서만 사용이 가능합니다.
  • 클래스가 인스턴스화 되면 CLR에 의해 언제든지 메모리 주소가 바뀔 수 있는데,
  • fixed 키워드 사용시 사용자가 포인터를 사용하고 있을 때 메모리 주소의 고정해주는 역할을 합니다.

정리

  • 컴파일러의 최적화 기술이 발달하며 포인터를 사용할 필요가 없어졌습니다.
  • 포인터는 해석하기가 어렵고, 오히려 메모리 영역에 접근할 수 있기 때문에 시스템에 치명적인 문제를 일으킬 수 있습니다.