[C#] 접합/조건부 연산자

이정석·2024년 2월 6일

CSharp

목록 보기
9/22

접합/조건부 연산자

1. 조건부 연산자

null이 가능한 참조값에 특정 필드나 메소드에 접근한다면 Exception이 발생하기 때문에 참조타입에 null 체크하는 것이 중요하다.

아래 예제에서 Car 클래스를 생성하는 CreateCar 함수는 null을 반환할 수 있기 때문에 바로 Car.Go()를 하기 보다 Car 객체가 null인지 확인해야한다.

  class Car
  {
      public int color = 10;
      public void Go() { Console.WriteLine("Go"); }
  }

  class Program
  {
      public static Car CreateCar(int speed)
      {
          if (speed > 200) return null;

          return new Car();
      }

      public static void Main(string[] args)
      {
          Car c = CreateCar(100);
          c.Go();

          if (c != null)
              c.Go();
      }
  }

Car 클래스에 Go말고도 여러 함수가 있고 각 함수를 사용할때 null을 확인하는 것은 번거로울 수 있다.

이럴때 사용하는 것이 조건부 연산자인데 ?.?[로 사용하는데 이를 사용한다면 아래와 같이 바꿀 수 있다.

        if (c != null)
            c.Go();

        c?.Go();    // 널 조건부 연산자( ?. / ?[ )
                    // 좌변이 null인 경우 더이상 수행하지 않고 null 반환

c가 null일 경우 Go를 실행하지 않으며 null이 아닐경우 Go를 실행한다.

조건부 연산자를 사용할 때의 반환값은 null이 가능한 값이기 때문에 참조 타입인 경우 상관없지만 값 타입인 경우 아래 예제와 같이 Nullable로 선언해 주어야 에러가 발생하지 않는다.

    int a = c?.color;   // Error!
    int? b = c?.color;   // Ok!

    int[] arr1 = { 1, 2, 3 };
    int n1 = arr1[0];

    int[] arr2 = null;
    int? n2 = arr2?[0];

2. 접합 연산자

조건부 연산자와 다르게 접합 연산자는 좌변이 null일 때, 우변을 실행한다. ??를 이용해 사용할 수 있으며 아래 예제와 같이 활용할 수 있다.

  class Program
  {
      public static Car CreateCar(int speed)
      {
          if (speed > 200) return null;
          return new Car();
      }

      public static void Main(string[] args)
      {
          Car c = CreateCar(300) ?? new Car();
          c.Go();

          int? n1 = 10;
          int n2 = n1 ?? 0;   // 10

          int? n3 = null;
          int n4 = n3 ?? 0;   // 0
      }
  }

조건부 연산자는 참조 타입이 null일 경우 반환값이 null이지만, 접합 연산자는 우변을 실행함으로 null을 반환하지 않도록 할 수 있다는 장점이 있다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글