프로그래밍/C#

[C#] Elvis Operator (?, ??) 연산자

갓똥 2020. 2. 6. 18:04
728x90
반응형

1. 널 조건부 연산자 (null conditional operator)

using System;

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() {
        Car c = CreateCar(100);
        c.Go();
    }
}

 

Car라는 클래스를 만들고 테스트를 위해 color와 Go라는 메소드를 만들었다.
그리고 밑에 CreateCar라는 메소드를 만들었다.
여기선 Car라는 객체를 만들어주는데 speed가 200보다 크다면 생성을 못 하게 했다.
그래서 Main이 문제 없이 실행되는데 만약 speed가 200보다 크면 예외가 발생한다.
그럼 안전하게 사용하려면 어떻게 해야 할까?
일단 생각나는건 if조건문을 추가하여 null이 아닐경우만 호출 할 수 있다.
그렇다면 코딩하다보면 위와 같은 예외처리를 할 일이 많을텐데 C#에선 간단한 문법을 제시했다.
using System;

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() {
        Car c = CreateCar(300);
        c.Go();
        
        // if(c != null)
        //     c.Go();
        
        c?.Go();
        
        // int n = c.color; - error
        
        // int n = c?.color; - error
        
        int? n = c?.color;
        
        // --- 배열
        int[] arr = null;
        // int n2 = arr[0]; - error
        int? n2 = arr?[0];
    }
}

 ① ?.  ?[

    => 널 조건부 연산자(null conditional operator)

    => elvis operator

    => 좌변이 null 인 경우 좌변은 수행하지 않고 null 반환

 


2. 널 접합 연산자 (null coalescing operator)

using System;

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() {
        Car c = CreateCar(300) ?? new Car();
        
        int? n1 = null;
        
        int n2 = n1 ?? 0;
        
        Console.WriteLine(n2);
    }
}

 ① ??

    => 널 접합 연산자(null coalescing operator)

    => 좌변이 null 인 경우 우변 값 반환

728x90
반응형