Language/C#

[C#] 중급 문법 - 데이터 타입 (Data Type), 데이터 클래스와 null 핸들링, 그리고 enum

달별선장 2023. 9. 1. 17:10
728x90

주제 |

[C#] 중급 문법 - 데이터 타입 (Data Type), 데이터 클래스와 null 핸들링, 그리고 enum

개요 |

  1. Data Type 키워드와 .Net 데이터 클래스 및 Convert 메서드
  2. null 과 Nullable Type
  3. 열거형 상수 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

 

728x90