2015년 1월 23일 금요일

[JavaScript] Keyword 들과 Reserve Words 란?

자바스크립트의 Keyword(키워드)란?


ECMA Script 는 Statement 를 시작하거나 끝낼 때, 특수한 기능을 수행할 때 등 특수한 목적을 위한 Keyword들을 가지고 있는데 이러한 키워드들은 특수한 목적을 두고 있으니 사용이 제약된다. 특히 keyword 는 코드 작성시 변수 이름이나 함수 이름, 그리고 property 이름에 사용할 수 없으니 피해 가도록 하자. 만약 사용할 경우에는 'Identifier Expected' 라는 에러를 보게 될 것이다.

do
break 
do 
instanceof 
typeof 
case 
else 
new 
var 
catch 
finally 
return 
void 
continue 
for 
switch 
while 
debugger
function
this
with
default
if
throw
delete
in
try


자바스크립트의 Reserve Word(예약 키워드)란?


위에서 설명한 단어들이 현재 사용되고 있는 키워드라면 Reserve Word는 미래에, 즉 다음 ECMA Script 버젼에 사용될 확율이 높아 사용하지 않는게 좋은 키워드들 이다. 이 또한 변수 이름이나 함수 이름에 사용하지 말도록 하자. Reserve word 같은 경우에는 변수/함수 이름에 사용하는거에 제약이 있으나, property 이름에 사용하는데는 제약이 없다. 하지만 추후 코드 관리를 위해서 사용을 최대한 피하도록 하자


//Non-Strict 모드(일반 모드)에서도 사용시 에러를 보게되는 키워드들
class
enum
extends
super
const
export
import

//Strict 모드에서 사용이 제한되는 키워드들
implements
package 
public
interface
private
static
let
protected
yield

2015년 1월 22일 목요일

[JavaScript] Strict Mode를 사용해야 하는 이유

JavaScript 의 모체인 ECMAScript 는 C와 C를 이은 언어들, JAVA, C++ 등의 문법적인 요소들을 많이 이어 받아 비슷한 점들이 매우 많다. 하지만 그와 다른점이 있다면 몇몇 문법적인 요소들을 사용자의 자유에 맞기고 그리 철저하게 강요하지 않는다는건데, 만약 제대로된 문법을 지키지 않고, 단지 에러가 나지 않는다는 이유로 엉망진창인 프로그래밍하게되면 ECMAScript Core 가 새 버젼으로 바뀌게 될 경우에 큰 문제를 마주치게 될 수도 있다.

ECMA 스크립트는 버젼이 바뀌면서 새로운 기능들과 요소들을 추가하게 되는데 만약 당신이 이러한 요소들을을 고려하지 않고 미래에 쓰일 Identifier들이나 키워드들을 지금 당장의 편의를 위해서 사용해버리면 추후에 많은 에러를 양산하게 될 수도 있고 결국 이는 모든 코드의 재 검사, 재 작성으로 이어지게 된다.

또한, 웹브라우져들은 각각 다른 내장 자바스크립트 엔진을 사용하는데
Mozila Firefox = SpiderMonkey
Google Chrome = V8
Internet Explorer = Chakra
이런 엔진에 따라 인터넷 익스플로러에서 작동하는 코드가 다른 브라우져에서 작동하지 않는 경우가 발생할 수도 있다. 문제는 개발환경이 매우 다양한 자바스크립트 개발과정에서 이러한 기준을 정한채 개발하는게 초보 개발자들에게는 어렵다는건데,

이러한 이유에서인지 ECMAScript 5에 들어서 Strict mode 라는게 생겼다. 이 Strict Mode는 코드 컴파일시 ECMA Script의 문법 요소들과 Reserved Keyword 들의 미사용을 철저하게 강요해 일반 실행 모드보다 더 많은 예외(Exception)들을 발생시키게하여 궁극적으로는 안전한 자바스크립트 코드를 작성하는데 목적을 두고 있다.

Strict Mode 는 아래와 같이 실행이 가능하다.

"use strict";//이 컨텍스트에서 스트릭트 모드를 사용한다

function testFunction()
{

"use strict";
//이 컨텍스트에서 스트릭트 모드를 사용한다. 후에 이 function 실행이 종료되면 strict mode도 종료된다.

alert("STRICT MODE");

}

아래는 브라우져들의 Strict Mode를 지원 현황이다.  초록색으로 표시된 버젼들이 모두 지원하는 버젼들이니, 거의 대부분의 브라우져들이 지원한다고 보면 된다. 클릭하면 크게 볼 수 있다

