간단한 연산식 코드에서 있었던 황당한 사고

오래간만이죠? 요즘은 좀 널널하게 살다보니 블로그에 글이 좀 뜸했습니다. 간만에 글을 쓰려니 좀 머쓱하기까지 하는군요. 어제 저녁에 있었던 소소한 코딩 사고 얘기로 오랜만의 블로깅을 다시 시작합니다.

어제 저녁에 작업했던 코드 중에 아래와 같은 간단한 연산식이 있었습니다. 제가 직접 만든 식은 아니고 거래처에서 받은 금융 쪽의 간단한 인터폴레이션 식입니다.

result := prc_1 + (prc_2 – prc_1) * (val_dt – val_dt1) /
(val_dt2-val_dt1);

보다시피 델파이 코드입니다만, 뭐 C++ 등 다른 언어를 사용하는 분이라도 금방 알아볼 간단한 연산식이죠. 여기에 사용된 prc_1, prc_2는 double 타입 변수이고 적절한 값이 들어가 있습니다. 그리고 val_dt1과 val_dt2는 날짜인데, 내부적으론 좀 다릅니다만 여기선 그냥 integer 타입이라고 봐도 됩니다.

여기서 에러가 날 거라고는 상상하지도 못했는데, 실제로 컴파일을 했을 때 다음과 같은 에러 메시지를 만나게 되었습니다.
E2029 ‘)’ expected but identifier ‘–’ found

이 수식을 이리 보고 저리 보고 돌려보고 뒤집어보기도 해도 도무지 감도 못잡겠더군요. 거의 한시간 가까이 이 한줄과 씨름을 했습니다. 아무리 봐도 에러가 발생할 수식이 아닌데 말이죠.

이게 왜 발생한 건지 금방 감이 오시는 분 있으신가요? 물론 겪어보신 분이라면 감이 오실 수 있겠습니다만, 흔히 발생할 사고가 아니어서 겪어보신 분이 많지 않을 것 같습니다.

한시간이나 걸려서 찾아낸 그 황당한 원인은, prc_2 – prc_1 부분에서 가운데의 마이너스(-) 기호였습니다. 사실은 마이너스가 아니었던 거죠. 워드로 작성된 문서에서 복사해온 코드였는데 가운데의 마이너스가 실제 아스키의 마이너스 키가 아니라 마이너스와 비슷하게 생긴 확장 한글 코드에 있는 글자였던 겁니다.

만약 워드에서 복사하기 전에 잘 살펴봤더라면 발견할 수도 있었던 것이, 워드에선 잘 보면 일반적인 마이너스보다 이 글자는 좀 더 길어보이게 되어 있습니다. 그런데, 델파이 IDE로 일단 복사해놓고 나면 보통의 마이너스 글자와 동일한 폭으로 나타나서 전혀 구별이 안됩니다. 델파이 IDE의 기본 폰트인 Courier New 폰트 탓인 듯 한데요.

제가 이게 보통의 마이너스 글자가 아니라는 걸 알아챈 건 한시간이나 끙끙대다 결국 해당 코드를 헥사에디터로 살펴본 후였습니다. 그러지 않았다면 결코 이 에러의 원인을 알아내지 못했을 것 같습니다.

사소하고 황당한 일이긴 하지만, 저처럼 갑자기 당하고 나면 원인이 뭔지 쉽게 파악하기 어려울 것 같아 공유해봅니다. 코딩 일상다반사라고나 할까요. ㅎㅎ

앞으론 종종 글 쓰겠습니다. 오늘은 맛배기~ ^^

2 comments for “간단한 연산식 코드에서 있었던 황당한 사고

  1. 간만에 글이 올라왔네요~!!
    ” 이나 ‘ 에서 복사해서 쓸땐 이런경우가 많앗는데 .. – 라;;
    자주 글써주세요~!!

답글 남기기

이메일 주소는 공개되지 않습니다.