반응형

1. 자바스크립트 개요


https://www.codementor.io/learn-programming/beginner-programming-language-job-salary-community 를 보면 자바스크립트는 흥미로운 언어임에는 틀림없다. Python, Ruby, Javascript는 현재에 매우 핫한 프로그래밍 언어들이다.


 Python은 최근의 데이터 사이언스에 대한 관심을 반영하는 듯하고, Ruby는 당연히 ruby on rails의 선호에 기인할 것이다. Javascript는 동적 웹을 위한 유일한 표준적 프로그래밍 언어이기 때문에 역시 많이 나타나고 있으며 최근에는 node.js 라는 걸출한 서버 사이드에서 좋은 활약을 보이고 있다. 


 자바스크립트는 흥미로운 언어임에는 틀림 없지만, 또한 매우 혼란스러운 언어이기도 하다. 프로그래밍을 모르는 사람들은 자바스크립트가 자바에 기인한 언어로 생각하기 쉬운데, 정확히는 자바스크립트는 ECMAScript라는 명칭이 맞다. ECMA International 은 정보 통신 관련 비영리 표준화 기구이다. (ECMA인터네셔날 위키 설명)


 자바스크립트는 C의 문법을 차용한 Lisp에 가깝다고 한다. Lisp은 haskel과 함께 대표적 함수 언어이다. 자바스크립트도 함수 언어적 특성을 가지고 있다.


자바스크립트는 다음의 특성을 가진다.


 1) 프로토타입 기반 객체 상속

- 자바스크립트는 클래스를 지원하지 않으며, 숨겨진 링크인 프로토타입을 가진다. 객체를 생성하면 해당 객체는 생성자의 프로토타입 객체를 가르키게 된다. 클래스가 필요 없으며 다른 객체의 속성을 직접 상속할 수 있다.

- 자바스크립트는 클래스를 지원하지 않지만, 프로토타입 체인과 클로저로 상속, 캡슐화, 정보은닉등을 제공할 수 있다.


 2) 1급 객체로서의 함수

- 자바스크립트의 함수는 1급 객체이다. 이 말은 함수가 일반 변수, 객체처럼 취급될 수 있다는 것이다. 예를 들면 인자로 넘겨지거나, 함수의 리턴값이 될 수 있다. 자바스크립트에서는 함수도 객체로 취급된다. 


 3) 느슨한 타입 체크

- 자바스크립트는 컴파일 언어에서와 같은 강력한 타입 체크를 하지 않는다. 하지만 컴파일 언어에서의 강력한 타입 체크가 실제적으로 우려되는 버그들을 잡아주는 것은 아니다. 이 느슨한 타입 체크는 느슨한 타입 체크로 자유롭게 변수를 사용-표현할 수 있다.


 4) 표현적인 객체 리터럴 & 동적 객체

- 자바스크립트는 이름:값으로 단순하게 객체의 속성을 지정해 줄수 있다. 또한 동적으로 객체에 속성을 추가, 삭제할 수 있다.


 6) 독특한 실행 컨텍스트와 클로저

- 자바스크립트의 독특한 실행 컨텍스트 를 만들고 그 안에서 실행되는 구조를 가진다. 실행 컨텍스트는 자신만의 유효범위(Scope)를 가지고 이를 이용해서 클로저를 구현할 수 있다.


 7) 함수형 프로그래밍 가능

- 자바스크립트는 람다 언어의 특징을 가지고 있다. 함수형 프로그래밍은 높은 수준의 모듈화가 가능하지만, 가독성이 좋지 않다.


 자바스크립트는 전역 변수에 기반한다는 단점이 존재한다.  물론 자바도 public static 이라는 키워드로 전역 객체를 생성할수 있지만, 자바스크립트는 필요할 때만 전역 변수를 사용할 수 없다. 링킹 단계가 없기 때문에 모든 컴파일 단위가 하나의 공용 전역 객체에 로딩 된다. (웹브라우저에서는 window, node.js 에서는 global)

 또한 느슨한 타입 체크로 인해서 디버깅이 어려울 수 있다. 하지만 이는 잘 사용하면 장점이 되기도 한다.


  자바스크립트는 활용 범위가 넓다. 기본적으로 동적 웹 개발을 위해서 사용 된다. 웹개발을 위해서 대표적인 라이브러리로 jquery가 있다. 그리고 backbone.js, angular.js, react.js등 여러 프레임웍들이 존재한다. 그리고 서버 개발로는 node.js가 있으며 폰갭과 같은 자바스크립트 기반 애플리케이션 개발 프레임웍도 존재한다.



2. 자바스크립트의 기본 데이터 타입


 자바스크립트의 데이터 타입은 "기본타입"과 "참조타입"으로 구분할 수 있다. 기본 타입은 숫자(Number), 문자열(String), 블린값(Boolean), undefined, null 이다. 기본타입은 그 자체가 하나의 값을 나타낸다고 볼 수 있는데, undefined 와 null은 좀 특수한 형태이다. 

 undefined는 변수가 선언된 적이 없거나, 값을 할당하지 않아서 어떤 타입인지 정의할수 없는 상태인 것이다. null은 명시적으로 비어 있는 값이라고 선언하는 것으로 null의 경우 object type 이다. (typeof 결과가 Object로 리턴함)

 기본 타입의 Number, String, Boolean, undefined를 제외하면 자바스크립트에서는 모든 것은 객체이다. (배열, 함수, 정규식 등도 객체의 한 종류이다.) 

 자바스크립트는 느슨한 타입 체크 언어로 다음과 같이 var 키워드 하나로 변수를 선언할 수 있다. 다음은 node.js에서 몇몇 변수를 선언하고 타입체크를 해본 예이다. 

