C# 어설션(Assertion)이란?
어설션(Assert) 문은 프로그램이 실행되는 런타임 시점에 논리 오류를 효과적으로 잡아내는 방법입니다. 개발자가 코드의 특정 지점에서 반드시 참이어야 하는 조건을 명시하면, 조건이 깨졌을 때 즉시 문제를 알려주므로 디버깅 시간을 크게 줄일 수 있습니다.
어설션 문은 두 개의 인수를 사용합니다.
- 참(true)이 되어야 할 불리언(Boolean) 표현식
- 조건이 거짓(false)일 경우 화면에 표시할 메시지
어설션의 활용 가치
어설션은 규모가 크고 복잡한 프로그램에서 특히 유용합니다. 코드가 수정되거나 리팩토링되는 과정에서 흔히 발생하는 오류들을 신속하게 걸러낼 수 있기 때문입니다. 예를 들어, 함수의 사전 조건(precondition)이나 루프 불변성(loop invariant)을 검증하는 용도로 활용하면 버그를 초기 단계에서 발견할 수 있습니다.
어설션 사용 시 주의사항
어설션을 올바르게 사용하기 위해 다음 두 가지 원칙을 반드시 지켜야 합니다.
1. Assert 메서드 내부에서 함수 호출 피하기
Assert 메서드 안에는 가능한 한 함수 호출을 넣지 않는 것이 좋습니다. 이유는 아래에서 설명할 릴리스(Release) 버전의 동작 방식 때문입니다.
2. 제거해도 결과가 달라지지 않는 코드만 포함하기
Assert 내부에 추가한 코드가 제거되었을 때 프로그램의 출력 결과를 변경해서는 안 됩니다. 이것이 바로 Debug.Assert를 구현할 때 핵심이 되는 원칙입니다.
임시 변수를 활용한 올바른 구현 방법
함수 호출이 필요한 경우에는 임시 변수(temp variable)를 사용하는 것이 안전한 방법입니다.
int temp = DecCounter(d);
Debug.Assert(temp != 0);
위 코드에서 카운터 호출은 값을 감소(decrement)시키는 역할을 합니다. 그렇다면 왜 굳이 temp 변수를 사용했을까요?
릴리스(Release) 버전에서는 Assert가 사용될 때 내부의 호출 자체를 제거해 버리기 때문입니다. 만약 Assert 안에 직접 DecCounter(d)를 호출했다면, 릴리스 빌드에서 이 호출이 사라지면서 카운터 값이 감소하지 않는 심각한 버그가 발생할 수 있습니다.
따라서 함수 호출을 먼저 임시 변수에 저장한 뒤, 그 변수를 Assert로 검증하는 방식이 훨씬 안전하고 권장되는 패턴입니다.
정리
- 어설션은 런타임에 논리 오류를 조기에 발견하는 강력한 도구입니다.
- 참이어야 할 조건과 실패 시 표시할 메시지를 인수로 받습니다.
- 코드 수정 과정에서 생기는 오류를 빠르게 걸러내는 데 유용합니다.
- Assert 내부의 직접적인 함수 호출은 피하고, 임시 변수를 활용하세요.
- Assert에 넣은 코드는 제거해도 프로그램 동작에 영향을 주지 않아야 합니다.