반응형
코딩을 하다보면 인자로 넘긴 primitive 타입의 변수를 2가지 용도로 사용하는 경우가 있다.
예를 들면 int 형 변수를 갯수로 사용하기 위해 넘기되 그 값을 정상적인 상황에서 들어가지 않을 값으로 넣어서 예외처리를 하는 경우다.
1
2
3
4
5
6
7
8
9
10
|
public void TestFunc(int count)
{
if (count == -1) // or count == int.MaxValue
{
Reset();
return;
}
m_cnt = count;
}
|
c# |
또는 bool 형의 추가 인자를 넣어서 기능을 분리할 수도 있지만 어쨌든 이쁘지 않다.
이런 경우 Null 조건 연산자를 사용하면 훨씬 깔끔하게 처리할 수 있다.
단지 변수 선언 시 ? 하나만 추가해 주면 값 타입(value type) 인 int, float, bool, double 등의 primitive 자료형에 null 을 넣어줄 수 있게 된다.
1
2
3
4
5
6
7
8
9
10
|
public void TestFunc(int? count)
{
if (count == null)
{
Reset();
return;
}
m_cnt = (int)count;
}
|
c# |
이 예에서는 크게 달라 보이지 않지만 잘 응용하면 훨씬 깔끔하고 직관적인 코드를 짤 수 있다.
추가로 매우 유용한 null 관련 연산자 들이 더 있다.
?. / ?[] 연산자
프로그래밍 하면서 매우 자주 마주치게 되는 null 의 예외처리 하는데 매우 유용한 연산자이다.
- ?. 또는 ?[] 왼쪽의 변수가 null 일 경우 null 을 리턴
- ?. 또는 ?[] 왼쪽의 변수가 null 이 아닐 경우 오른쪽의 속성을 리턴하거나 메서드를 실행
- ?. 와 ?[] 의 차이는 일반 변수의 null 을 체크 할 것인가 아니면 배열 요소에 접근하느냐로 구분
1
2
3
4
5
6
7
|
string strName = null;
int? nameLen = strName?.Length; // strName 은 null 이므로 .Length 에 접근하지 않고 null 을 리턴
List<MyPosition> positions = new List<MyPosition>();
//position 이 null 인지 체크 후 position[0] 이 null 인지 체크.
//position 이나 position[0] 이 null 이면 pos = null 이지만 아니라면 pos = position[0].pos
int? pos = position?[0]?.pos;
|
c# |
?? 연산자
?? 연산자 역시 null 예외처리 연산자 이지만 사용법이 조금 다르다.
- ?? 왼쪽의 변수가 null 일 경우 오른쪽 값을 리턴
- ?? 왼쪽의 변수가 null 이 아닐 경우 왼쪽 변수의 값을 리턴
1
2
3
|
int? count = null;
int cnt = count ?? 100; //count 가 null 이므로 오른쪽 100 이 리턴되어 cnt = 100
//만약 count 가 null 이 아니고 값이 있다면 cnt = count
|
c# |
Nullable 연산자를 활용하면 안전하면서 코드도 훨씬 간결해진다.
적극적으로 사용하자!
반응형
댓글