Blog

3장 언어의 기초

March 25, 2014

3장 언어의 기초

이 글은 자바스크립트 제대로 배우기 스터디 그룹의 활동으로 «프론트엔드 개발자를 위한 자바스크립트»(2013 인사이트, 한선용 옮김)에서 요약한 글임을 밝힙니다.

언어의 기초

ECMA-262에서 자바스크립트의 핵심을 ECMAScript라는 가상 언어로 정의

웹 브라우저에서 가장 널리 구현된 ECMAScript 버전은 3판이며, 주요 브라우저(Firefox, Chrome, IE, Opera)는 5판까지 구현

문법

  • 대소문자 구분 (HTML과 다름)
  • 식별자 : 첫 번째 문자는 글자나 밑줄(_), 달러($), 유니코드 문자를 쓸 수 있으나 권장하지 않음, 카멜 케이스(관습)
  • 주석 : 한 줄(//), 여러 줄(/* */)
  • 스트릭트 모드 : ECMAScript 5, “use strict”;
  • 문장 : 각 문장은 세미콜론으로 종료, 코드 블럭({ })

키워드와 예약어

키워드와 예약어는 식별자나 프로퍼티 이름에 쓸 수 없음

5판이나 스트릭트 모드에서 다르거나 추가됨 (많으니 명세를 참고)

변수

  • 느슨한 변수 타입 : 변수에 어떤 타입의 데이터라도 저장할 수 있음
  • var 연산자 다음에 변수 이름을 씀 : var message;
  • 초기화 하지 않으면 undefined가 할당
  • var 연산자는 변수를 로컬 스코프에서 정의
  • var 연산자를 생략하면 변수를 전역으로 정의

데이터 타입

Undefined, Null, 불리언, 숫자, 문자열(원시 데이터 타입) + 객체

ECMAScript의 데이터 타입은 동적이므로 한 가지 데이터 타입이 여러 특성을 가질 수 있음

typeof 연산자

데이터 타입을 알아내야 할 때 사용
undefined, boolean, string, number, object, function 중에 하나를 반환

typeof는 연산자이므로 괄호를 쓰지 않아도 됨, typeof null은 “object”를 반환(null이 빈 객체를 참조하는 특별한 값이므로 올바른 결과)

undefined 타입

var를 써서 변수를 정의했지만 초기화하지 않았다면 해당 변수에는 undefined가 할당
초기화되지 않은 변수에 typeof 연산자를 호출하면 “undefined”를 반환, 정의되지 않은 변수에 typeof 연산자를 호출해도 “undefined” 반환. (논리적으로 둘 다 ‘조작’할 수 없는 상태)

Null 타입

Null 타입의 값은 빈 객체를 가리키는 포인터 null
typeof를 호출하면 “object”를 반환
undefined는 null에서 파생했으므로 null == undefined는 true

불리언 타입

ECMAScript에서 가장 많이 쓰이는 데이터 타입, true와 false 두 가지 리터럴 값만 가짐
ECMAScript에서는 모든 타입을 불리언 값으로 표현할 수 있음, Boolean() 함수
– true : true, 비어 있지 않은 문자열, 0이 아닌 숫자, 모든 객체
– false : false, 빈 문자열, 0, NaN, null, undefined

숫자 타입

정수와 부동소수점 숫자를 나타냄
10진법/8진법/16진법 리터럴과 부동소수점/지수표기법
MIN_VALUE ~ MAX_VALUE 숫자를 나타냄
NaN – 의도한 조작이 실패했을 때 반환값
NaN을 포함한 조작은 모두 NaN, NaN은 어떤 값(NaN 포함)과도 일치하지 않음
Number(), parseInt(), parseFloat() 함수로 숫자 변환

문자열 타입

16비트 유니코드 문자의 연속, 큰따옴표(“)나 작은따옴표(‘)로 감싸서 표현
\n, \t, \b, \r, \f … 등 문자 리터럴 있음
ECMAScript에서 문자열은 불변, 만들어지면 값을 바꿀 수 없음
toString(), String() 함수로 문자열 변환

객체 타입

ECMAScript에서 객체는 데이터와 기능의 집합
new 연산자로 ‘인스턴스’를 만들고 프로퍼티나 메서드를 추가
ECMAScript의 Object 타입은 모든 객체의 원형
Object 타입의 인스턴스는 Object 타입의 프로퍼티와 메소드를 전부 상속 (5, 6장에서 자세히)

연산자

계산 연산자, 비트 연산자, 관계 연산자, 일치 연산자

책에 상세하게 나와있으며 undefined, NaN, 타입 때문에 훑어볼 필요가 있음

문장

if, do-while, while, for, for-in, label:, break, continue, with, switch
(대부분 C, Java에 있는 제어문과 같음)

함수

문장을 캡슐화하여 어디서든, 언제든 실행할 수 있게 하므로 모든 언어의 핵심
ECMAScript에서 함수는 function 키워드로 정의하며 그 뒤에 매개변수와 함수 본문을 순서대로 씀

function functionName(arg0, arg1, ..., argN) {
    statements
}

ECMAScript의 함수는 꼭 값을 반환하지 않아도 됨
모든 함수는 언제든 return 문 뒤에 반환할 값을 써서 값을 반환할 수 있음
함수는 return 문을 만나는 즉시 실행을 멈추고 빠져나옴
return 문 뒤에 반환 값을 쓰지 않으면 undefined 값을 반환

매개변수의 이해

ECMAScript 함수는 매개변수 숫자를 따지지 않고 데이터 타입도 체크하지 않음
지정한 매개변수 이하, 이상 또는 없어도 에러가 나지 않음
ECMAScript의 매개변수는 내부적으로 배열로 표현
매개변수에 이름을 붙여도 함수 시그니처를 검사하지 않고, 유효성 검사도 안함
함수를 정의할 때 함께 정의한 매개변수를 넘기지 않으면 해당 매개변수는 undefined가 할당

오버로딩 없음

ECMAScript 함수에는 다른 언어에서 사용하는 오버로딩이 없음

함수 시그니처가 없고 매개변수는 배열로 표현되기 때문

ECMAScript에서는 같은 이름으로 함수를 여러 번 정의하면 마지막 함수가 해당 이름을 소유함

요약

자바스크립트의 핵심 기능은 ECMA-262에서 ECMAScript라는 이름의 가상 언어로 정의했음
– 기본 데이터 타입은 Undefined와 Null, 불리언, 숫자, 문자열
– 정수와 부동소수점을 구분하지 않고 숫자 데이터 타입 하나만 존재
– 복잡한 데이터 타입은 Object 타입은 자바스크립트의 모든 객체의 기반
– 스트릭트 모드는 자바스크립트에서 에러가 자주 생기는 부분에 몇 가지 제약을 가함
– 산술 연산자, 불리언 연산자, 관계 연산자, 동일(일치) 연산자, 할당 연산자 제공
– 제어문은 다른 언어들과 거의 비슷함 (몇 가지 빼고…)

ECMAScript의 함수는 다른 언어의 함수와 다르게 동작
– 무슨 값이든 반환할 수 있으므로 함수의 반환 값을 미리 명시하지 않음
– 값을 반환하지 않는 함수는 undefined를 반환
– 함수 시그니처가 없고 매개변수는 배열로 표현
– 매개변수 숫자에 제한이 없고 arguments 객체를 통해 접근
– 함수 시그니처가 없기 때문에 함수 오버로딩이 불가능