null 병합 연산자(??) 의 기능

null 병합 및 null 조건부 연산자를 사용하면, 값이 null인 경우 일부 작업을 수행하고 그렇지 않은 경우 다른 작업을 수행한다.

null 병합 연산자 포맷

  • ??: value가 null이면, 실행문을 실행

    • [value] ?? [실행문]
  • ??=: value가 null이면, value에 데이터를 할당

    • [value] ??= [데이터]
  • ?.: value가 null이면, value의 멤버에 엑세스

    • [value] ?. [멤버]

[?? - 예시 코드]

using System;
using static System.Console;

namespace nullCoalescingOperator
{
	class Greeter
	{
		internal string Greet1(string name)
		{
			if (name == null)
			{
				return "Hello, stranger!";
			}
			return $"Hello, {name}";
		}

		internal string Greet2(string name) // ?? 연산자 사용
		{
			return $"Hello, {name ?? "stranger"}!";
		}
	}

	internal class Program
	{
		static void Main(string[] args)
		{
			//var obj = new Greeter();
			//WriteLine(obj.Greet1(null));
			//Write(obj.Greet1("이동규"));

			var obj = new Greeter();
			WriteLine(obj.Greet2(null));
			WriteLine(obj.Greet2("이동규"));
		}
	}
}
Hello, stranger!
Hello, 이동규

[??= - 예시 코드]

using System;
using System.Collections.Generic;
using static System.Console;

namespace nullCoalescingOperator
{
	class Greeter
	{
		internal string Greet1(string name)
		{
			if (name == null)
			{
				return "Hello, stranger!";
			}
			return $"Hello, {name}";
		}

		internal string Greet2(string name)
		{
			return $"Hello, {name ?? "stranger"}!";
		}
	}

	internal class Program
	{
		private static List<int> _numbers;

		private static void AddToNumbers(int number)
		{
			//if(_numbers == null)
			//{
			//	_numbers = new List<int>();
			//}
			//_numbers.Add(number);
			
			(_numbers ??= new List<int>()).Add(number); // ??= 추가
		}

		static void Main(string[] args)
		{
			//var obj = new Greeter();
			//WriteLine(obj.Greet1(null));
			//Write(obj.Greet1("이동규"));

			//var obj = new Greeter();
			//WriteLine(obj.Greet2(null));
			//WriteLine(obj.Greet2("이동규"));

			AddToNumbers(10);
			WriteLine(_numbers.Count);

			AddToNumbers(20);
			WriteLine(_numbers.Count);
		}
	}
}
1
2

[?. - 예시 코드]

using System;
using System.Collections.Generic;
using static System.Console;

namespace nullCoalescingOperator
{
	class Greeter
	{
		internal string Greet1(string name)
		{
			if (name == null)
			{
				return "Hello, stranger!";
			}
			return $"Hello, {name}";
		}

		internal string Greet2(string name)
		{
			return $"Hello, {name ?? "stranger"}!";
		}
	}

	internal class Program
	{
		private static List<int> _numbers;

		private static void AddToNumbers(int number)
		{
			//if(_numbers == null)
			//{
			//	_numbers = new List<int>();
			//}
			//_numbers.Add(number);
			
			(_numbers ??= new List<int>()).Add(number); // ??= 추가
		}

		private static void ClearIfNotNull(List<int> numbers)
		{
			numbers?.Clear(); // ?. 추가
		}

		static void Main(string[] args)
		{
			//var obj = new Greeter();
			//WriteLine(obj.Greet1(null));
			//Write(obj.Greet1("이동규"));

			//var obj = new Greeter();
			//WriteLine(obj.Greet2(null));
			//WriteLine(obj.Greet2("이동규"));

			//AddToNumbers(10);
			//WriteLine(_numbers.Count);

			//AddToNumbers(20);
			//WriteLine(_numbers.Count);

			ClearIfNotNull(_numbers);
			WriteLine(_numbers.Count);
		}
	}
}
1
2
0

[?? 복수 사용 - 예시 코드]

using System;
using static System.Console;

namespace nullCoalescingOperator1
{
	class Person
	{
		public string Name;
		public string LastName;
		int Age;
	}


	internal class Program
	{
		static void Main(string[] args)
		{
			PrintName(new Person { Name = "동규", LastName = "이" });
			PrintName(new Person { LastName = "정" });
			PrintName(new Person());
		}

		static void PrintName(Person person)
		{
			WriteLine(person.Name ?? person.LastName ?? "stranger");
		}

	}
}
동규
정
stranger

태그: ,

카테고리:

업데이트:

댓글남기기