C# 4. 삼항 연산자와 Null 병합 연산자 (??, ?)
Jan. 24, 2022, 11:07 p.m.
C#에는 기존 프로그래밍 언어들과 비슷한 연산자들을 가지고 있습니다. 왠만한 연산자는 다 비슷하기 때문에 다들 잘 알고 있으리라 생각됩니다.
그 중에서 조금 특이한 연산자들이 있는데요, 바로 삼항 연산자와 Null 병합 연산자 입니다.
1. 삼항 연산자 - ?
삼항 연산자는 그나마 많이 본 적이 있을 것입니다. ? 와 :를 사용해서 조건의 참 거짓에 따라 다른 값을 내놓는 연산자입니다. 간단한 if 문을 한줄로 줄이는 효과를 볼 수 있습니다.
result = (조건) ? (조건이 참일 시 리턴값) : (조건이 거짓일 시 리턴값)
예를 한가지 들어볼게요.
int a = 100;
int b = 40;
int c = (a > b) ? (a + b) : (a - b);
int d = (a < b) ? (a * b) : (a - b);
// c = 140
// d = 60
a와 b를 비교해서 c와 d 에 각각 다른 값을 대입하게 됩니다. 조건에 따라서 다른 값을 대입해야할 때 if 문 대신에 삼항 연산자를 써보는 것이 어떨까요? 물론 삼항 연산자를 쓰면 직관성이 떨어지기 때문에 간단한 연산에서만 사용하시는 것이 좋습니다.
2.Null 병합 연산자 - ??
두번째로 Null 병합 연산자를 알아보겠습니다.
A = A ?? B
Null 병합 연산자는 삼항 연산자와 비슷하게 해당 객체 A가 Null이 아니면 그대로 그 객체 A를 반환하고, 해당 객체가 Null이면 다른 객체 B를 반환하는 연산자입니다.
즉 객체가 Null인지 테스트하는 연산자라고 볼 수 있겠습니다.
예를 들어 해당 변수에 담긴 객체, 클래스의 메소드를 사용하고 싶거나 변수에 접근하고 싶은데 해당 변수는 동적으로 바뀌어서 객체의 존재유무(Null 인지 아닌지)를 잘 모를 수 있습니다.
이때 그냥 해당 객체에 접근하려고 하면 Null일 경우 프로그램에 에러가 생기게 됩니다. 이럴때 Null 병합 연산자를 사용해서 Null 유무를 한번 확인해서 에러를 방지 할 수 있겠네요. 예를 한번 볼까요?
Drink d = new Drink("Cola");
IceCream i = new IceCream("Choco");
i = Null;
DrinkTitle = ( d ?? new Drink("Fanta") ).name();
IceCreamTitle = (i ?? new IceCream("Berry")).name();
// DrinkTitle = "Cola"
// IceCreamTitle = "Berry"
예를 보면 d에는 Drink 객체를 넣었고 i 에는 IceCream 객체를 넣었네요. 그치만 i는 Null로 다시 만들어 주었습니다.
Null 병합 연산자를 이용해서 그 객체에 접근해 name() 메소드를 불러와 보았습니다. d 는 Null이 아니기 때문에 해당 객체의 name()메소드를 잘 불러왔지만, i는 Null이었기 때문에 새로 만든 IceCream 객체의 name() 메소드를 불러왔네요.
연산자