출처: http://caniuse.com/#search=strict%20mode


Strict Mode는 거의 대부분의 브라우져들이 지원하니 코드 작성시에 strict mode 를 사용해서 안전한 자바스크립트 코드를 작성하자.

2015년 1월 19일 월요일

[JavaScript] HTML의 Script 태그, 그리고 Async와 Defer 속성

부제 : Script 태그의 Async 와 Defer 속성

HTML 파일에 자바스크립트를 삽입하는 유일한 방법은 아래와 같이 HTML의 스크립트 태그를 이용하는거다. 자바스크립트를 시작하기 전에 Script 태그에 대해서 좀 자세하게 다뤄볼까 한다.

우선 Script 태그는 아래와 같이 사용된다

<html>
<head>
<script>
alert("Script Tag");
</script>
</head>
<body>
This is Body
Body End
<script src = "www.example.com/js/script.js"></script>
</body>
</html>

위와 같이 Script 태그는 어디든지 배치 될 수 있으며 위에서 아래로 HTML 문서를 읽는 브라우져들의 특성상, head 태그에 외부 스크립트가 배치 될 경우에는 페이지 렌더링(rendering)이 시작되기 전에 head 태그에 배치된 스크립트가 다운로드되고, 파싱(Parsing)되고 실행되게 된다. 만약 상당히 큰 스크립트 파일을 head 태그에 배치하게 될 경우에, body 렌더링이 시작되기전에 스크립트를 실행하는데 많은 시간을 할애 할 수 있다. 하지만 body 태그의 마지막에 스크립트 태그를 배치하게 되면, html 페이지의 body 내용이 다 렌더링(rendering)된 후에으로써 스크립트를 다운받기 시작하니 사용자 입장에서 보이는 페이지 로딩시간을 줄일 수 있다.

주의할 점
위에서 아래로 읽히는 HTML 문서의 특성상 스크립트 태그 안에 "</script>", 스크립트 엔드 태그가 존재할 경우에 태그를 닫게 된다. 아래 예제를 보자

<html>
<head>
<script>
var a = "</script> end tag test";//스크립트가 여기서 끝나게 되버려 alert 가 실행되지 않는다
alert(a);
</script>
</head>
<body>
This is Body
<script>
var t = "<\/script>";// '/'(Slash)를 표시하는 escaped character 인 '\/'를 이용하자
alert(t);
</script>
</body>
</html>

위와 같이 자바스크립트에서 스크립트 언어에 사용되는 기호들을 String 값으로 표현할 때, Escape Character 를 이용하여 표시한다. Slash(/) 를 표시하는 기호인 '\/'를 이용해서 "</script>"를 스트링값으로 저장할 수 있다.

Script 태그의 Attribute

Script 태그는 총 5개의 Attribute 를 가진다. 필수적인 Attribute 은 가지지 않는다

  • async
    • 외부 스크립트의 다운로드가  페이지 파싱이나 다른 스크립트 다운로드 프로세스와 동시에 진행된다. 그리고 스크립트 다운로드가 완료되는 즉시 바로 실행된다
  • charset
    • UTF-8, euc-kr 과 같은 스크립트의 Character set를 지정한다
  • defer
    • 외부 스크립트의 다운로드가  페이지 파싱이나 다른 스크립트 다운로드 프로세스와 동시에 진행된다. HTML 페이지 파싱이 완료된 후에서야 스크립트가 실행된다
  • src
    • 외부 스크립트를 다운로드할 주소
  • type
    • 스크립트의 종류
    • javascript 의 경우에는 type = "text/javascript"로 적는다.

async 속성과 defer 속성

위에 잠시 이야기했듯이, 기본적으로 웹 브라우져는 html 코드를 위에서 아래로 파싱(Parsing)한다. 이 때문에 큰 스크립트 파일같은 경우에, 그 배치 위치에 따라 사용자 입장에서의 페이지 로딩 타임이 길어질 수도, 짧아질 수도 있는데, 이를 조정하기 위해서 나온게 async 와 defer 속성이다.

아래와 같이 쓰인다

<html>
<head>
<script async src = "www.example.com/js/script.js"></script>
<script defer src = "www.example.com/js/script.js"></script>
</head>
<body>
This is Body
Body End
</body>
</html>


