상수(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[] { 10, 20, 30 };
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라는 키워드를 사용 했을뿐 컴파일러는 변수를 각각의 형식으로 변환해서 인식합니다.
댓글 없음:
댓글 쓰기