더북(TheBook)

1.3.12 사이드 이펙트 피하기!

 

"광기: 몇 번이고 같은 일을 하고 다른 결과를 기대한다."

- 작자 미상*

사이드 이펙트가 있는 애플리케이션은 동일한 입력에 대해 다른 결과가 나올 수 있다. 반대로 수많은 구성 요소들이 방해하는 프로그램의 동작을 예측하는 것은 매우 어렵다. 게다가 잘못된 결과가 나오는 경우를 재현할 수 있는 프로그램이 올바른 결과가 가끔 나오는 프로그램보다 낫다. 왜냐하면 후자의 경우가 일반적으로 고치는 데 힘이 더 들기 때문이다.

C 표준 라이브러리에는 문자열을 복사하는 함수(strcpy)가 있다. 이 함수는 원본 문자열과 대상 문자열의 첫 번째 문자(char)를 가리키는 포인터를 가져와 널 문자(\0)를 찾을 때까지 뒤에 나오는 문자들을 복사한다. strcpy 함수는 단일 반복문으로 구현할 수 있는데 연속 검사의 사이드 이펙트로 인해 비어있는 원본 문자열의 복사 및 증가 연산을 수행할 수도 있다.

while (*tgt++ = *src++);

무서운 코드 아닌가? 뭐, 그다지 무섭지 않을 수 있다. 그러나 이 루프는 문법적으로 이상이 없는 C++ 코드다. 물론 일부 컴파일러에서 지나치게 규칙을 따지라고 말할 경우 경고 메시지를 줄 수도 있다. 이러한 문장은 연산자 우선순위, 하위 표현식의 타입, 그리고 실행 순서에 대해 생각하는 데 시간을 보낼 수 있어 정신훈련을 할 수 있는 좋은 계기가 된다.

 

* 알버트 아인슈타인, 벤자민 프랭클린, 그리고 마크 트웨인에 상호 간 책임 전가. 리타 메이 브라운(Rita Mae Brown)의 서든 데스(Sudden Death)에서 인용한 문구이지만, 원래 출처는 알 수 없다. 아마 인용 자체가 약간의 광기가 따라다니는 듯하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.