07
27

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 예약어는 포인터를 쓰는 코드를 포함하는 클래스나 그것의 멤버 또는 블록에 사용한다.

 

unsafef를 위해선 프로젝트 속성에서 안전하지 않은 코드 허용 설정을 해야한다.

 

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
COMMENT