> var str="hello";

undefined

> typeof str;

'string'

> var num=123;

undefined

> typeof num

'number'

> typeof abc

'undefined'

> abc=undefined

undefined

>typeof abc

'undefined'

>var empVal=null

undefined

>typeof empVal

'object'


2.1 자바스크립트 예약어

자바스크립트의 예약어는 이름, 매개변수가 될 수 없다. 다음은 자바스크립트의 예약어들이다.

abstract

boolean break byte

case catch char class const continue

debugger default delete do double

else enum export extends

false final finally float for function

goto

if implements import in instanceof int interface

long

native new null

package private protected public

return

short static super switch synchronized

this throw throws transient true try typeof

var volatile void

while with

 예약어는 변수나 매개변수의 이름으로 사용될 수 없으며, 예약어가 객체 리터럴에서 속성 이름으로 사용될 때는 따옴표로 묶어줘야 한다. (더글라스 크락포드의 책에서는 마침표 . 을 이용해서 변수를 할당하는 것은 잘못된 사용이라고 하였으나, 실제로 var test={}; test.case='hello'; 와 같이 사용해도 크롬과 node.js에서는 문제가 없는듯 하다. 이 코드는 var test={}; test['case']='hello';  와 같다.  단 test[case]='hello'는 오류를 발생시킨다.)



2.2 Number

 자바스크립트는 숫자형이 64비트 부동 소수점 방식(자바의 double)이며 하나의 숫자형만 존재한다. 정수형이 존재하지지 않으며 정수와 실수를 구별하지 않는다. 따라서 7/3의 경우 정수형 연산이 안된다. 또한 소수점에 대한 계산이 정확하지 않을 수 있다. 즉 0.1+0.2 하고 0.3은 값이 같지 않다. 정수 부분에 대한 계산은 정확하게 된다. 따라서 0.1 + 0.2를 정확하게 계산하기 위해서는 소수점 이하를 없애고(예를 들어 0.1이면 10을 곱하고) 계산하면 정확하게 될 수 있다. 소수점의 결과가 정확해야 할 경우에는 정수화해서 계산한다. 즉 많은 주의가 필요하다.

 NaN는 수치 연산에서 정상적인 값을 얻지 못할때 할당된다.(물론 명시적으로 NaN을 할당할 수도 있다.) NaN은 그 자신을 포함하여 어떤 값하고도 같지 않다. isNaN() 함수로 체크해야 한다. 표현 가능한 숫자보다 큰 범위의 경우 Infinity로 나타낸다. 둘다 typeof 반환값은 'number'이다.

 parseInt 는 문자열을 정수형으로 바꿔주는 함수이다. 이 함수는 문자열의 첫 문자부터 변환을 하다가 숫자가 아닌 문자를 만나게 되면 변환을 멈춘다. 그래서 parsetInt("16") 과  parseInt("16 ton")은 결과가 같다. 


2.3 String

 문자열은 Immutable하다. 즉 한번 저장되면 변경되지 않는다. 예를 들어 var str='test' 로 선언하고 test[0]='T'로 할당하여도 str은 여전히 'test'이다. 자바스크립트의 모든 문자는 16비트 유니코드이다. 이스케티프 문자는 \ 이며 \u로 유니코드 값을 숫자로 표현할 수 있다. 문자열은 length속성을 가진다. 기본타입이지만 str.toUpperCase() 또는 str.toLowerCase()와 같은 메소드를 가지고 있다. 


2.4 Boolean

 거짓에 해당하는 값은 false, null, undefined, '' (빈문자열), 숫자 0, NaN 등이다. 이 외에는 참이 된다. 비교 연산자로 ==와 ===가 있는데, ==은 주의해서 사용해야 한다. ==는 타입 컨버전을 하고 비교한다. 즉 1=='1' 은 참이 되는 것이다. 되도록이면 ===과 !== 을 사용해야 한다.


2.5 표현식

 표현식은 1) 이항연산자의 표현식, 2) ? (삼항 연산자의 표현식), 3) () (호출), 4) 세부지정(. 또는 [])등이 있다. 다음은 연산자의 우선 순위이다. (typeof 도 연산자의 하나이다.)


2.6 typeof

 typeof 연산자는 피연산자의 타입을 알 수 있게 해주는 문자열을 반환한다. 예를 들어 typeof 11.1 은 'number' 문자열을 반환한다. 그런데 주의해야 할 것은 null의 경우 object 를 반환한다. typeof 는 null과 객체를 구별하지 못하기 때문에 어떤 객체가 null인지 판단하려면 다음의 코드와 같이 null은 거짓이고, 모든 객체는 참이라는 속성을 이용하는 것이다. 

if (my_value && typeof my_value==='object'){

statements...

}

 또 주의해야 할 부분은 정규 표현식 객체에 대해서 자바스크립트 실행 환경에 따라서 object 나 function으로 반환하는 경우가 있다는 것이다.


2.7 거짓인 값들

 자바스크립트는 다음과 같은 거짓으로 판단되는 값들이 있다.



참고자료

 - 더글라스 크락포드의 자바스크립트 핵심 가이드, 한빛미디어, 2008

 - 인사이드 자바스크립트, 한빛 미디어, 2014

반응형
Posted by alias
,