[자바스크립트 완벽가이드] 2장_어휘 구조

유동균·2023년 2월 27일
0
post-thumbnail

프로그래밍 언어의 어휘 구조는 그 언어로 프로그램을 작성할 때 지켜야할 기본적인 규칙의 집합.

1. 자바스크립트 프로그램의 텍스트

자바스크립트는 대소문자르 구별한다.
키워드, 변수, 함수명, 기타 식별자를 쓸 때 대소문자를 일관적으로 써야한다는 뜻.

자바스크립트는 토근 사이의 공백을 무시하고, 대부분의 경우 줄바꿈 역시 무시한다.
일반적인 스페이스 문자 외에 탭, ASCII 제어 문자, 다양한 유니코드 스페이스 문자를 모두 공백으로 인식.

2. 주석

자바스크립트는 두 가지 스타일의 주석을 지원한다.

  • //와 행 끝 사이의 텍스트는 모두 주석으로 취급하여 무시한다.

  • /**/ 사이에 있는 텍스트 역시 주석으로 취급한다.
    이 주석은 여러 행에 걸쳐 쓸 수 있지만 중첩은 불가능하다.

    // 한 줄 주석
    
    /*
    여러 줄 주석
    */

3. 리터럴

Literal은 프로그램 안에 직접 쓴 데이터 값.

12				// 숫자열
1.2				// 숫자열
'Hello world'	// 문자열	
"Hi"			// 문자열
true			// 불리언
false			// 불리언
null			// null

4. 식별자와 예약어

식별자는 이름.
자바스크립트에서 식별자는 상수, 변수, 프로퍼티, 함수, 클래스의 이름에 사용하고 일부 루프의 라벨로도 사용한다.
식별자는 반드시 글자(알파벳 사용 권장), 밑줄 _, 달러 기호 $로 시작해야 한다. 그 뒤에는 글자, 숫자, 밑줄, 달러 기호를 사용할 수 있다.

// 유효한 식별자
i
my_variable_name
v13
_dummy
$str

다른 언어와 마찬가지로 자바스크립트도 특정 식별자를 언어 자체에서 사용하도록 예약한다.
이들 예약어는 일반적인 식별자로 사용할 수 없다.

4.1 예약어

아래의 단어들은 모두 자바스크립트의 일부분이다.

as      const      export     get          null     target   void
async   continue   extends    if           of       this     while
await   debugger   false      import       return   throw    with
break   default    finally    in           set      true     yield
case    delete     for        instanceof   static   try
catch   do         from       let          super    typeof
calss   else       function   new          switch   var


// 지금은 사용되지 않지만 미래 버전에서 사용될 수 있으므로 제한되는 키워드
enum implements interface package private protected public

이들 중 상당수(if, while, for 등)는 예약된 키워드이므로 상수, 변수, 함수, 클래스의 이름으로 사용할 수 없다.
나머지 일부(from, of, get, set 등)는 제한적인 컨텍스트에서 문법적 모호함 없이 사용되므로 식별자로 써도 문제는 없다.

let 같은 키워드는 하위 호환성을 위해 완전히 예약어로 분리할 수 없으므로, 일반 식별자로 사용할 수 있는 경우와 사용할 수 없는 경우를 나누는 복잡한 규칙이 존재한다.

  • let을 클래스 외부에서 var를 사용해 선언했다면 변수 이름으로 사용해도 되지만,
  • 클래스 내부에서 선언하거나 const로 선언할 수는 없다.

가장 쉬운 방법은 이들을 모두 식별자로 사용하지 않는 것.

단, form, set, target은 사용해도 안전하다.

5. 유니코드

자바스크립트 프로그램은 유니코드 문자셋으로 작성된다.
유니코드 문자는 모두 문자열이나 주석에 사용할 수 있다.
수정할 때 편리하도록 식별자에는 ASCII 글자와 숫자만 쓰는 것이 일반적이지만, 자바스크립트 자체는 식별자에 유니코드 글자, 숫자, 상형 문자를 모두 허용한다.

const π = 3.14;
const= true;

5.1 유니코드 이스케이프 시퀀스

컴퓨터 하드웨어와 소프트웨어 중에는 유니코드 문자 전체를 정확히 표시, 입력, 처리하지 못하는 것도 있기 때문에,
자바스크립트는 구형 기술을 사용하는 프로그래머와 시스템을 지원하기 위해 ASCII 문자만으로 유니코드 문자를 표현하는 이스케이프 시퀀스를 정의한다.

유니코드 이스케이프는 \u 문자로 시작하고 그 뒤에 정확히 네 개의 16진수 숫자(0~9, A~F)를 쓰거나,
1~6개의 16진수 숫자를 중괄호 안에 쓰는 형태이다.
유니코드 이스케이프는 문자열 리터럴, 정규 표현식 리터럴, 식별자에 사용할 수 있다.(키워드에는 사용하지 않음)

