Two face of identifier

프로그래밍 언어에서 식별자는 아주 중요합니다.
식별자는 값, 타입 따위에 묶임으로서 궁극적으로 프로그래머가 주소가 아닌 이름으로서 변수에 접근할 수 있게 해줍니다.
아마 여러분들은 자바스크립트를 시작하실 때 변수와 함께 식별자에 대해 배우셨을겁니다.
그만큼 이해하기 쉬운 게 바로 식별자인데요.
오늘은 이 식별자에 대해 짧고 깊은 이야기를 나누도록 하겠습니다.

반쪽짜리 식별자

여러분들이 아시는 식별자란 무엇인가요? 네, 맞습니다. 예약어 가 아닌 유니코드 문자들의 열이지요.
여러분이 통상적으로 알고 계시는 이런 식별자는 명세서에서는 identifier 라는 논 터미널입니다.
명세서에서 identifier 의 EBNF 표현식이 기명되는 자리에는 아래와 같이 적혀있습니다.

IdentifierName but not ReservedWord

의문스럽게도 identifier 논 터미널 안에 identifierName 이라는 논 터미널이 있습니다! 이쯤되면 눈치채신 분도 계실텐데요.
네, 맞습니다 사실 identifierReservedWord (예약어) 가 아닌 식별자들을 의미하는 것이고, 본체는 identifierName 입니다.
보통 통상적으로 보시는 식별자는 identifier 인데요.
저는 이것을 식별자의 앞면 이라고 부릅니다.
그리고 identifierName식별자의 뒷면 이라고 부르지요.

식별자가 사용되는 많은 케이스에서 identifier 가 사용되는데요.
이런 케이스들의 공통되는 특징이 하나 있습니다.
바로 특정 구문이나 연산자가 사용될 수 있는 환경 (예: 블록, 함수 몸체, 전역 스코프 등)이라는 점 입니다.
특정 구문이나 연산자가 사용될 수 있는 환경에서 이들과 같은 문자들로 이루어진 식별자의 사용을 허용한다면 모호한 구문을 만들어내기에 코드의 파싱이 불가능 해지는데요, 이런 일을 방지하기 위해 예약어가 존재하기 때문에 어찌보면 당연하기도 한 공통점이네요.

식별자의 반대편 얼굴

자, 그럼 식별자의 반대편 얼굴을 보도록 하지요.
라고 해도 별로 거창한 건 없습니다.
위의 보편적인 식별자의 통념에 반대되는 특징 하나 빼고는 다른 게 없거든요.
그리고 여러분들은 그 특징이 무엇인지 이미 앞에서 알고 오셨지요.
그러니 제게 남은 일은 식별자의 뒷면이 어디서 사용될 수 있는지 알려드리는 거 밖에 없습니다.

여러분들은 식별자의 뒷면이라고 해서 너무 낯설어 하실 필요가 없습니다.
사실 여러분들이 알게 모르게 많은 코드에서 쓰이고 있습니다.
여러분이 자각하지 못할 뿐이지요.
식별자의 뒷면은 예약어가 사용될 수 없는 환경에서 사용됩니다.
(예: 객체 리터럴의 프로퍼티 정의시, 클래스의 메서드 정의시 등) 이런 케이스에서는 특정 구문이나 연산자들이 사용될 수 없음이 확실하기에 구문 분석기는 입력받은 식별자가 예약어인지 확인하지 않습니다.

맺는 말

내일 수행평가가 4개나 들었는데 전 도대체 뭔 정신으로 글을 쓰고 있는지 모르겠네요 :(
여하튼, 제 글을 읽어주셔서 감사합니다 :)

공유하기