All Articles

[JavaScript Patterns] 1장 개요

2011년에 발행된 정말 오래된 책인데, 오랜만에 훑어보다가 아직도 좋은 내용이 많아서 다시 읽기로 하였다. 반 정도 읽었는데 나의 개발 습관과 책의 내용이 거의 비슷했다. 신입시절에 읽어서 그런지 읽은 기억이 없는데, 이렇게 밑줄까지 쳐서 읽은거 보니 현재 나의 개발 습관에 많이 영향을 받은 듯 하다. 물론 이 책만 읽은 것은 아니고ㅎㅎ 정말 많은 책과 해외 온라인 강의를 봤다. 공부할 때는 해도해도 끝이 없어보이고, 읽어도 까먹는 것 같아서 한숨만 나왔는데 지금 사람들을 가르치고, 다른 회사 코드리뷰도 했던 걸 보면 나도 모르게 지식이 쌓이고 있었나보다. 개발자는 공부를 게을리 해서는 안 된다는 생각을 다시금 한다. 이 책도 빨리 일독을 끝내야지. 공부할게 산더미다. 일할 것도 산더미고, 토이플젝도 쌓여있고 ㅎㅎ

패턴이란?

일반적인 문제에 대한 해결책을 가리킨다. 곧바로 복사해서 붙여넣을 수 있는 코드 형태의 답이 아니라, 모법적인 관행, 쓰임새에 맞게 추상화된 원리 등을 말한다.

안티패턴은 버그나 코딩 에러가 아니라, 문제를 해결하기보다는 오류를 더 많이 일으킬 수 있는 흔히 잘못 사용하는 접근 방법을 말한다.

자바스크립트의 개념

객체지향

자바스크립트는 객체지향 언어이다. number, string, boolean, null, undefined 같은 다섯 종류의 원시 데이터 타입만이 객체가 아니다. 이 중 number, string, boolean 타입은 객체의 표현과 동일한 primitive wrapper를 가진다. 이 원시 데이터 타입 값들은 개발자 또는 내부적인 자바스크립트 인터프리터에 의해 쉽게 객체로 변환된다.

함수 또한 객체다.

어떤 변수 또한 객체다. 변수는 자동으로 Activation Object라 불리는 내부적인 객체의 프로퍼티가 된다(전역 변수인 경우에는 전역 객체의 프로퍼티가 된다). 또한 이 변수는 자신만의 프로퍼티(attribute라고도한다)를 가지기 때문에 실제로 객체와 비슷하다. 이 attribute 값에 따라 해당 변수가 수정되거나 삭제될 수 있는지, 열거 될 수 있는지 등의 여부가 결정된다.

그럼 객체란 무엇일까? 간단하다. 객체는 단지 이름이 지정된 프로퍼티의 모음이며, key-value 쌍으로 이뤄진 목록이다. 객체의 프로퍼티가 함수일 경우 이를 메서드라고 부른다.

클래스가 없다.

ES6에 소개된 Class는 사실상 진짜 Class가 아니라 함수이며, 마치 다른 언어의 Class처럼 사용할 수 있게 문법적으로 추가된 것 뿐이다. 이런 것을 Syntax Sugar라고 부르는 것 같다.

프로토타입

ES6이전에 상속을 구현할 때 prototype을 사용했다. prototype은 하나의 객체이며, 사용자가 생성한 모든 함수는 새로운 빈 객체를 가리키는 prototype 프로퍼티를 가진다. prototype 객체의 contructor 프로퍼티가 가리키는 것은 사용자가 생성한 함수이다. 사용자는 이 빈 객체에 멤버를 추가할 수 있고, 상속을 통해 다른 객체가 이 객체의 프로퍼티를 자기 것처럼 쓰게 만들 수 있다.

first-class object

첫 장에 first-class object가 언급되어있어서 정리하고 넘어간다. 함수가 first class object 인게 뭐가 그리 중요할까? 2-3년 쯤에 한참 유행했던 면접문제였다.

자바스크립트는 독특한 언어이다. 클래스가 없고, 함수는 first class object로 다양한 작업에 사용된다.

first class object(일급객체)는 다음과 같은 특징을 가지는 객체이다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 인자로 전달할 수 있다.
  • return 값으로 사용할 수 있다.
  • 런타임에 생성할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유하게 식별할 수 있다.

앞에 3개는 이해하기가 쉬운데, 뒤의 2개는 정확히 감이 오지 않는다. capturing과 memoization 얘기까지 나오던데 다시 공부해서 올려야 겠다…

참고로 first class object는 JavaScript에만 있는 개념은 아니다. first class function 참고!