초기 버전의 자바스크립트는 숫자 네 개를 쓰는 이스케이프 시퀀스만 지원했는데,
ES6에서는 이모지처럼 16비트 이상이 필요한 유니코드 포인트를 더 잘 지원하기 위해 중괄호 문법을 도입함.

// é 문자의 유니코드 이스케이프는 \u00E9

let café = 1;	// 유니코드 문자로 변수 정의
caf\u00e9		// 1; 이스케이프 시퀀스로 변수 접근
caf\u{E9}		// 1; 이스케이프 시퀀스로 변수 접근

// 웃는 얼굴 이모지
console.log("\u{1F^00}");

주석에 유니코드 이스케이프를 쓸 수 있긴 하지만,
주석은 무시되므로 ASCII 문자로 취급할 뿐 유니코드로 해석되지 않음.

5.2 유니코드 정규화

자바스크립트 프로그램에 ASCII 문자가 아닌 문자를 사용할 때는 유니코드에 그 문자를 인코딩 방법이나 하나 이상 있음을 반드시 인지해야 한다.

예를 들어, é 문자는

  • 단일 유니코드 문자 \u00E9로 인코드할 수도 있고,
  • 일번적인 ASCII 문자 e 다음에 악센트 조합 기호 \u0301을 붙여서 인코드할 수도 있다.

위의 두가지 인코딩은 일반적으로 텍스트 에디터에는 똑같이 표시되지만,
이진 인코딩이 달라 자바스크립트는 이 둘을 다른 것으로 간주하기 때문에 혼란스러운 문제를 야기할 수 있다.

// 눈으로는 구별할 수 없지만 다른 상수이고 값도 다르다.
const café = 1;	// "caf\u{e9}"
const café = 2;	// "caf\u{301}"
café;			// 1;
café;			// 2;

6. 선택 사항인 세미콜론

다른 프로그래밍 언어와 마찬가지로 자바스크립트 역시 세미콜론 ;을 사용해 문을 구분한다.
세미콜론은 코드의 의미를 명확히 하는 데 중요한 역할을 한다.
구분자가 없다면 어떤 문의 끝과 다음 문의 시작을 구분하기가 쉽지 않기 때문이다.

자바스크립트에서 두 문 사이에 줄바꿈이 있을 때는 대부분 세미콜론을 생략해도 된다.
프로그램의 끝에서도 생략이 가능하고, 그 다음 토큰이 닫는 중괄호일 때도 생략이 가능하다.

a = 1
b = 2

// 줄바꿈이 없을때는 생략 불가
a = 3; b =4;

자바스크립트가 줄바꿈을 전부 세미콜론으로 취급하지 않는데,
줄바꿈을 세미콜론으로 취급하는 경우는 묵시적인 세미콜론을 추가하지 않고서는 코드를 분석할 수 없을 때이다.
즉, 자바스크립트는 줄바꿈 다음에 오는 공백 아닌 문자를 현재문에 이어진다고 판단할 수 없을 때 줄바꿈을 세미콜론 취급한다.

let a
a
=
3
consile.log(a)

// 위 코드는 아래와 같다.
let a; a = 3; consile.log(a);

자바스크립트는 세미콜론 없이 let a a라는 코드를 분석할 수 없으므로 첫 번째 줄바꿈을 세미콜론으로 취급한다.
두 번째 aa;라는 문으로 해석할 수도 있지만, a = 3;이라는 더 긴 문으로 분석을 계속할 수 있으므로 두 번째 줄바꿈은 세미콜론으로 취급하지 않는다.

이렇게 문을 종료하는 규칙은 의외의 결과를 부를 수 있다.

let y = x + f
(a+b).toString()

// 위 코드의 해석 결과
let y = x + f(a+b).toString();

일반적으로 문이 (, [, /, +로 시작한다면 그 문은 이전 문이 계속되는 것으로 해석될 가능성이 있다.

자바스크립트가 두 번째 행을 첫 번째 행의 연속이라고 분석할 수 없을 경우 줄바꿈을 세미콜론으로 해석한다는 규칙에는 세 가지 예외가 있다.

  • return, throw, yield, break, continue 이들은 종종 독립적으로 사용되지만 이 뒤에 식별자나 표현식이 올 때가 있는다.
    이 단어들 사이에 줄바꿈이 일어난다면, 자바스크립트는 항상 그 줄바꿈을 세미콜론으로 해석한다.
    따라서 return, throw, yield, break, continue 다음에 어떤 표현식을 쓴다면, 그 사이에 줄바꿈이 들어가서는 안된다.

  • ++, -- 연산자들은 전위 연산자로도, 후위 연산자라도 사용할 수 있다.
    이들을 후위 연산자로 사용한다면 반드시 적용할 표현식과 같은 행에 써야한다.

  • 화살표함수 =>는 반드시 매개변수 리스트와 같은 행에 있어야한다.

0개의 댓글