여러 프로젝트를 개발하면서 Javascript를 사용해왔고 그렇게 3년이 지나고 어느새 5년이라는 시간이 지났다. 그럼에도 불구하고 아직까지 Javascript에 대해 설명하려면 “어렵지만, 쉬운” 언어라는 말이 먼저 나오고, 공부를 하면 할수록 “내가 알고 있는것이 맞는가?”, “얼마나 알아야 기본은 아는것일까?”라는 당혹감?에 빠져 있었다.
그래서 이참에 내가 사용해왔고 알아왔던 Javascript에 대해 더 알아보려고 한다. 그리고 친해져보려고 한다.
Javascript의 탄생
Javascript의 시작은 미국의 넷스케이프 커뮤니케이션스(Netscape Communications)가 1994년 말 출시한 모자이크 넷스케이프가 1990년대에 주된 웹 브라우저로 자리잡기 시작하자 웹이 더 동적으로 변화할 필요을 느끼며 이를 위한 글루 언어(glue language) 개발을 위해 브렌던 아이크를 영입하고 개발한 언어가 지금의 Javascript이다.
사실 Javascript는 개발 당시 모카(Mocha)라는 이름으로 불려졌다. 그러나 1995년 9월 넷스케이프 내비게이터 2.0 브라우저의 베타 릴리스 때는 라이브스크립트(LiveScript)로 바뀌었고 그해 12월 넷스케이프 내비게이터 2.0 베타 3 릴리스 때 우리가 알고 있는 Javascript라는 이름으로 정식 채택되었다.
개발에 대해 모르거나 시작하는 사람들이 대게 햇갈려하는 Java와 Javascript의 혼란은 넷스케이프가 당시 인기있는 웹 프로그래밍 언어로서 자바스크립트를 내밀기 위한 것으로 마케팅적인 선택으로 보여진다. 그러나 기술적으론 Javascript와 Java는 객체 모델을 갖는다는 거외에는 근본적으로 다르다.
표준화를 위한 작업, ECMAScript와 Javascript
Javascript의 동적 웹 페이지 조작이 흥행하자 Microsoft는 자신들의 브라우저인 Internet Explerer를 지원하기 위해 J스크립트를 개발했고 1996년 8월에 출시된 인터넷 익스플로러 브라우저 3.0부터 적용하기 시작합니다. 이는 경쟁적 위치를 선점하며 자신들의 브라우저에서만 동작하는 기능들을 추가하기 시작했다는 것을 의미하며 크로스 브라우징 이슈의 말초가 된다. 즉, Javascript의 파편화가 시작된 것이다. 이러한 현상은 Javascript의 발전을 저해하며 사용자들이 공통된 경험을 누리지 못하는 불편을 야기했다.
바로 이러한 점을 해소하기 위해 만들어진 것이 ECMAScript 그리고 ECMA-262 로, Javascript의 표준 명세서로써 프로그래밍 언어의 타입, 값, 객체와 프로퍼티, 함수, 빌트인 객체 등 핵심 문법(core syntax) 을 규정하며 브라우저 제조사는 이를 준수하여 브라우저 내장 자바스크립트 엔진을 구현해야 한다. (ECMAScript에 대한 자세한 내용은 추후 포스팅하겠습니다)
Javascript의 발전
JavaScript는 XMLHttpRequest, JSON, Ajax과 같은 기술들이 개발됨에 따라 버튼의 클릭에 따른 UI 변경, Form 유효성 검증과 같은 단순한 작업에서 XMLHttpRequest의 브라우저(IE5) 도입에 따른서버와 브라우저 간의 비동기 데이터 통신을 시작으로 활용 가능성이 넓어지기 시작했다.
- 1999년, XMLHttpRequest API가 IE5에 도입됨
- 2001년, 더글러스 크락포드가 자바스크립트의 기존 텍스트 형식의 데이터 저장을 ‘JSON(Javascript Object Notation)’이라는 객체 문법의 구조화된 문자기 반의 표준 포맷을 개발
- 2005년, Ajax를 이용해 구글이 구글Maps를 소개. 불필요한 렌더링을 줄이며 서버로부터 필요한 데이터만을 요청해 갱신이 필요한 부분만 리렌더링하는 방식을 선보임
- 2006년, jQuery의 등장으로 핸들링 하기 어려웠던 DOM의 한계를 극복했으며 크로스 브라우징 이슈가 해결됨
- 2008년, 구글이 크롬 웹브라우저 함께 V8이라는 자바스크립트 엔진 발표하면서 보다 웹 어플리케이션 또한 데스크톱 어플리케이션과 유사한 사용자 경험을 제공할 수 있게 됨
- 2009년, Node.js 라는 Server-side에서도 활용할 수 있는 Javascript가 개발됨에 따라 Client-side에 한정된 Javascript의 영역을 확대함
Javascript의 정의와 특징
Javascript는 “웹 브라우저에서 실행되는 유일한 클라이언트 사이드 프로그래밍 언어” 로써 쉽게 배우고, 빠르게 개발할 수 있다는 강력한 장점을 제공하지만 Javascript의 성격과 패러다임 그리고 어떤 기능적 특징을 갖고 있는지 이해하는 것은 여간 어려운 것이 아니다. 왜냐하면 기본 문법은 C, Java와 유사하고 프로토타입 기반의 상속은 Self에서, 일급 함수의 개념은 Scheme에서 차용하였듯 기존의 프로그래밍 언어에서 많은 영향을 받았기 때문이다.
프로토타입 기반, 다중 패러다임 스크립트 언어이며, 동적이고 명령어, 객체 지향, 함수 프로그래밍 스타일을 지원한다.
Javascript의 정의
Javascript는 가벼운 인터프리터 또는 JIT 컴파일 프로그래밍 언어로 prototype 기반의 객체 지향 패러다임을 바탕으로 하는 인터프리터 언어이자 기존의 웹 브라우저 뿐만이 아니라 서버사이드에서도 작동하는 크로스 플랫폼 언어이다.
Javascript의 특징
- 일급 함수 사용
- Scheme의 일급 함수 개념을 차용했으며 이를 통해 고차 함수(high order function) 가 가능하다.
- 즉, Javascript의 Array Method 중 each, filter, map과 같은 함수의 인자로 함수를 받는 형태를 말한다.
- 가벼운 인터프리터 또는 JIT 컴파일 프로그래밍 언어
- Javascript는 인터프리터 언어로서 브라우저에서 동작하기 전에 다른 컴파일러를 통해 코드를 변환할 필요가 없으며 코드가 위에서 아래로 순차적으로 실행되고 결과를 즉시 반환한다.
- 모던 웹 브라우저에 JIT 컴파일러(Just In Time Compiler)가 내장되어 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
- 프로토타입 기반의 객체 지향 언어
- 클래스가 없으며 클래스 기반 언어에서 상속을 사용하는 것과 다르게 객체를 원형으로 하여 복제의 과정을 통해 객체의 동작 방식을 다시 사용할 수 있다. 이는 클래스 기반 프로그래밍 언어인 Java와도 다른 점이다.
- 객체 생성 시에 클래스로부터 그 내용을 상속받아서 객체를 만드는 것이 아니라, 객체로부터 그 특성을 복제하여 새로운 객체를 생성하기 때문에 런타임 중에도 객체의 속성과 값을 추가하거나 변경하고, 삭제까지 가능합니다.
- 명령형(imperative), 함수형(functional)을 지원하는 다중 패러다임 스크립트 언어
- 동적이고 명령어, 객체 지향, 함수 프로그래밍 스타일을 지원
- Javascript는 다른 언어들과 다르게 변수, 매개변수 및 함수의 반환 값의 타입을 명시적으로 지정하지 않아도 된다는 특징을 가지며 이는 프로토타입 기반 모델이 동적 상속을 제공하기 때문이다. 따라서 함수는 객체의 속성이나 타입이 느슨하게 지정된채 실행되는 메소드가 될 수 있다.
- 절차지향 (procedural) 언어와 객체지향 (object oriented) 언어 두가지 형태로 개발 가능함