전체 페이지뷰

2016년 12월 12일 월요일

C# 상수, 열거형, Nullable, var

언제든지 다른 값을 대입할 수 있는 변수와 달리 상수와 열거형은 데이터를 바꿀수 없습니다.



상수(Constants)

const 자료형 상수명 = 값;

의 문법을 따릅니다.

const int a = 3;
const double pi = 3.14;
cs


열거형(Enumerator)

같은 범주에 속하는 여러 상수를 묶어서 선언할 때 쓰입니다.
형식은 enum 열거 형식명 : 기반 자료형 { 상수1, 상수2, 상수3...} 입니다.
여기서 기반 자료형은 생략될 수 있습니다.

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};  
cs
Sat은 0, Sun은 1..이렇게 정수값이 정해집니다.

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};  
cs
첫 값을 지정할수도 있으며, 이 경우 1,2,3...으로 이어집니다.

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; 
cs
위와 같이 기반 자료형을 명시할 수도 있는데, 정수 계열만 가능합니다.

using System;
namespace ConsoleApplication1
{
    class Program
    {
        enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
        static void Main(string[] args)
        {
            int x = (int)Days.Sun;
            int y = (int)Days.Fri;
            Console.WriteLine("Sun = {0}", x);
            Console.WriteLine("Fri = {0}", y);
        }
    }
}
cs
위와 같이 반복되는 단순한 상수들을 설정할 때 유용합니다.

Nullable 형식

int 형식의 변수를 선언하면 4바이트의 메모리가 할당되고, 컴파일러는 반드시 이 메모리 내에 초기값을 넣도록 강제합니다. 그러나 종종 아무것도 넣어지지 않은 형태의 변수가 필요할 때가 있는데 이 경우 Nullable 형식을 사용합니다.

형식? 변수이름;

의 문법을 사용하며, struct를 포함한 값형식에서 선언될 수 있습니다.
(참조형 변수는 기본값이 null이므로 따로 이런 형식이 필요치 않습니다.)
int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];
cs

위와 같이 ?를 사용하면 null을 대입할 수 있습니다.

Nullable로 선언된 인스턴스에는 읽기 전용의 두 가지 속성이 있습니다.
HasValue와 Value가 그것인데, HasValue는 값을 가지고 있는지(null이면 false)를 판정해주고, Value는 null이 아닐때 값을 지칭합니다(따라서 null일때 Value를 사용하면 예외가 발생합니다).

예를 하나 살펴보고 다음으로 넘어 가겠습니다.
using System;
class Program
{
    static void Main(string[] args)
    {
        int? a = null;
        if (a.HasValue)
        {
            Console.WriteLine(a.Value);
        }
        else
        {
            Console.WriteLine("undefined");
        }
    }
}
cs


var

C#은 strong type의 언어라서 언제나 정확한 데이터형이 지정되어야 한다고 했습니다. 
그래서 프로그래머의 오류를 줄여주는 대신 좀더 프로그래머의 수고가 든다고 말했습니다.
그러나 C# 3.0에서부터 추가된 "var"는 weak type의 편리함을 제공합니다.
var를 사용하면 컴파일러가 형식을 유추해 주는데, 다만 선언과 동시에 초기화 해줘야 하며, 지역변수로만 사용가능합니다(클래스의 필드로 사용이 불가합니다).

using System;
class Program
{
    static void Main(string[] args)
    {
        var a = 20;
        Console.WriteLine("Type: {0}, Value: {1}", a.GetType(), a);
        var b = 3.141234;
        Console.WriteLine("Type: {0}, Value: {1}", b.GetType(), b);
        var c = "Hello World!";
        Console.WriteLine("Type: {0}, Value: {1}", c.GetType(), c);
        var d = new int[] { 102030 };
        Console.Write("Type: {0}, Value: ", d.GetType());
        foreach (var e in d)
            Console.Write("{0} ", e);
    }
}
cs

결과)
Type: System.Int32, Value: 20
Type: System.Double, Value: 3.141234
Type: System.String, Value: Hello World!
Type: System.Int32[], Value: 10 20 30

각각 타입을 GetType() 메소드로 확인 가능합니다. var라는 키워드를 사용 했을뿐 컴파일러는 변수를 각각의 형식으로 변환해서 인식합니다.

댓글 없음:

댓글 쓰기