프로그램 문법의 느슨함이란 프로그램 코드를 작성하는 방법 – 이를 문법이라 한다 – 의 자유도를 의미한다. 보편적으로 프로그램 코드는 정해진 규칙에 의거하여 작성해야 하며, 그 규칙을 벗어나면 코드 해석기가 프로그램을 이해하지 못하게 되어 신텍스(syntax) 에러가 발생하게 된다. 다음의 예는 자바스크립트로 작성된 코드로 jin이라는 이름을 가진 함수를 선언하고 있다.
<script> function jin() alert ( 'that's ok' ); } </script>
이 코드에는 두 개의 문법적인 오류가 존재하고 있어 정상적으로 실행되지 않는다. 그 첫번째로 함수를 선언 할 때는 반드시 브레이스({) 안에 명령어를 포함시켜야 하는데, 여는 브레이스가 생략되어 있다. 두번째는 alert 함수의 인수(parameter) 값인 문자열 중에서 홋따옴표가 이스케이프 되지 않았다. 이를 올바른 문법으로 다시 표기하면 아래와 같다.
<script> function jin() { alert ( 'that\'s ok' ) ; } </script>
이렇게 글자 하나 빼 먹었다고 실행조차 안되는 프로그램 문법에 느슨함이 존재하는 것일까?
불과 얼마 전까지만 해도 자바스크립트라는 언어는 프로그램 언어 취급도 받지 못하는 천덕꾸러기였다. 왜냐하면, 자바스크립트라는 프로그램을 만들때 HTML 안에 포함되어 동작하고 디자이너나 아마추어가 쉽게 사용할 수 있는 인터프리터를 `언어 처럼 보이게` 하는 것이 개발 목적이었기 때문이다. 이러한 이유로 자바스크립트는 수 많은 프로그래머들에게 언어로 인정받지 못했으며, 문법적 규칙도 어술하고 클래스도 없는 장난감 언어로 취급되었다. 더군다나 자바스크립트 초창기에는 메이저 브라우저 제조사마다 지원되는 특성이 다르고 새로운 기능의 무분별한 추가로 인해 발생되는 잦은 버그, 비호환성 등으로 인하여 많은 문제가 있었다.
그 덕분에 자바스크립트에 대한 여러가지 오해는 오래동안 유지되었다. 그러나 다행이도 구글과 몇몇 선도 업체에 의해 Ajax란 기술이 탄생하고 자바스크립트는 새로운 기회와 명성을 얻을 수 있었다. 이러한 흑역사를 가진 자바스크립트 못지 않게 언어로서 인정받지 못했던 언어가 바로 PHP다. 즉, PHP 역시 자바스크립트 다음 가라면 서러울 정도로 문법적 느슨함이 매우 많은 언어라는 뜻이다.
PHP의 문법적 느슨함을 가장 잘 표현하는 예로 echo가 있다. 다음의 코드는 실무에서 자주 사용되는 문법의 대표적인 예다.
<?php echo "문자열을 출력한다." ; ?>
이 예제를 보고 뭔가 이상하다고 생각하시는 분은 꽤 오래전에 프로그램 개발을 그만두시고, 치킨 사업에 뛰어드신 선배님일 가능성이 높다. 왜냐하면 echo 문은 문법 키워드(keyword)가 아니라 함수이기 때문이다. PHP 홈페이지에서 제공되는 레퍼런스 문서(http://php.net/manual/en/function.echo.php)를 확인해봐도 echo는 키워드가 아니라 함수다. 즉, 정확한 문법에 의거하여 코드를 작성한다면 아래와 같이 괄호 안에 인수로 문자열을 전달해야 한다.
<?php echo ( "함수에 인수로 문자열을 전달한다" ) ; ?>
하지만, 이와 같은 코딩 규칙에 의거하여 PHP 프로그램을 작성하는 사람은 거의 없다고 봐야 한다. 최근 개발되는 오픈소스를 비롯하여 레퍼런스 예제에서도 echo를 함수처럼 사용하는 것은 찾아보기 힘들기 때문이다. 심지어 echo를 함수로 인식하는 PHP 개발자를 찾기가 더 힘들 것이다.
그렇다면, echo 함수와 비슷한 구조에 인수가 하나만 존재하는 exit 함수도 echo 함수처럼 사용이 가능할까? 결론만 이야기하자면 echo 문을 제외하고 키워드처럼 사용이 가능한 함수는 print, include, include_once, require, require_once 정도 뿐이다. 그 이외의 함수는 괄호를 생략하고 프로그램 코드를 작성하면 syntax 오류가 발생된다. 혹시라도 PHP 함수중에서 인수가 하나뿐인 것들이 가능한지 테스트해보는 실수는 저지르지 않기를 바란다. 이미 이러한 실험을 시도한 사람들이 많이 있으며, 그 결과로 얻을 수 있는 것은 아주 미비하기 때문이다.
그 이외에도 echo 함수를 대신하여 연산 결과 혹은 변수의 값을 출력하는 방법으로 다음과 같은 문법도 매우 자주 애용되고 있다.
<?=$vars?>
이와 같은 문법은 프로그램의 대입 연산자를 이용한 결과 출력 방법으로 프로그램을 처음 배우는 사람들이 가장 많이 헷갈려 하는 것 중에 하나인 `좌측으로 값이 대입`되는 것을 이용한 것이다. 프로그래머는 수 많은 타이핑으로 프로그램을 제작하는 일을 업으로 삼고 있는 만큼, 최소한의 코딩으로 최선의 결과를 내는 것을 좋아한다. 즉, 타이핑을 한번이라도 덜 하고 같은 결과를 낼 수 있다면 최대한 생략을 한다는 뜻이다.
그 결과, 위와 같은 코드는 현재 보편적으로 사용되는 문법이 되었다. 하지만, 아쉽게도 PHP측에서는 숏 태그 오픈(short tag open)을 더 이상 지원하지 않고자 노력하고 있으며, 아래와 같은 방식으로 코딩하기를 권장하고 있다.
<?php echo $vars?>
하지만 이러한 PHP측의 노력에도 불구하고 이미 개발되어 배포된 수 많은 프로그램 모두에 적용된 숏 태그 오픈 방식의 문법을 모두 제거 할 수 없다 보니, php.ini 설정에는 여전히 숏 태그 오픈 설정이 여전히 존재하며 심지어 최근에는 숏 태그 오픈 설정 기본값이 Off에서 On으로 변경되었다. 어디 그뿐인가? 새롭게 프로그램을 배우는 후배들은 선배들의 저작물을 보고 숏 태그 오픈 방식의 문법을 답습하고 있으니, 자연스럽게 그 역사는 이어져 내려오고 있다.
여기에 또 하나의 재미있는 구문이 있다. 프로그램 개발을 하다보면, 무한 루프 로직을 구현해야 할 때가 종종 있다. 보편적으로 무한 루프를 구현 할 때, while 문을 자주 사용하지만, 프로그램 경력이 오래된 개발자나 특이한 것을 좋아하는 개발자는 for 문을 먼저 떠올리는 경우가 있을 것이다. 지금도 오래된 프로그램 소스를 보다보면 for 문을 이용한 무한 루프를 가끔 볼 수 있다.
<?php $count = 1 ; for ( ; 1 ; ) { if ( $count > 10 ) break ; $count ++ ; } ?>
위와 같은 예제는 요즘에는 정말 보기 드문 코딩 기법이고, while 문의 보편적 사용에 의해 거의 사라져 가는 추세다. 이와 같이 시대가 변하면서 사라져가는 코딩 기법 중에는 다음과 같은 예도 존재한다.
<script> alert ( '이 문장과' ) alert ( '이 문장은' ) alert ( '모두 정상 실행된다' ) alert ( '그것도 순서대로' ) </script>
위의 예제는 4개의 메시지를 출력하는 프로그램 코드로, 각 명령 줄마다 명령 종료를 의미하는 세미콜론(;)이 생략되어 있다. 자바스크립트는 태생이 인터프리터인 까닭에 개행만으로도 명령의 종료 역활을 대신 할 수 있다. 그 외에도 아래와 같은 문법도 왕왕 출몰한다.
<script> function jin( a ) { if ( a === undefined ) return alert ( '인수가 비어 있어요.' ) || false ; } </script>
위의 예제는 인수가 비어 있으면 메시지를 출력하고 리턴 값으로 false을 반환하는 함수를 선언하고 있다. 보편적인 문법에 의거하여 코드를 다시 작성하면 아래와 같다.
<script> function jin( a ) { if ( a === undefined ) { alert ( '인수가 비어 있어요.' ) ; return false ; } } </script>
보편적인 문법으로 재 작성하니 기존에는 한 줄의 코드였던 것이 alert 함수와 return 문으로 나누어져 두 줄의 코드로 바뀌었다. 즉, 코드의 양이 늘어난 것이다.
대부분의 프로그래머는 프로그램 코드의 양을 줄이는 것에 대하여 관심이 많다. 일부에서는 프로그램 코드를 많이 줄일수록 프로그램 개발 능력이 좋다고 판단하는 경우도 있는데, 그것은 올바른 생각이 아니라고 본다. 오히려 프로그램 코드의 양을 너무 줄여서 이해하기 어렵게 만든다면, 프로그램 실력이 좋다고 말하기 어렵다. 오히려, 프로그램 코드를 이해하기 쉽게 작성하는 사람의 실력이 높다고 봐야 한다. 그러나, 이해하기 쉬운 한도 내에서는 최대한 코드를 줄이는 것은 매우 합리적이며 가독성을 높이는 방법인 것도 사실이다.
반면에, 최근들어 자바스크립트의 사용이 활발해지면서 나타난 코드 작성 기법에는 매우 유용한 것도 존재한다. 예를 들어 두 개의 변수가 존재하고 각각 값이 있거나 혹은 비어있을 수 있다고 가정해 보자. 이 중에 값이 있는 것을 선택해서 사용해야 한다면 어떻게 프로그램 코드를 작성하는 것이 가장 유효할까?
<script> function jin ( first , second ) { var final ; if ( first === undefined ) final = first ; else final = second ; } </script>
위의 예제는 거의 표준에 가까운 문법으로 변수를 선언하고 if 문에 의해 final 변수에 값을 할당하는 방법이다. 하지만, 손가락이 아픈 개발자에게는 너무 긴 문장이다. 그래서 이와 같은 경우에는 3항식을 자주 사용한다. 아래는 3항식의 대표적인 예다.
<script> function jin( first , second ) { var final = first === undefined ? second : first ; } </script>
보편적으로 대부분의 프로그래머는 코드를 한 줄로 줄이면 더 이상 줄이려고 노력을 하지 않는다. 그러나, 자바스크립트에서는 여기가 끝이 아니다. 아래의 예제는 최근까지 가장 자주 사용되는 변수 할당 방법으로 다 수의 자바스크립트에서 보편적으로 사용하는 코드 기법이다.
<script> function jin ( first , second ) { var final = first || second ; } </script>
사실 프로그램 코드의 축약이나 새로운 기법은 프로그램 작성을 돕기 위하여 발견되거나 개발된다. 실제로 위에 제시된 프로그램 코드는 매우 심플하며, 심지어 직관적이기 까지 하다. 만약 이러한 코드를 PHP에 적용하여 실행한다면 두 변수의 연산 결과가 저장되므로 true 혹은 false 값이 저장될 것이다. 그러므로, 이러한 문법은 자바스크립트에 한하여 가능한 것으로 보편적 문법이라 보기는 어렵다.
이와 같이 프로그램 문법에는 언어에 따른 특성도 있으므로 예상 할 수 없을 정도의 수 많은 작성 기법이 존재한다. 수 많은 프로그래머가 존재하듯이 그들에 의해 만들어진 다양한 코드 작성 기법이 존재한다. 그래서 대부분의 개발자는 자신이 작성한 프로그램 이외의 코드를 보는 것을 힘들어한다. 왜냐하면 프로그램 로직을 이해해야 하는 것을 기본이고, 기존 개발자의 습관과 코드 작성 방법, 그리고 로직 구성 스타일도 함께 이해해야 하기 때문이다. 결국, 배보다 배꼽이 큰 사태가 되어 프로그램을 새로 만드는 것이 빠른 경우도 많다.
그래서 이러한 병패를 해결하고자 코드 컨벤션이라는 것이 존재한다. 코드 컨벤션은 여러명의 개발자가 하나의 프로젝트 혹은 동일 회사에 소속되어 개발을 진행 할 때 프로그램을 작성하는 방법(스타일)을 고정하고 지정된 규칙에 맞춰 프로그램을 작성하는 습관을 길러 이에 익숙해지는 지도록 한다. 이렇게 귀찮은 코드 컨벤션을 유지하는 근본적인 목적은 개발자 업무가 변경되거나 혹은 퇴사를 한다 해도 프로그램 유지 및 보수, 추가적인 개발을 진행 할 때 발생되는 시간을 줄이고 프로그램 이해 및 가독성을 높이기 위함이다.
그러므로 보편적인 코드 작성 규칙을 기반으로 각 개발자가 가지고 있는 고유한 코드 작성 스타일 중에서 유효한 기법은 코드 컨벤션에 녹여 공개/배포하고 유효하지 않거나 이해함에 어려움이 존재하는 것은 배제하기도 한다. 그러나 모든 회사가 이와 같은 코드 컨벤션을 만들기 위해 시간을 들여 노력하는 것은 아니다. 왜냐하면 이미 잘 만들어진 코드 컨벤션이 공개되어 있기 때문이다.
PHP 및 Java, ASP 등의 각 언어는 언어 별 코드 컨벤션이 존재하고 있다. 심지어 회사(예를 들면 구글 혹은 MS)에서 자사 프로그램 개발에 사용되기 위하여 만들어진 코드 컨벤션도 존재하고 심지어 대중에게 공개되어 있다. 회사에서 사용되는 코드 컨벤션이 공개되는 이유는 사회적 공헌의 의미도 있지만, 미래의 자사 직원들이 미리 공개된 코드 컨벤션 규칙에 따라 코딩 습관이 길러지면 업무에 참여 할 때 코드 컨벤션의 습득에 따르는 시간이 절약되어 회사의 이득으로 발전하기 때문이다.
그 덕에 최근에 개발되는 일부 프로젝트는 구글 코드 컨벤션을 따르는 경우를 자주 볼 수 있으며, 심지어 구글에 입사를 희망하는 일부 개발자는 구글 코드 컨벤션을 따르는 프로그램을 개발하여 구글 개발자 센터에 등록해 놓고 있다. 이것은 자신은 이미 구글 코드 컨벤션을 능숙하게 따르고 있는 개발자라는 것을 표현하는 좋은 방법이기도 하다.
이유야 어찌되었든, 전 세계 수 많은 개발자들은 지금도 새로운 코드 작성 기법을 만들어내고 있으며, 이를 체계적으로 정리하고 문서화하여 보편적인 규칙이 될 수 있도록 다듬어 공개하고 있다.