이와 같은 프로그래밍 언어의 특이 사항은 무한하다고 할 만큼 많지만 개발자들 사이에서 자주 언급되는 것은 몇 가지로 압축된다. 위 화살표를 사용하여 프로그래머를 “멘붕”으로 이끄는 11가지 프로그래밍 언어 특징에 대해 알아보자.
오라클 SQL에서 빈 문자열은 NULL
난해한 점: 오라클 RDBMS는 길이 0인 문자열은 null 값이 될 것으로 간주한다. 전자를 알려진(빈) 값으로 간주하고 후자를 알려지지 않은 값으로 간주하는, 즉 둘을 다르게 취급하는 다른 수많은 데이터베이스, ANSI/ISO 표준 SQL과 반대인 셈이다. 이로 인해 다른 RDBMS와 오라클 RDBMS 간의 코드 변환 또는 여러 RDBMS에서 실행되는 코드 작성이 상당히 어려워진다.
이유: SQL 표준이 나오기도 전인 1979년 최초의 상용 SQL 구현까지 거슬러 올라간, 오라클 초창기부터 전해 내려오는 유물인 듯하다. 다만 오라클은 앞으로 이 부분이 바뀔 가능성이 있다고 개발자들에게 미리 알리고 있다.
자바스크립트에서 +는 연결 연산자
난해한 점: 자바스크립트에서 + 연산자는 숫자에 대해서는 더하기 연산자, 문자열에 대해서는 연결 연산자다. 피연산자 중 하나가 문자열인 경우 자바스크립트는 다른 변수를 문자열로 변환하고, 결과적으로 연결이 발생한다. 즉, ‘1’ + 1은 11이 된다.
이유: 자바스크립트의 느슨한 형식 지정 때문이다. 예를 들어 파이썬도 +를 문자열 연결에 사용하지만 파이썬은 강력한 형식 지정 언어인 만큼 개발자가 문자열과 정수를 더하려고 하면 오류를 일으킨다.
펄 모듈은 TRUE를 반환해야만 한다
난해한 점: 펄 모듈은 거의 항상 1이라는 문으로 끝난다. 그렇지 않을 경우, 또는 마지막 문이 TRUE 값을 반환하지 않을 경우 오류가 발생한다.
이유: 펄 모듈은 초기화 코드와 서브루틴을 포함할 수 있는데, 파일이 로드된 후 펄은 TRUE 반환 값을 검색하여 그러한 코드가 성공적으로 실행되었는지를 확인한다. 초기화 코드가 없는 경우에도 펄은 최종 문이 TRUE를 반환할 것을 예상하며 그렇지 않을 경우 예외를 일으킨다.
C와 C++의 트라이그래프(Trigraph)
난해한 점: C(C++도 마찬가지)는 3가지 문자 조합(두 개의 물음표 이용)으로 9개의 트라이그래프(trigraphs)를 지원하며, 이는 컴파일 되기 전에 자동으로 단일 문자로 변환된다. 예를 들어 ‘??!’는 ‘|’로 변환된다. 이는 예기치 못한 동작으로 이어지고 소스 코드를 이해하기 어렵게 하는 요소다.
이유: 트라이그래프는 초창기 C 프로그래머들에게 키보드가 지원하지 않는 특정 문자(예: 중괄호)를 생성할 수 있는 방편이었다.
PHP의 대/소문자 무시
난해한 점: 다른 많은 언어의 식별자가 보통 대소문자를 구분하는 것과 달리, PHP 함수 이름(클래스 및 메소드 이름도 마찬가지)은 대소문자를 구분하지 않는다. 정말 개발자를 혼란스럽게 하는 부분은 따로 있다. 바로 PHP의 변수 이름, 상수, 클래스 속성은 대소문자를 구분한다는 점이다.
이유: CGI 스크립트에서 완전한 프로그래밍 언어로 발달되는 과정에서 발생한 결함일 것이다.
루비에서 0은 truthy
난해한 점: 루비에서는 0 값이 TRUE로 계산된다. C나 파이썬 등 다른 많은 언어에서 0은 FALSE로 계산되므로 새로 루비를 배우는 개발자들이 적응하기 어려워하는 경우가 많다.
이유: 루비에서는 오로지 부울 FALSE와 nil만 FALSE로 계산된다. 그 외의 모든 것은 TRUE다. 0도 다른 숫자와 마찬가지로 취급된다.
파이썬에서 공백은 블록을 나타내는 데 사용
난해한 점: 파이썬은 코드가 속하는 블록을 나타내는 데 구두점이나 키워드가 아닌 들여쓰기를 사용한다. 공백 수가 잘못될 경우(또는 공백과 탭이 섞일 경우) 오류가 발생할 수 있다.
이유: 코드의 가독성을 높이고 입력량을 줄이기 위해서다(많은 편집기가 자동으로 들여쓰기를 함).
C의 배열 인덱싱은 포인터 연산처럼 작동 난해한 점: C에서 배열 a의 원소 i를 참조하는 방법은 a[i]지만 똑 같은 원소를 i[a]로 참조할 수도 있다.
이유: C에서 배열은 메모리 블록에 대한 포인터처럼 동작한다. 즉, a[i] = *(a + i) = *(i + a)= i[a]
펄의 사전 정의 변수 난해한 점: 펄에는 모호한 이름(각기 영어로 된 긴 이름도 있지만)의 특수한 변수가 무척 많다. 따라서 펄에 익숙하지 않은 개발자는 펄 문서를 수시로 참조해야 하고, 코드는 더 읽기가 어려워진다.
이유: 이러한 변수는 프로그램 실행의 다양한 측면에 대한 정보와 접근 방법을 제공한다. (예: 프로세스 ID($$), 오류 메시지($@), 정규식 일치($^R))
자바스크립트의 자동 세미콜론 삽입
난해한 점: 자바스크립트는 세미콜론을 사용해서 특정 문의 끝을 표시하는데, 예를 들어 줄바꿈 등 문의 끝이라고 판단되는 부분이 나오면 자동으로 세미콜론을 삽입한다. 이로 인해 오류가 나타나기도 하고 예외 발생 없이 이해할 수 없는 동작이 일어나기도 한다.
이유: 세미콜론 삽입은 편리함을 위해 구현된 기능이다. C와 비슷한 자바스크립트의 구문을 초보 개발자들이 쉽게 이해할 수 있도록 하기 위해서다.
자바의 오토박싱과 Integer 캐싱
난해한 점: 자바는 기본 자료형(숫자, 문자, 부울)을 객체로 자동으로 변환한다(오토박싱). 예를 들어 int를 Integer 객체로 변환한다. 또한 기본적으로 값에 대한 정수 객체를 캐싱한다(-128 ~127). 따라서 오토박싱된 정수를 동일한 값과 비교하기 위해(-128 ~ 127에서는 TRUE, 그 외에는 FALSE) ==를 사용할 때 예기치 못한 동작이 일어난다.
이유: 오토박싱은 개발자가 작성해야 하는 코드의 양을 줄여주며 정수 캐싱은 성능을 높여준다. editor@itworld.co.kr