Script 태그 async 속성과 defer 속성
Script 태그 async 속성과 defer 속성

위의 이미지를 보자

일반적인 스크립트 태그 같은 경우에는  html 파싱(Parsing) 중, 스크립트 태그를 읽게 되면 잠시 파싱을 멈추고 스크립트를 다운받아 실행한 후에 다시 파싱 작업을 이어간다. 이 경우에, html 태그의  앞부분에 스크립트 태그를 배치하게되면(특히나 헤드 태그 내에) 페이지 렌더링이 시작되기도 전에(페이지 렌더링은 body 태그의 시작과 함께 시작된다) 스크립트를 다운로드하고 실행하는데 시간을 할애하게 된다. 사용자의 입장에서 생각해봤을 때, 당신의 웹 페이지를 보는 사용자는 스크립트가 다운로드 되는 동안 텅빈 하얀 페이지를 보고만 있어야 한다. 물론 짧은 스크립트일 때는 이 시간은 극히 짧으니 그리 신경 쓸 필요가 없다, 그렇지만 만약에 인터넷 커넥션이 느리거나 사이즈가 큰 스크립트를 다운받는다면 아마 사용자는 긴 시간동안 페이지 로딩을 기다려야 할 것이다. 이러한 문제들을 해결하기 위해서 HTML5 에 들어 async 속성과 defer 속성이 추가되었다

Async 속성을 가진 스크립트 태그 같은 경우에는 HTML 파싱과 동시에 스크립트 다운로드가 진행된다. 그리고 스크립트 다운로드가 완료되는 순간 HTML 파싱을 잠시 멈추고 스크립트를 실행한다. 이러한 특성 때문에 순서대로 다운로드가 시작된 스크립트라도 순서대로 실행되지는 않는다. 아래 예제를 보자

<html>
<head>
<script async src = "www.example.com/js/script1.js"></script>
<script async src = "www.example.com/js/script2.js"></script>
//script2가 script1 보다 먼져 실행될 수도 있다.
</head>
<body>
This is Body
Body End
</body>
</html>

이러한 이유로 DOM(Document Object Model)을 수정하는 스크립트 같은 경우에는 async 속성을 사용하지 않는게 좋다.

Defer 속성을 가진 스크립트 태그 같은 경우에는 HTML 파싱과 동시에 스크립트 다운로드가 진행된다. 그러나 async 속성과는 달리 HTML 파싱이 완료된(</html> 태그를 읽은 후) 후에야 스크립트가 실행된다.  아래의 예제를 보자

<html>
<head>
<script defer src = "www.example.com/js/script1.js"></script>
<script defer src = "www.example.com/js/script2.js"></script>
//script1가 script2 보다 먼져 실행된다
</head>
<body>
This is Body
Body End
</body>
</html>

스크립트 태그가 헤드 태그 내에 위치해 있으나 HTML 파싱을 멈추지 않고 바로 다운로드가 진행된다. 그리고 </html> 엔드 태그를 읽은 후에야 스크립트를 실행하게 된다. 그리고 async 태그와는 달리 스크립트는 HTML 문서 내에 위치한 순서대로 실행 된다. 그러니 위의 예제에서는 html 문서 파싱이 완료된 후에 script1.js 가 실행되고 그 후에야 script2.js 가 실행된다.

async 속성이나 defer 속성이든 둘다 외부 스크립트 파일에만 적용이 가능한 속성이니 내부 스크립트에 쓰는 일은 없도록 하자

noscript 태그

요즘은 자바 스크립트를 지원하지 않는 웹 브라우져를 찾을 수가 없지만, 초기에만 해도 자바스크립트가 지원되지 않던 브라우져들이 존재 했었다. 그럴 경우를 위해서 나온게 바로 noscript 태그 이다. 사용법은 간단하다. 

<html>
<head>
<title>NOSCRIPT TAG EXAMPLE</title>
</head>
<body>
<script src = "www.example.com/script.js"></script>
<noscript>
<h1>자바스크립트 기능을 활성화 해 주세요</h1>
</noscript>
</body>
</html>


만약 자바스크립트 실행이 비활성화 되있다면(또는 자바스크립트 기능이 없거나) noscript 태그 내의 html이 파싱된다. 웹브라우져 개발자 도구를 들어가서 자바스크립트를 비활성화 시킨 다면 "자바스크립트 기능을 활성화 해 주세요" 구문을 보게 될 것이다

2015년 1월 13일 화요일

