제대로 배우자, 자바스크립트(Javascript) #2 – 타입

자바스크립트 타입에 대해 알아보자. 이 글을 읽고 세 개를 기억하면 된다

  • 원시 타입(primitive types)
  • 참조 타입(reference types)
  • 원시 래퍼 타입(primitive wrapper types)

추가로 하나 더 기억하자. 자바스크립트에는 클래스가 없다. 하지만 참조 타입을 통해 클래스와 유사한 개념으로 프로그래밍이 가능하다.

I. 원시 타입(primitive type)

데이터가 변수에 직접 저장되는 타입

  1. Boolean true 또는 false
  2. Number 정수 또는 부동소수점 실수 값
  3. String 한 쌍의 작은 따옴표 또는 큰 따옴표로 감싼 일련의 문자 (JS에는 문자 타입 X)
  4. Null null 값만 있는 원시 타입
  5. Undefined undefined 값만 있는 원시 타입

원시 타입 종류를 확인하려면 typeof 연산자를 사용하면 됨

typeof 연산자

여기서 typeof null의 결과는 object로 나오는데 자바스크립트 언어를 설계하고 관리하는 TC39 위원회에서 이는 실수라고 인정했던 부분이다. 어떤 변수가 null 인지 아닌지 비교하려면 === 연산자를 사용해 null과 직접 비교하는 게 가장 좋은 방법이다.

II. 참조 타입(reference type)

Object 타입은 데이터의 주소가 변수에 저장되는 타입(데이터가 직접 변수에 저장되는 게 아님)으로 순서가 없는 프로퍼티(property)로 이루어져 있다. 프로퍼티는 변수일 수도 있고 함수일 수도 있다. 자바스크립트의 함수는 일급 함수(first-class functions)임을 기억하자.

일급 함수라는 말은…

  1. 함수를 변수에 할당할 수 있고,
  2. 함수를 인자로 전달할 수 있으며,
  3. 리턴값으로 함수를 반환할 수 있다.

는 뜻이다.

자바스크립트는 가비지 컬렉션(garbage collection) 기능이 있어 프로그래머는 메모리 할당 및 해제를 고려하지 않아도 된다. 하지만 프로그래밍이라는 것은 명확하면 명확할 수록 좋다. 따라서 사용하지 않는 객체는 null을 할당하여 참조 제거(dereference)를 하는 게 좋다.

또한, 자바스크립트에는 내장 참조 타입이 몇 가지 더 있다.

  1. Array 숫자 인덱스 값을 가진 순차 목록
  2. Date 날짜와 시간
  3. Error 실행 중 발생하는 에러 (에러의 종류에 따라 더 구체적인 하위 에러 타입이 존재)
  4. Function 함수
  5. Object 일반적인 객체
  6. RegExp 정규 표현식

참조 타입을 확인하려면 함수의 경우는 typeof, instanceof 연산자를 사용하면 된다. 그 외 타입은 instanceof 연산자를 사용한다.

intanceof 연산자 사용 예시

추가로 원시 래퍼 타입(primitive wrapper types)인 String, Number, Boolean을 기억하자. 이들은 객체를 다루듯 원시 값을 쉽게 사용할 수 있도록 지원하기 위해 만들어졌다. 이 때 자바스크립트 엔진 내부에서 일어나는 일을 오토박싱(autoboxing)이라 한다.

var name = “Ryan군”;
var firstChar = name.charAt(0);

위 코드는 아래와 같이 처리된다.

var name = “Ryan군”;
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;

III. 요약

자바스크립트에는 클래스가 없는 대신 타입이 존재한다. 원시 타입은 일반 변수를 생각하면 된다. 참조 타입은 클래스와 가장 가까운 개념으로 두 타입은 typeof 연산자, instance 연산자로 확인할 수 있다. 또한, String, Number, Boolean이라는 세 종류의 원시 래퍼 타입이 있어 원시 값을 마치 참조 값처럼 다룰 수 있다.

– 출처: 객체지향 자바스크립틔 원리, 니콜라스 C. 자카스

제대로 배우자, 자바스크립트(Javascript) #1 – 시작

I. 프롤로그

서울도서관에서 책을 빌렸다. 책 제목은  <Do it! 쉽게 배우는 웹앱 & 하이브리드앱>이다. 책을 빠르게 훑어보다가 아래 문구를 봤다. 그리고 생각했다.

시바

원래 자바스크립트는 브라우저에서 실행되는 자바 언어를 기반으로 한 스크립트 언어로 시작하였으나… – <Do it! 쉽게 배우는 웹앱 & 하이브리드앱> 22쪽

“자바 언어를 기반으로 한” 이라는 표현 때문에 JavaScript는 Java와 유사한 언어라는 착각을 줄 수 있다. 아니다. 그렇다면 제대로 된 역사에 대해 알아보자.

II. 자바스크립트의 역사

