저자: 한동훈(
traxacun@unitel.co.kr)
늘 그렇듯이, 이번에도 별로 유익하지 않고, 쓸데없는 글로 시작할 것이다(사실은 내용이 없다 -_-).
최근 몇 주간 아는 것 없이 레퍼런스를 뒤적이며 PHP로 뭔가를 개발해야 했다. MySQL과 PHP를 갑자기 쓰다니… -_-
한창 웹 바람이 불던 96년도에 HTML의 매력에 흠뻑 빠져있다가, CGI라는 것이 알려지고 Perl로, C 언어로 전전하면서 웹 프로그래밍을 시작했다. 그리고 C 언어로 100줄짜리 작업을 단 10줄로 하게 된 Perl에 푹 빠져있던 시기이기도 했다. Perl 덕분에 98년도에 한빛과 인연을 맺기도 했지만, 그 이후로는 웹과는 멀어져서 유닉스 환경에서 프로그래밍을 하게 되었다. 그리고 2000년도와 2001년도에 잠시 사내 홍보 사이트와 인트라넷 구축이라는 것을 빌미로 ASP를 사용하게 된다. 그러니까 전산실에서 낮에는 유닉스 프로그래밍하다가 밤에는 취미로 비주얼 베이직이니 ASP니 하는 것을 공부했던 때가 있었다는 말이다.
비주얼 베이직이나 ASP를 아는 분들은 알겠지만 if 문에서 변수의 값이 같은지를 비교할 때에도, 변수에 값을 할당할 때도 항상 "=" 한 가지만 쓴다. C 언어를 비롯한 다른 대부분의 언어들은 값의 할당에는 "="를 쓰고, 값이 같은지 비교하는 데에는 "=="를 쓴다. 95년도에 재수학원에서 "밑줄 쫙" 강사님이 유행했듯이, C 언어를 가리키는 곳에서도 이 차이점에 대해서 "밑줄 쫙~ 동그라미 땡~"했던 기억이 있다(-_-. 필자… 학원에서 뻥 좀 쳤다. 그때 저한테 배운 분들께 죄송… ㅠ.ㅠ).
그러니까 하루종일 비주얼 베이직이나 ASP를 쓰고 있을 때는 괜찮은데, 자꾸 다른 언어들을 섞어쓰다보면 C 언어의 if 문에 "=="라고 써야 하는데 "="라고 쓰는 실수를 하게 된다(솔직히 고백하면 처음 C 언어만 배울 때도 이런 실수를 많이 했다).
if ( empno = 100 ) // 절대 실행 안됨
{
// some code
}
|
그리고 왜 코드가 제대로 실행되지 않는가라며 헤매다 보면 이 부분이 틀렸다는 것을 어렵게 발견한 기억들도 있고, 나중에는 grep과 정규 표현식을 이용해서 if 문에 "="를 사용한 경우만을 전문적으로 찾아내는 스크립트까지 작성하기에 이르렀다(grep, awk, sed 애호가다. 특히, 셸과 awk 혼합 프로그래밍을 좋아한다).
대부분의 경우에 이러한 종류의 버그는 발견하기가 어렵다. 필자는 그 차선책으로 정규 표현식을 사용하여 이러한 실수를 찾아내곤 했다. 하지만 이걸 윈도우에서 하기에는 조금 번거롭다. (윈도우 바이너리 버전의 grep을 설치해야 하고, 배치파일 명령어는 적합하지 않기 때문에 윈도우 스크립팅 호스트를 이용하는 VBScript나 JavaScript를 사용하여 작성할 수 있고, 파일 조작은 파일 스크립팅 개체를 사용해야 한다.)
이것 외에는 언어에서 동등비교 연산에 대해서 is 키워드를 사용할 수 있는 경우에는 is를 사용해서 이러한 혼동을 최대한 피한다.
하지만 최근 몇 주간 사용했던 PHP에서는 is 키워드를 지원하지도 않고, 원격 작업을 해야 하기 때문에 속도도 느리고, 상당히 번거로웠다(확실히 전산실내에 모든 서버가 있어서, 편하게 터미널을 띄우고 작업하는 것이 더 편한 것은 당연하지만).
덕분에 PHP 프로그래밍을 하는 동안에 열심히 오타에 의한 오류도 만들어냈고, if 문에서 "="를 쓰는 멋진 버그들도 많이 만들어냈다. 왜 if에서 "="를 쓰면 오류가 안 생기는 거야! 라고 투덜대면서 말이다. 그에 비하면 C#과 같은 언어에서는 이런 실수를 할 수 없다. C#에서는 if문에서 결과값이 무조건 불리언(boolean)이어야하기 때문에 코드를 컴파일 할 때 int를 boolean 타입으로 변환할 수 없다는 오류 메시지를 뱉어버린다(혼자 생각에, 컴파일러란 것은 프로그래머에게 오류 메시지나 찍찍 뱉어내는 무엄한 존재다. -_-).
몇몇 언어들은 이러한 문제를 피하기 위해서 그런 것인지 아닌지는 몰라도, 할당 연산에 대해서 "="대신에 "<="이나 ":="를 사용한다. 어쨌거나 늘 이런 종류의 오류를 수년째 서슴없이 자행하고 있는 자신을 볼 때마다 대견스러워 하고 있다.
그러다가 몇 가지 고대 문헌(?)들을 뒤적이던 중 정말로 이런 문제를 없애버릴 수 있는 획기적인 방법을 발견했다. 그것은 if 문을 다음과 같이 사용하는 것이다.
if ( 100 == empno )
{
// 코드들
}
|
바뀐 부분이라고는 if에서 "empno == 100"이라고 쓰던 부분의 좌우를 바꾼 것 뿐이다. 조금 혼란스러워 보일 수도 있지만, 이렇게 사용하면 if 문에서 생길 수 있는 모든 문제를 없앨 수 있다. 만약에 할당 연산자 "="를 사용하게 되면 놀랍게도 오류가 발생한다.
if ( 100 = empno ) // 오류 발생함
|
일반적인 경우에는 empno에 100이 할당되어서 오류가 발생하지 않지만 위와 같이 잘못 쓴 경우에는 100이라는 상수에 변수를 할당하는 것이 되기 때문에 할당 에러가 발생하게 되고, 프로그래머는 어느 부분이 잘못되었는지 즉각 알 수 있게 된다.
물론, is 연산자를 지원하는 언어에서는 여전히 is 연산자를 즐겨 쓸 것이고, is 시리즈 함수들(IsAlpha, IsNumeric, is_array, is_object와 같은 함수들)도 즐겨 쓰지만 이러한 것들이 없어서 동등 비교를 써야 한다면 위와 같이 좌우변을 바꿔 쓰는 방법을 사용할 것이다. 말할 필요도 없이 이후의 PHP 프로그래밍에서 저러한 오류들을 빠르게 잡아낼 수 있었으며, grep을 써서 번거롭게 스크립트를 실행하는 일도 더 이상 할 필요가 없어졌다(최종 점검으로 한 번 정도 사용하지만).
고대 문헌에서 이 방법을 알고 나서, 너무 기쁜 나머지 주위 사람들에게 널리 퍼트리고 다녔더니, "형, 제가 쓰는 언어에서는 <=를 쓴단 말에요.", "trax씨, 제가 쓰는 언어는 :=를 쓰고, if에는 =를 써요"라고 구박하더라. -_-
다시 말하지만 저런 버그는 코드가 길어지고, 복잡할수록 꼭꼭 숨어있는 경향이 있어서 찾기가 어려워지니까 위에 소개한 방법처럼 좌우를 바꿔써서 그런 소지를 아예 없애는 방향으로 코딩하는 것이 더 낫다고 생각한다. 처음에는 다소 혼란스러울 수 있지만…
끝까지 읽어주신 분들께 감사. 그럼 ~( -,-)~