JavaScript/소개
자바스크립트는 국제 표준 ECMA스크립트를 구현한 프로그래밍 언어이다. 다음과 같은 개념을 바탕으로 한다.
동적 데이터 타입
[+/-]자바스크립트에는 원시 타입(Number
, String
, Boolean
, BigInt
, Symbol
, Undefined
, Null
)이 있다. 자바스크립트에는 객체 타입(Array
, Date
, Error
, Function
, RegExp
)이 있다.[1][2]
변수가 존재하면 타입이 정의되긴 하지만 변수에 다른 타입을 할당하면 언제든지 타입이 바뀐다. 예를 들어 다음과 같은 코드가 가능하다.
let x;
x = 'Some text';
x = 2;
x = [10, 11, 12];
위 코드를 실행하면 컴파일타임이나 런타임 에러가 나지 않는다. 단지 변수 x
의 타입이 Undefined
에서 String
으로, String
에서 Number
로 Number
에서 Object/Array
로 바뀔 뿐이다.
(참고: JSON은 텍스트 기반 데이터 포맷이다. JSON은 자바스크립트의 자료형은 아니다. 따라서 JSON은 특정 프로그래밍 언어와 상관이 없다. JSON이 자바스크립트 객체 문법을 쓸 뿐이다.)
함수형 프로그래밍
[+/-]함수는 변수처럼 일급시민이다. 함수를 변수에 할당할 수 있고 함수를 다른 함수에 인자로 넣을 수 있고 함수에서 함수를 리턴할 수 있다. 아래 코드는 함수 sayHello
를 만들고 함수를 변수 x
에 할당하고 x
를 호출해서 함수를 실행한다.
function sayHello() {
return 'Good morning'
};
let x = sayHello;
console.log(x());
객체지향 프로그래밍
[+/-]자바스크립트는 프로토타입을 통해 객체지향 프로그래밍과 상속을 지원한다. 프로토타입은 복제 및 확장이 가능한 객체이다. 프로토타입 복제 및 확장을 통해 프로토타입 체인을 형성한다. 프로토타입은 다른 객체지향 프로그래밍 언어와 다르다. 예를 들어 자바는 클래스를 통해서 상속 같은 객체지향 기능을 사용한다. 그럼에도 불구하고 자바스크립트에서도 문법적 레벨에서는 클래스를 사용할 수 있다. 하지만 자바스크립트에서 사용하는 클래스는 ‘문법 설탕’일 뿐이다. 내부적으로 자바스크립트는 프로토타입 매커니즘을 사용한다.
C와 비슷한 문법
[+/-]자바스크립트 문법은 C, 자바, 다른 C 계열 언어와 비슷하다. 하지만 개념과 런타임 동작은 많이 다르다.
자바와 관계
[+/-]자바스크립트는 C와 문법이 비슷한 점을 빼고 자바와 관련이 없다. 자바스크립트와 자바의 차이점을 명확히 해보자.
처음에 넷스케이프가 자바스크립트를, 썬 마이크로시스템즈가 자바를 개발했다. 자바는 클래스와 객체 인스턴스를 쓰고 자바스크립트는 프로토타입을 쓴다. 자바에서 변수는 사용하기 전에 선언을 해야 하고 자바스크립트에서는 꼭 그렇게 하지 않아도 된다.(추천하는 방법은 아니다.)
자바에서 변수는 프로그램이 실행되는 동안 타입이 변하지 않는다.(예를 들어 int
나 String
같은 타입이 있다.) 자바스크립트에도 타입(Number
나 String
같은)이 있지만 실행 중에 타입이 바뀔 수 있다. 환경이 타입을 탐지하기 때문에 타입을 명시하지 않아도 되고 할 수도 없다.
// 자바에서 다음과 같이 타입과 변수 이름을 적는다.
int x = 0;
// 자바스크립트에서 let이나 const를 적고 변수 이름을 적는다.
// 등호 오른쪽에 0을 적어서 변수 x의 타입은 Number가 된다.
let x = 0;
// x의 타입이 Number에서 String으로 바뀐다.
let x = String (0);
// 타입을 확인하려면 다음과 같이 한다.
alert(typeof x);
자바스크립트 엔진
[+/-]자바스크립트는 클라이언트사이드와 서버사이드에서 동작한다. 자바스크립트의 첫 번째 버전은 단순한 인터프리터 역할을 하는 브라우저에서 동작했다. 요즘은 저스트인타임(JIT) 컴파일러가 자바스크립트를 다룬다. 컴파일러는 스크립트를 파싱해서 추상 문법 트리(AST)를 만들고 트리를 최적화해서 JIT 바이트코드를 만든다. JIT 바이트코드는 기계어로 변환되어 실행된다. JIT 컴파일러는 브라우저 외에도 C++로 만든 node.js 같은 애플리케이션에서 쓰이기도 한다.
널리 쓰이는 자바스크립트 엔진은 다음과 같다.
- 구글 V8: 구글 크롬, 일렉트론, 크로미움, node.js
- 모질라 스파이더몽키, 파이어폭스
- 애플 자바스크립트코어, 사파리
- 어도피 액션스크립트, 플래시