이 글은 C에서는 쓰이지 않는 Null과 관련된 내용들을 정리하기 위해 작성하였습니다.
글에서는 아래 3가지 개념을 소개할 것입니다.
1. Nullable
2. 널 조건부 연산자 ( Elvis operator )
3. Null 병합 연산자
기존에 자주 사용하던 C에서는 보지 못한 개념들이지만,
이것들을 잘 이용하면 효율적인 프로그램을 작성할 수 있을것 같다는 생각이 듭니다.
1. Nullable
C#의 자료형에는 값 타입과 참조 타입이 있습니다.
값 타입 : 스택에 데이터를 저장하며, 코드 블록이 끝나면 사라짐
참조 타입 : 힙 메모리에 데이터를 저장하며 스택에서 이 데이터를 가리키는 주소를 저장함. 힙 메모리에 저장된 값은 코드 블록이 끝나도 사라지지 않음
참조 타입은 현재 가리키고 있는 데이터가 없음을 나타내는 'null'이라는 값을 가질 수 있지만,
변수 그 자체가 특정 데이터를 가지고 있는 값 타입에서는 null을 가질 수 없습니다.
여기서 Nullable은 기본적으로 '값 타입'에 사용하는 형식으로,
일반적으로 변수명 그 자체가 특정 데이터를 가리키는 '값 타입' 데이터에
'데이터 없음'을 의미하는 null 변수를 선언할 수 있게하는 형식입니다.
int? i = null
선언은 위와 같이 사용하고자 하는 값 타입에 '?' 기호를 붙인 형태입니다.
nullable형은 이 외에도 'Hasvalue'와 'Value'라는 두 가지 속성을 가지고 있습니다.
a = 1;
WriteLine(a.HasValue); // true
WriteLine(a.Value); // 1
HasValue은 해당 변수가 값을 갖고 있는지 아닌지를 나타내고,
Value는 그 변수에 담겨 있는 값을 의미합니다.
예제
static void Main(string[] args)
{
int? a = null;
while (true)
{
try
{
a = int.Parse(Console.ReadLine());
}
catch {
Console.WriteLine("숫자를 입력해주세요.");
}
if (a.HasValue) break;
else Console.WriteLine("데이터가 입력되지 않았습니다.");
}
}
출력
(엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
a (엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
! (엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
2
계속하려면 아무 키나 누르십시오 . . .
2. 널 조건부 연산자 ( Elivs operator )
이번에 소개할 것은 가수 앨비스의 이름을 따서 'Elvis operator'라고 불리고 있는 널 조건부 연산자입니다.
이 연산자는 객체 멤버 연산시 해당 객체가 null인지 아닌지 판단하고 값을 넘겨주는 역할을 합니다.
i = a?.data; // a가 null이면 null을 반환, 값을 가지고 있다면 data를 변환 j = b?[n]; // b가 null이면 null을 반환, 값을 가지고 있다면 b[n]을 반환
이 널 조건부 연산자는 해당 데이터가 null이 아닌 경우 버그가 발생하지 않도록 해주며,
그 버그를 막기 위한 코드를 정말 간단하고 보기 편하게 작성해주는 기능을 가지고 있습니다.
아래 예제를 널 조건부 연산자를 사용하지 않고 코딩해본다고 생각해보세요!
예제
class nullTest
{
public bool helloNull = true;
}
class Program
{
static void Main(string[] args)
{
nullTest testNull_1 = null;
nullTest testNull_2 = new nullTest();
bool? isNull = null;
Console.WriteLine("Test1");
isNull = testNull_1?.helloNull;
NullTest(isNull);
Console.WriteLine("Test2");
isNull = testNull_2.helloNull;
NullTest(isNull);
}
static void NullTest(bool? target)
{
if (target.HasValue) Console.WriteLine("값이 있습니다.");
else Console.WriteLine("값이 없습니다..\n");
}
}
출력
Test1
값이 없습니다..
Test2
값이 있습니다.
계속하려면 아무 키나 누르십시오 . . .
3. 널 병합 연산자
널 병합 연산자인 '??' 연산자는 null 검사와 데이터 교환을 간결하게 만들어줍니다.
int? i = a ?? 1
위와 같이 사용하며, a가 null일 경우 i에는 1이, 반대의 경우에는 i에 a라는 값이 입력됩니다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] LINQ 데이터 필터링, 표준 쿼리 연산자 (0) | 2020.09.05 |
---|---|
[C#] 람다식 (0) | 2020.09.05 |
[C#] Csharp 델리게이트와 이벤트 (0) | 2020.09.05 |
[C#] LINQ를 이용한 점수순으로 정렬 (0) | 2020.09.05 |
[C#] 배열 (이차원배열, 가변배열, 메서드) (0) | 2020.09.05 |