자바스크립트는 Netscape에 입사한 브랜든 에이크(Brendan Eich)가 1995년 5월에 개발했다. 처음 이름은 Mocha였고 LiveScript라는 이름을 썼다가 최종적으로는 JavaScript가 되었다. 처음에는 클라이언트(브라우저)에서 작동하는 언어로 개발되었지만 이제 서버에서도 쓰인다. 몇 년 전에 화제가 되었던 Node.js가 가장 대표적인 서버사이드 자바스크립트 기술이다.

JavaScript의 공식 명칭은 ECMAScript로 ECMA-262 명세를 기반으로 한다. 이는 듣보잡 JavaScript 변종을 없애기 위한 표준단체 노력의 일환이다. 대표적인 듣보잡의 예로는 JScript가 있다.

자바스크립트가 외형적으로는 당시 인터넷 언어로 자신을 홍보하던 Java를 따라한 것이 맞다. 하지만 이는 겉모습에 불과할 뿐 본질은 전혀 다르다. 어디가서 JavaScript는 Java를 기반으로 한 언어라고 하면 쪽팔림은 당신의 몫이다.

1995년 4월 브랜든 에이크(Brendan Eich)는 웹 브라우저에 내장되는 스킴(Scheme) 언어를 만들기 위해 넷스케이프에 입사한다. 당시 넷스케이프에선 웹 브라우저에 내장되는 언어의 필요성을 인식하고 있었으나 그 내막엔 미묘한 이견이 있었다. 이제 막 오크(Oak)에서 이름을 바꾼 자바(Java)가 본격적인 ‘인터넷 언어’로 브랜딩을 하고 있었고 넷스케이프에선 이 언어를 브라우저에 내장하기 위해 썬 사와 협상을 벌이는 중이었다(실제로 1995년 10월에 나온 넷스케이프 2.01B 버전은 자바를 탑재했다). 자바가 브라우저를 위한 인터넷 언어로 탑재되는 것이 가시화하자 넷스케이프 내부에서는 ‘브라우저에 또 하나의 언어가 필요한가’라는 논쟁이 자연스럽게 벌어졌다.

넷스케이프에선 두 종류의 언어가 필요하다는 결론을 내렸다. 하나는 진지하고 전문적인 프로그래머들을 위한 복잡한 언어, 즉 자바이고, 다른 하나는 아마추어나 디자이너를 위한 ‘스크립트’ 언어였다. HTML 안에 포함되어 동작하며 쉽고 가벼운 언어가 필요하다는 후자의 생각은 마크 앤드리슨, 빌 조이와 같은 IT 업계 거장들도 동의하는 사실이었고 이는 에이크가 만들 언어가 복잡한 괄호들로 가득 찬 신비로운 스킴이 아니라 ‘자바나 C 같이 보이는’ 그리고 ‘쉬워 보이는’ 언어여야 한다는 사실을 의미했다.

(중략)

에이크는 요구대로 스킴이 아닌 ‘자바처럼 보이는’ 스크립트 언어를 만든다. 하지만 그는 열흘 만에 기본 객체(built-in)들이 포함된 인터프리터를 만들면서도 자신의 본래 목적인 스킴의 함수형 언어적인 특성들을 최대한 모방해 자바스크립트를 높은 수준의 함수형 언어로 만들었다. 실제로 자바스크립트는 함수형 스타일의 좋은 교과서라 할 수 있는 SICP의 여러 예제를 거의 스킴과 같은 수준으로 따라할 수 있다. 단지 C 언어처럼 보일 뿐이며, 스킴과 다르게 꼬리 재귀(tail recursion)를 지원하지 않는다.

출처: 그 동안 몰랐던 서버 사이드 자바스크립트 이야기, Part 1: 다시 보는 자바스크립트의 역사

JavaScript 하면 나오는 Douglas Crockford의 글 또한 이름만 비슷할 뿐, JavaScript는 Java와 전혀 유사하지 않다고 주장한다.

The Java- prefix suggests that JavaScript is somehow related to Java, that it is a subset or less capable version of Java. It seems that the name was intentionally selected to create confusion, and from confusion comes misunderstanding. JavaScript is not interpreted Java. Java is interpreted Java. JavaScript is a different language.

JavaScript has a syntactic similarity to Java, much as Java has to C. But it is no more a subset of Java than Java is a subset of C. It is better than Java in the applications that Java (fka Oak) was originally intended for.

JavaScript was not developed at Sun Microsystems, the home of Java. JavaScript was developed at Netscape. It was originally called LiveScript, but that name wasn’t confusing enough.

The -Script suffix suggests that it is not a real programming language, that a scripting language is less than a programming language. But it is really a matter of specialization. Compared to C, JavaScript trades performance for expressive power and dynamism.

Source: JavaScript: The World Most Misunderstood Programming Language by Douglas Crockford

III. 마치면서

JavaScript의 역사에 대해 간단히 살펴봤다. 이제 어디가서 JavaScript는 Java를 기반으로 한 언어라고 말하지 말자. JavaScript 역사에 대한 더 좋은 자료는 <The Past, Present, and Future of JavaScript>를 참고하기 바란다.