1) 연산 범위 확인(checked, unchecked)
데이터가 상한 값을 넘어 하한 값으로 돌아가는 것을 오버플로(overflow)라 하고, 반대의 현상을 언더 플로(underflow)라고 한다. 개발자는 연산식에서 오버플로나 언더 플로가 발생한 경우 오류를 발생시키라고 명시할 수 있는데 check 예약어가 그 역할을 한다.
short c = 32767;
int n = 32768;
checked
{
c++; // 예외 발생
}
반대로 특정 영역의 산술 연산에 대해서는 오버플로나 언더플로가 발생해도 오류를 내지 말라고 개발자가 unchecked 예약어를 지정할 수 있다.
short c = 32767;
unchecked
{
c++; // 컴파일러에 /checked 옵션을 적용해 컴파일된 경우에도 오류가 발생하지 않는다.
}
2) 가변 매개변수: params
메서드를 정의할 때 몇 개의 인자를 받아야 할지 정할 수 없을 때 params 예약어를 사용해 가변 인자를 지정할 수 있다.
ex)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Program
{
static int Add(params int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++)
{
result = result + values[i];
}
return result;
}
static void Main(string[] args)
{
Console.WriteLine(Add(1, 2, 3, 4, 5));
Console.WriteLine(Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
}
입력 타입을 지정할 수 없다면 모든 타입의 부모인 object를 사용할 수 있다.
3) Win32 API 호출: extern
닷넷 호환 언어로 만들어진 관리코드(managed code)에서 C/C++ 같은 언어로 만들어진 비관리 코드(unmanaged code)의 기능을 사용하는 수단이다.
extern 구문 작성을 위한 세가지 정보
- 비관리 코드를 제공하는 DLL 이름
- 비관리 코드의 함수 이름
- 비고나리 코드의 함수 형식(signature)
ex)
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
static extern int MessageBeep(uint uType);
static void Main(string[] args)
{
MessageBeep(0);
}
}
4) 안전하지 않은 컨텍스트: unsafe
안전하지 않은 컨텍스트(문맥)란 안전하지 않은 코드를 포함한 영역을 의미하며, 안전하지 않은 코드란 포인터(pointer)를 사용하는 것을 의미한다. C#은 C/C++ 언어의 포인터를 지원하며 unsafe 예약어는 포인터를 쓰는 코드를 포함하는 클래스나 그것의 멤버 또는 블록에 사용한다.
ex)
using System;
class Program
{
static void Main(string[] args)
{
int iNum = 100;
unsafe
{
Console.WriteLine("{0:x}", (int)&iNum);
}
}
}
'스마트팩토리 > C#' 카테고리의 다른 글
28. 제네릭 (0) | 2020.08.18 |
---|---|
27. 네트워크 통신 (0) | 2020.07.29 |
25. MessageMap (0) | 2020.07.24 |
24. 복습 (0) | 2020.07.24 |
23. Indexer (0) | 2020.07.23 |