주제 |
[C#] 중급 문법 - 데이터 타입 (Data Type), 데이터 클래스와 null 핸들링, 그리고 enum
개요 |
- Data Type 키워드와 .Net 데이터 클래스 및 Convert 메서드
- null 과 Nullable Type
- 열거형 상수 enum
본문 |
1. Data Type 키워드와 .Net 데이터 클래스 및 Convert 메서드
데이터 타입의 각 키워드는 .Net 의 데이터 클래스와 매칭된다.
Convert 를 사용하여 데이터 형변환을 하려다보면 자동완성에 나타나는 수많은 메서드들이 보일 것이다.
앞선 포스팅에서는 자주 사용하는 데이터 타입 및 변수 선언의 예를 게시했다.
이번 글에서는 데이터 타입에 관한 C# 키워드 및 해당 키워드에 대해 .Net 의 데이터 클래스들을 게시하겠다.
Convert 를 사용하여 Int 형으로 변환하고 싶을 때, 뒤에 붙은 숫자로 인해 어떤 메서드를 써야 할 지 난감했던 적이 있다면 아래 표를 참고하여 해당 키워드에 대해 어떤 메서드를 사용해야 하는지 익히도록 하자.
C# 키워드 | 값 할당시 접미사 (대소문자 구분X) |
.Net 데이터 클래스 | 형변환 메서드 |
byte | System.Byte | Convert.ToByte(); | |
sbyte | System.SByte | Convert.ToSByte(); | |
short | System.Int16 | Convert.ToInt16(); | |
int | System.Int32 | Convert.ToInt32(); | |
long | L (l) | System.Int64 | Convert.ToInt64(); |
ushort | System.UInt16 | Convert.ToUInt16(); | |
uint | U (u) | System.UInt32 | Convert.ToUInt32(); |
ulong | UL (ul) | System.UInt64 | Convert.ToUInt64(); |
float | F (f) | System.Single | Convert.ToSingle(); |
double | D (d), 생략 가능 | System.Double | Convert.ToDouble(); |
decimal | M (m) | System.Decimal | Convert.ToDecimal(); |
char | System.Char | Convert.ToChar(); | |
string | System.String | Convert.ToString(); | |
bool | System.Boolean | Convert.ToBoolean(); | |
object | System.Object | 모든 자료형의 최상위에 위치하므로 형변환 메서드 제공하지 않음 (모든 데이터 타입의 값 할당 가능) |
2. null 과 Nullable Type
null 이란, 변수가 메모리상에 어떤 데이터(값)가 없다는 것을 명시적으로 표현해 주는 키워드이다.
예를 들어, int 형 변수에 null 값을 할당한다면, 해당 변수는 어느 숫자도 값으로 가지고 있지 않는다. 하지만 null 이라는 키워드를 값으로 갖는다.
null 을 가질 수 있는 타입을 Reference 타입이라고 한다.
null 을 가질 수 없는 타입을 Value 타입이라고 한다. Value 타입의 대표적인 예로는 int 형 변수이다.
Value 타입의 변수가 null 을 포함할 수 있어야 할 경우가 있다. DB 통신을 할 때 DB로부터 받은 데이터를 할당받을 때 등이다. (DB의 데이터가 없을 )
이러한 경우를 위해 null 을 가질 수 있는 Value 타입을 Nullable Type 으로 분류한다.
Value 타입을 Nullable Type 으로 변환시키는 방법은 간단하다.
아래와 같이 물음표(?) 기호를 사용하여 데이터 타입에 명시해 주면 된다.
int? num = null;
num = 10;
bool? orderAccepted = null;
orderAccepted = true;
Nullable Type 을 일반 Value Type 으로 형변환 하는 방법은 아래와 같다.
Nullable<int> num = null;
num = 10;
int newNum = num.Value; // .Value를 사용하여 값을 가져온다.
데이터를 DB로부터 가져와 변수에 할당하였으나, DB의 데이터가 NULL 이었다고 가정을 해보자.
이러한 경우, Nullable Type 으로 형변환이 되어 값이 할당된다.
Nuallable<T>는 실제 값이 있는지 체크하는 HasValue 속성과 실제 값을 나타내는 Value 속성을 가지고 있다.
다음은 DB로부터 받아온 데이터가 NULL 이었다고 가정한 Value 타입의 변수에서 HasValue 로 null 이 값으로 들어있는지 먼저 체크한 후 .Value 를 사용하여 해당 데이터의 실제 값을 출력하는 예시 코드이다.
Nullable<int> num = null;
num = 10;
if (!num.HasValue) // value 를 가지고 있지 않다면
{
num = 2;
Console.WriteLine(num);
} else if (num.HasValue) // value 를 가지고 있다면
{
int num2 = num.Value;
Console.WriteLine(num2);
출력 결과 :
10
만일 10번째 라인에서 num = 10 으로 변수에 값을 할당하는 구문을 작성하지 않았다면 결과는 2 가 출력되었을 것이다.
?? 연산자
Nullable Type 과 관련되는 키워드에는 ?? 연산자가 있다.
?? 앞/뒤로,
값이 null 이면 ?? 앞의 코드를 선택, 값이 null 이 아니면 ?? 뒤으 코드를 선택한다.
예시:
Nullable<int> num = null;
int? comparedNum = null;
comparedNum = num ?? 20;
Console.WriteLine(comparedNum);
출력 결과 :
20
만일 num = 10;
으로 할당하였다면 ?? 연산자에 의해서 10이 출력되었을 것이다.
Nullable<int> num = null;
num = 10;
int? comparedNum = null;
comparedNum = num ?? 20;
Console.WriteLine(comparedNum);
출력 결과 :
10
3. 열거형 상수 enum
enum 키워드는 namespace 와 class 내에서만 선언이 가능하며, 메서드 내에서는 선언이 불가능하다.
enum 키워드로 선언된 변수는 코드블럭{} 안에서 선언된 것들을 상수로 취급하며, 이 상수는 0부터 차례대로 정수 형태의 숫자 값을 갖는다.
'[Flags]' 키워드
[Flags] 키워드는 enum 의 값이 다중 값을 가질 수 있게 해준다.
{
[Flags]
enum Fruit
{
apple,
banana,
orange
}
static void Main(string[] args)
{
// fuilt 의 값은 apple 혹은 banana
Fruit fruit = Fruit.apple | Fruit.banana;
// enum 내의 상수를 정수형태로 치환하여 int 변수에 할당
int number = (int)fruit;
Console.WriteLine(number);
if (fruit.HasFlag(Fruit.orange))
{
Console.WriteLine("orange");
} else if (fruit.HasFlag(Fruit.apple))
{
Console.WriteLine("apple");
if (fruit.HasFlag(Fruit.banana))
{
Console.WriteLine("banana");
}
}
}
}
출력 결과 :
1
apple
banana
또한, & 를 통하여 해당 값을 가지고 있는지 확인도 가능하다.
{
[Flags]
enum Fruit
{
apple,
banana,
orange
}
static void Main(string[] args)
{
// fuilt 의 값은 apple 혹은 banana
Fruit fruit = Fruit.apple | Fruit.banana;
// enum 내의 상수를 정수형태로 치환하여 int 변수에 할당
int number = (int)fruit;
Console.WriteLine(number);
if (fruit.HasFlag(Fruit.orange))
{
Console.WriteLine("orange");
} else if ((fruit & Fruit.apple) == 0) // HasFlag대신 & 연산자 사용
{
Console.WriteLine("apple");
if (fruit.HasFlag(Fruit.banana))
{
Console.WriteLine("banana");
}
}
}
}
출력 결과 :
1
apple
banana
'Language > C#' 카테고리의 다른 글
[C#] 예외 처리 (0) | 2023.09.03 |
---|---|
[C#] yield 키워드 (0) | 2023.09.03 |
[C#] 기초 문법 - 반복문 (while, for, foreach) & 무한루프 (0) | 2023.09.01 |
[C#] 기초 문법 - 조건문 (if, switch, 삼항 연산자) (0) | 2023.08.31 |
[C#] Console의 값 읽기 - ReadLine() & Read() (0) | 2023.08.31 |