윈도우 모바일 프로그램을 만들면서 유심카드의 핸드폰 번호를 가져오는 함수가 필요했다. 어찌 코드를 긁어오기는 했는데 아래와 같이 에러가 난다.
안전하지 않은 컨텍스트가 뭔지 고민하다가 에러 내용을 검색해보니 리턴형 앞에 unsafe 를 넣어주면 해결 되는 일이었다. 문제는 해결했지만 왠지 찝찝한 기분- 그렇다. 나는 unsafe 가 어떤 키워드인지 잘 모른다. C#을 책을 차근차근 보며 제대로 공부한 것이 아니라, 입사 후 바로 이 처음 만지는 언어로 어떻게든 결과물을 내놓으라 하니 인터넷과 회사 동료분들께 의지해서 꾸역꾸역 사용해왔기 때문이다.
몰라서 틀리는 건 어쩔 수 없다. 하지만 같은 걸 또 틀리는 건 있을 수 없다. unsafe가 대체 무엇이기에 문제가 해결 되었던 것인지! 알아보아야 겠다.
간단히 말하면 "원래 C#에서는 포인터를 지원하지 않지만 unsafe를 쓰면 포인터를 허용해주고 그 대신 포인터에 의해 생기는 문제는 책임지지 않는다" 라고 할 수 있겠다. 고로- C#에서 포인터를 쓰려면 unsafe 를 꼭 써주어야 하는 모양이다.
포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.
안전하지 않은 컨텍스트가 뭔지 고민하다가 에러 내용을 검색해보니 리턴형 앞에 unsafe 를 넣어주면 해결 되는 일이었다. 문제는 해결했지만 왠지 찝찝한 기분- 그렇다. 나는 unsafe 가 어떤 키워드인지 잘 모른다. C#을 책을 차근차근 보며 제대로 공부한 것이 아니라, 입사 후 바로 이 처음 만지는 언어로 어떻게든 결과물을 내놓으라 하니 인터넷과 회사 동료분들께 의지해서 꾸역꾸역 사용해왔기 때문이다.
몰라서 틀리는 건 어쩔 수 없다. 하지만 같은 걸 또 틀리는 건 있을 수 없다. unsafe가 대체 무엇이기에 문제가 해결 되었던 것인지! 알아보아야 겠다.
unsafe ?
C#에서는 형식 안전성과 보안을 유지하기 위해 기본적으로 포인터 산술 연산을 지원하지 않습니다. 그러나 unsafe 키워드를 사용하면 포인터를 사용할 수 있는 안전하지 않은 컨텍스트를 정의할 수 있습니다.
CLR(공용 언어 런타임)에서는 안전하지 않은 코드를 비안정형 코드라고 합니다. C#에서 안전하지 않은 코드는 항상 위험한 것만은 아닙니다. 이는 단지 CLR에서 그 안전성을 확인할 수 없는 코드를 의미합니다. 따라서 CLR에서는 안전하지 않은 코드가 완전히 신뢰할 수 있는 어셈블리에 포함된 경우에만 이 코드를 실행합니다. 안전하지 않은 코드를 사용하는 경우 이 코드로 인해 보안상의 위험이나 포인터 오류가 발생하지 않도록 하는 것은 사용자의 책임입니다. (링크 : MSDN )
C#에서는 형식 안전성과 보안을 유지하기 위해 기본적으로 포인터 산술 연산을 지원하지 않습니다. 그러나 unsafe 키워드를 사용하면 포인터를 사용할 수 있는 안전하지 않은 컨텍스트를 정의할 수 있습니다.
CLR(공용 언어 런타임)에서는 안전하지 않은 코드를 비안정형 코드라고 합니다. C#에서 안전하지 않은 코드는 항상 위험한 것만은 아닙니다. 이는 단지 CLR에서 그 안전성을 확인할 수 없는 코드를 의미합니다. 따라서 CLR에서는 안전하지 않은 코드가 완전히 신뢰할 수 있는 어셈블리에 포함된 경우에만 이 코드를 실행합니다. 안전하지 않은 코드를 사용하는 경우 이 코드로 인해 보안상의 위험이나 포인터 오류가 발생하지 않도록 하는 것은 사용자의 책임입니다. (링크 : MSDN )
간단히 말하면 "원래 C#에서는 포인터를 지원하지 않지만 unsafe를 쓰면 포인터를 허용해주고 그 대신 포인터에 의해 생기는 문제는 책임지지 않는다" 라고 할 수 있겠다. 고로- C#에서 포인터를 쓰려면 unsafe 를 꼭 써주어야 하는 모양이다.
'브랜드메이킹 > 2009 신입 개발자 일기' 카테고리의 다른 글
| 1년 2개월, 이제는 그만 애쓰자. 충분했다. (0) | 2010/05/03 |
|---|---|
| C#에서 포인터를 사용할 때는 unsafe 를 넣자 (0) | 2010/03/31 |
| 같은 솔루션 안에 있더라도 "참조 추가" 잊지 말자 (0) | 2010/03/17 |
| 프로그래머 그 이상이 되고싶다. (1) | 2010/03/12 |