자바스크립트의 자동 세미콜론 삽입(Automatic Semicolon Insertion, ASI)은 개발자가 세미콜론을 생략했을 때 자바스크립트 엔진이 코드를 해석하는 과정에서 누락된 세미콜론을 자동으로 삽입해 주는 기능입니다. 덕분에 문장 끝에 세미콜론을 붙이지 않아도 대부분의 경우 프로그램이 정상적으로 동작하지만, 그 이면에는 명확한 규칙이 존재합니다.
ASI가 적용되는 문장
다음과 같은 문장들이 자동 세미콜론 삽입의 영향을 받습니다.
empty statement (빈 문장) var statement (var 선언문) expression statement (표현식 문장) do-while statement (do-while 문) continue statement (continue 문) break statement (break 문) return statement (return 문) throw statement (throw 문)
ASI의 핵심 규칙
ECMAScript 명세에 따르면, 파서가 스크립트나 모듈을 왼쪽에서 오른쪽으로 해석할 때 다음 규칙에 따라 세미콜론이 자동으로 삽입됩니다.
1. 문법에 허용되지 않는 토큰을 만난 경우
파싱 도중 어떤 생성 규칙(production)으로도 허용되지 않는 토큰을 만났을 때, 아래 조건 중 하나라도 참이라면 해당 토큰 앞에 세미콜론이 자동으로 삽입됩니다.
- 위반(offending) 토큰이 닫는 중괄호 }인 경우
- 이전 토큰이 닫는 괄호 )이고, 삽입되는 세미콜론이 do-while 문의 종결 세미콜론으로 해석되는 경우
2. 입력 스트림의 끝에 도달한 경우
토큰 입력 스트림의 끝(end of input stream)에 도달하여 파서가 입력 전체를 하나의 완전한 ECMAScript 프로그램 또는 모듈로 해석할 수 없을 때도 세미콜론이 자동으로 삽입됩니다.
3. 제한된 생성(restricted production)을 만난 경우
문법상 특정 생성 규칙으로 허용되는 토큰이지만, 해당 생성이 '제한된 생성(restricted production)'에 해당하고 그 토큰이 어노테이션 바로 뒤에 오는 종료 터미널 또는 논터미널의 첫 번째 토큰인 경우입니다. 대표적으로 return, break, continue, throw 뒤에 줄바꿈이 오면 안 되는 상황이 여기에 속합니다.
이러한 ASI 규칙을 정확히 이해하면 세미콜론 생략으로 인해 발생할 수 있는 예기치 않은 버그를 예방하고, 더 안전하고 일관성 있는 코드를 작성할 수 있습니다.