JPG, PNG, GIF 이미지 파일들의 특징과 차이

JPG 이미지 파일의 특징

  • 사진과 같은 다양하게 연결되는 톤을 가진 이미지에 알맞은 포맷이다. 
  • JPG는 약 160만개에 달하는 색들을 표현할 수 있다.
  • 사이즈를 줄이기 위해서 이미지 정보를 삭제하기 때문에 손실률이 높은 포맷이다.
  • 투명도를 지원하지 않는다
  • 에니메이션을 지원하지 않는다

PNG 이미지 파일의 특징


  • 몇가지 색으로만 이루어지거나, 선들로 이루어진 이미지들, 예를 들어 로고, 클립 아트 그리고 텍스트 이미지를 표현하는데 알맞다.
  • PNG는 약 백만개에 달하는 색들을 표현할 수 있고, 종류에 따라 표현할 수 있는 색의 갯수를 달리한다. 예)PNG-8, PNG-24, PNG-32.
  • PNG포맷 또한 JPG 와 같이 사이즈를 줄이는 포맷이나 이미지의 정보를 삭제하지는 않는다. 그렇기 때문에 "lossless"(무손실) 포맷이라 불리고는 한다. 
  • 투명도를 지원한다.
  • 대부분의 경우에 같은 이미지를 표현하는 JPEG 파일보다 사이즈가 더 크다, 
  • GIF 와 비교했을 때 사용되는 색의 갯수에 따라 사이즈가 더 작거나 크거나 한다.


GIF 이미지 파일의 특징


  • PNG, GIF 와 같은 이미지 포맷들은 로고, 클립아트, 텍스트 이미지와 같이 적은 색들로 이루어졌거나 선들로 이루어진 이미지들을 표현하기에 적합하다.
  • GIF는 약 265개의 색들을 표현 가능하다.
  • GIF 또한  PNG와 같이 "lossless", 즉 무손실 포맷이다.
  • GIF는 투명도를 지원한다, 하지만 이미지당 색 1개만 투명 설정이 가능하다.
  • 대분의 경우에 같은 이미지를 표현하는 JPEG 파일보다 사이즈가 더 크다.
  • 애니메이션을 지원한다

2015년 1월 12일 월요일

[JavaScript] 자바스크립트란 무엇인가?

부제 : ECMAScript와 자바스크립트


비공식 자바스크립트(Javascript) 로고


자바스크립트(Javascript)는 1995년 넷스케이프(Netscape) 웹 브라우져에서 웹페이지에 동적인 요소를 구현하기 위해서 발명 되었다. 그 후 많은 다른 웹 브라우져들 또한 이 언어를 탑재하기 시작했고, 그 결과로 현대의 웹 어플리케이션의 구현을 가능하게 만든 언어이다. 이 언어로 인해 웹 어플리케이션에서 더 이상 사용자가 페이지 새로고침 또는 페이지를 새로 불러오지 않고도 웹과 직접적인 연결이 가능하게 되었다.


우선 자바스크립트(Javascript)를 시작하기 전에 처음 알아야 할 것은 이 자바스크립트(Javascript)라는 언어는 Sun System이 개발하여 지금은 Oracle에서 관리되고있는 자바(Java)라는 프로그래밍 언어와는 전혀 관계가 없다는 것이다. 둘다 자바(Java) 라는 단어를 이름에 가지고 있으니 비슷해 보일 수도 있겠지만, 전혀 그렇지 않다. 몇몇 소스들에 따르면 이 자바스크립트(Javascript)라는 이름은 자바(Java)의 유명세를 등에 업기 위해서 이리 이름 지어졌다고도 한다. 자바스크립트(Javascript)가 처음 나왔을 때는 1995년, 바로 자바(Java)라는 프로그래밍 언어가 유명세를 타며 세상을 휩쓸고 있을 때였다. 아마 이 유명세를 등에 업으려 그렇게 한게 아닐까?


어쨋든, 자바스크립트(Javascript)가 넷스케이프(Netscape) 브라우져만이 아니라 다른 웹 브라우져들의 지원까지 받기 시작하면서 다양한 웹 브라우져에서 자바스크립트(Javascript)가 공통되게 잘 작동하기 위해서 표준 규격이 필요해졌는데, 이 때문에, ECMA 국제 기구에서 "ECMAScript Standard"라 불리는 스크립트 표준이 만들어지게 된다. 자바스크립트와 비슷한 뜻으로 많이 들어본 사람들이 있을텐데, Javascript는 ECMAScript와 BOM(Browser Object Model) 와 DOM(Document Object Model)이라는 1개의 코어와, 2개의 모델로 이루어져 있다. ECMAScript 와 Javascript 는 비슷한 뜻으로 자주 쓰이나 작은 차이를 가지고 있다는 걸 알아두자.

