Assert 사용 시 주의해야 할 점

세줄요약

  1. Assert는 디버그 빌드에서만 작동하며, 문제를 빠르게 찾는 강력한 도구지만, 잘못 사용하면 릴리스 모드에서 예상치 못한 버그가 발생할 수 있다.
  2. 주니어 개발자들이 흔히 저지르는 실수는 Assert 내부에 함수 호출을 포함하는 것이며, 이는 릴리스 모드에서 해당 함수가 실행되지 않는 문제를 유발한다.
  3. Assert 내부에는 순수한 Boolean 표현식만 사용하고, 함수 호출이 필요하다면 디버그 전용 함수로 명확히 구분하는 것이 바람직하다.

소개

개발을 하면서 저는 항상 "Assert를 많이 써라"라고 강조해 왔습니다. 예외 처리, 오류 코드, TDD, 테스트 등 다양한 방법들이 있지만, 개발 도중 문제를 빨리 찾아내는 가장 효율적인 방법 중 하나가 바로 Assert입니다. Assert만 잘 사용해도 TDD의 기본적인 기능을 어느 정도 구현할 수 있죠. 하지만, 주니어 개발자들이 흔히 저지르는 실수가 하나 있습니다. 바로 Assert 내부에 함수 호출을 포함하는 것입니다. 이 실수로 인해 릴리스 모드에서 문제가 발생할 수 있으므로, 이에 대해 짚고 넘어가고자 합니다.

Assert의 기본 개념

Assert는 기본적으로 다음과 같은 특징을 가집니다:

  1. Boolean 표현식을 검사한다: Assert 뒤에는 Boolean 값을 반환하는 조건식이 오며, 이 값이 거짓이면 코드 실행이 중단됩니다.
  2. 디버그 빌드에서만 작동한다: 릴리스 빌드에서는 Assert 자체가 실행되지 않기 때문에 성능에 영향을 주지 않습니다.
  3. 개발 중에 버그를 빠르게 찾는 역할을 한다: 배포 전에 논리적인 오류를 쉽게 발견할 수 있습니다.

이러한 장점이 있지만, 잘못 사용하면 큰 문제를 초래할 수도 있습니다.

주니어 개발자들이 흔히 저지르는 실수

많은 주니어 개발자들이 다음과 같은 실수를 합니다. Assert 내부에 직접 함수 호출을 넣는 경우죠.

assert(SomeFunction());

위 코드는 디버그 모드에서는 정상적으로 동작하지만, 릴리스 모드에서는 SomeFunction()이 호출되지 않아 예상한 동작이 이루어지지 않을 수 있습니다.

올바른 Assert 사용법

Assert를 사용할 때 이러한 실수를 방지하기 위해 몇 가지 원칙을 정하면 좋습니다:

1. Assert 내부에는 순수한 Boolean 표현식만 넣는다

즉, 변수나 단순한 조건식을 사용하는 것이 좋습니다.

bool bValid = SomeFunction();
assert(bValid);

2. Assert 안에 함수 호출이 꼭 필요하다면, 해당 함수는 디버그 빌드에서만 호출된다는 것이 확실해야 한다

이런 경우, 함수명을 명확하게 정하는 것이 중요합니다.

bool DBG_EnsureValidState();
assert(DBG_EnsureValidState());

DBG_ 접두사를 붙이면 이 함수가 디버그 모드에서만 사용된다는 점을 명확히 알릴 수 있습니다.

3. 릴리스 모드에서 필요한 로직은 Assert가 아닌 별도의 코드로 유지한다

예를 들어, 중요한 초기화 로직이나 상태 검증을 Assert 안에만 넣어두면 릴리스 모드에서는 작동하지 않으므로 별도의 로직으로 유지해야 합니다.

bool bValid = SomeFunction();
assert(bValid);
if (!bValid)
{
    HandleError();
}

결론

Assert는 매우 강력한 도구이지만, 올바르게 사용하지 않으면 디버그 모드와 릴리스 모드에서 다른 동작을 초래할 수 있습니다. 특히, Assert 내부에 함수 호출을 포함하는 실수는 릴리스 모드에서 예상치 못한 버그를 유발할 수 있으므로 반드시 피해야 합니다.

제가 주니어 시절 직접 겪었던 실수이기도 하고, 많은 개발자들이 같은 실수를 경험합니다. 그러니 지금부터라도 올바른 습관을 들여 Assert를 효과적으로 활용하시길 바랍니다.

img

제대로 대우받는 개발자 | 부족한 컴공지식 배우기 | MIT급 컴공인강

최저임금으로 고통받는 일회성 프로그래머는 그만! POCU 아카데미가 올해 연봉협상을 책임지겠습니다!