앞서 말했듯 흔히 우리가 자바스크립트(Javascript)라 부르는 것은 정확히 말하면 3가지가 합쳐서 만들어진것인데 그것들은 바로 ECMAScript 와 DOM(Document Object Model) 와 BOM(Browser Object Model) 이다.

ECMAScript는 자바 스크립트를 이루는 코어(Core) 스크립트 언어로, 웹 환경에서만 호스트 되는 언어가 아니다. 웹 환경은 ECMA 스크립트가 호스트되는 환경들 중 하나일 뿐이다. EMCA 스크립트 호스트 환경은 ECMA 스크립트 실행 환경이 구현되있고, 각각 그 환경에 알맞는 확장성을 가지고 있다. 예를들어 웹 브라우져 환경에서는 BOM(Browser Object Model)과 DOM(Document Object Model)이 그 확장성이 되겠다. 이러한 확장성들은 EMCA 스크립트의 문법과 기능에 맞춰 기능의 확장을 가능게 한다. 자바스크립트의 document 객체가 좋은 예이다. 다른 호스트 환경으로는 node.js, Adobe Flash, MongoDB, CouchDB  등이 있다

ECMA 스크립트는 기본적으로 언어의
  • 문법(Syntax)
  • 데이터 타입(Type)
  • 구문(조건문, 반복문 등)(Statement)
  • 키워드(Keyword)
  • 예정 키워드(Reserved Word)
  • 연산자(Operator)
  • 객체(Object)
등을 규정짓는다. 이는 어떤 ECMA 스크립트 호스트 환경에서든 동일하다.

자바스크립트(Javascript)의 코어 스크립트인 ECMAScript 에는 몇가지 버젼들이 있는데, 2000년부터 2010년까지는 "ECMAScript 버젼 3"이 가장 대중적으로 지원되었다. 그리고 이 동안 언어에 근본적인 변화, 발전, 그리고 확장을 꾀한다는 야심을 가지고 "ECMAScript 버젼 4"의 개발이 진행되었다. 매우 대중적으로 쓰이고, 거의 모든 웹에서 쓰이는 언어를 바꾼다는게 쉽지는 않았는지, 원래 2008년 발표로 계획되었던 "ECMAScript 버젼 4"는 2008년에 엎어져 버렸고(ECMAScript Harmony(버젼 6)라는 다른 프로젝트로 이름을 바꿨다, 현재 진행 중), "ECMAScript 버젼 5"라는 이름으로 원래 계획된 거에는 미치지 못하지만 그래도 작은 발전을 가진 다섯번째 ECMAScript 에디션이 발표되었다. 참고로 내가 앞으로 포스트 할 자바스크립트가 바로 요즘 잘 쓰이고 있는 "ECMAScript 버젼 5"이다. 현재 "ECMAScript 버젼 6", 즉 버젼 4에서 엎어졌던 기능들을 이어가는 "ECMAScript Harmony" 프로젝트가 거의 완성단계에 있으며, 몇몇 웹 브라우져들은 미리 발표된 기능들을 지원하기도 한다.  어쨋든  "ECMAScript 버젼 6"은  2015년 6월 발표를 앞두고 계속 개발되고 있는 중이다.

이 ECMAScript 언어는 다른 언어에 비해 매우 높은 자유도를 가졌는데. 이는 왜냐하면 초기 자바스크립트(Javascript)가 초심자들의 접근을 용이하게, 더 쉽게 하는데 목적을 두고 개발된 언어이기 때문이다. 하지만 실제 개발 상황에서는, 시스템이 문제가 뭔지 제대로 알려주지 않아 개발을 더 어렵게 만들기도 한다. 그렇지만 이런 자유도에 따라오는 몇가지 장점들이 있는데, 그건 바로 자유도가 낮은 다른 프로그래밍 언어들이 구현하기 거의 불가능한 기능들을 자바스크립트(Javascript)로 구현할 수 있다는것이다. 이러한 이유에서 ECMA 스크립트는 몇년전 부터 소프트웨어 산업에서 많은 관심을 받고 있다.