2015년 11월 23일 월요일

이펙티브 자바스크립트, Effective JavaScript

이펙티브 자바스크립트
데이비드 허먼 저/김준기 역 | 인사이트(insight) | 원서 : Effective JavaScript
http://www.yes24.com/24/goods/9375384?scode=032




JavaScript에 대한 이해가 깊지 않아 아직 코딩이 미숙하다.

JavaScript 기본 문법만 공부한지라 변수의 scope이나 클로저 등 좀 더 필수 적인 부분을 모르는 상태에서 코딩을 하고 있는지라 코드를 보면 참 안습이다. 그래서 좀 더 자세한 JavaScript 책을 찾던 차에 동료가 보고 있던 책이 눈에 들어왔다.

한가지 이유는 제목이 참 익숙해서 였다. 그리고 함께 마이어스아저씨가 생각 나며 괜찮겠다라는 생각과 동시에 Effective Java에서의 아쉬웠던 기억이 문득 머리를 스쳤지만 뭐... JavaScript 왕초보인 나에게는 큰 도움이 될 것으로 생각 했다.

막상 읽어 보니 초중급 책들에서 슬쩍 대충 다루는 좀 막연한 상황들을 저자의 경험을 통해 잘 찝어 내어 설명해주는 것 같다. 하지만 아직 내가 모든 항목들을 이해하기는 쉽지 않는 상태라 JavaScript 기본 문법은 이해를 한 상태에서 좀 코드를 짜본 경험이 있으면 아쉬운 부분에 대한 정답과 이해가 쉬울 것으로 보인다.

그리고 이 책 다보고 아래 책들도 한번 찾아보련다....
http://www.yes24.com/24/Category/Series/001001003016003010?SeriesNumber=184582


목차는 다음과 같다. 뭐 Effective 시리즈는 제목이 정답이니...

1장 자바스크립트에 익숙해지기
__아이템 1 어떤 자바스크립트를 사용하고 있는지 알아야 한다
__아이템 2 자바스크립트의 부동 소수점 숫자 이해하기
__아이템 3 암묵적인 형변환을 주의하라
__아이템 4 객체 래퍼보다 원시 데이터형을 우선시하라
__아이템 5 혼합된 데이터형을 ==로 비교하지 마라
__아이템 6 세미콜론 삽입의 한계에 대해서 알아두자
__아이템 7 문자열을 16비트 코드 단위의 시퀀스로 간주하라

2장 변수 스코프
__아이템 8 전역 객체의 사용을 최소화하라
__아이템 9 항상 지역 변수를 선언하라
__아이템 10 with를 사용하지 마라
__아이템 11 클로저에 익숙해져라
__아이템 12 변수 호이스팅에 대해 이해하라
__아이템 13 지역 변수 스코프를 만들기 위해 즉시 실행 함수 표현식을 사용하라
__아이템 14 기명 함수 표현식의 스코프에 주의하라
__아이템 15 블록-지역 함수 선언문의 스코프에 주의하라
__아이템 16 eval을 이용해 지역 변수를 생성하지 마라
__아이템 17 직접적인 eval보다 간접적인 eval을 사용하라

3장 함수 사용하기
__아이템 19 함수, 메서드, 생성자 호출의 차이를 이해하라
__아이템 20 고차 함수에 익숙해져라
__아이템 21 지정된 수신자 객체로 함수를 호출하기 위해 call 메서드를 사용하라
__아이템 22 다른 개수의 인자로 함수를 호출하기 위해 apply를 사용하라
__아이템 23 가변 인자 함수를 생성하기 위해 arguments를 사용하라
__아이템 24 절대 arguments 객체를 수정하지 마라
__아이템 25 자바스크립트의 부동 소수점 숫자 이해하기
__아이템 26 고정된 수신자 객체로 메서드를 추출하기 위해 bind를 사용하라
__아이템 27 커링 함수에 bind를 사용하라
__아이템 28 코드를 캡슐화하기 위해 문자열보다 클로저를 사용하라
__아이템 29 함수의 toString 메서드에 의존하지 마라
__아이템 30 비표준 스택 검사 프로퍼티를 사용하지 마라

4장 객체와 프로토타입
__아이템 31 __proto__보다 Object.getPrototypeOf를 사용하라
__아이템 32 __proto__를 절대 수정하지 마라
__아이템 33 생성자가 new와 관계 없이 동작하게 만들어라
__아이템 34 메서드를 프로토타입에 저장하라
__아이템 35 비공개 데이터를 저장하기 위해 클로저를 사용하라
__아이템 36 인스턴스의 상태는 인스턴스 객체에만 저장하라
__아이템 37 this의 명시적인 바인딩에 대해 이해하라
__아이템 38 서브 클래스 생성자에서 수퍼 클래스 생성자를 호출하라
__아이템 39 수퍼 클래스 프로퍼티 이름을 절대 재사용하지 마라
__아이템 40 표준 클래스를 상속하지 마라
__아이템 41 프로토타입을 세부 구현 사항처럼 처리하라
__아이템 42 무모한 몽키 패칭을 하지 마라

5장 배열과 딕셔너리
__아이템 43 직접적인 객체의 인스턴스로 가벼운 딕셔너리를 만들어라
__아이템 44 프로토타입 오염을 막기 위해 null 프로토타입을 사용하라
__아이템 45 프로토타입 오염을 막기 위해 asOwnProperty를 사용하라
__아이템 46 순서가 정해진 컬렉션에는 딕셔너리 대신 배열을 사용하라
__아이템 47 Object.prototype에 열거 가능한 프로퍼티를 절대 추가하지 마라
__아이템 48 열거하는 동안 객체를 수정하지 마라
__아이템 49 배열을 반복할 때 for...in 대신 for 반복문을 사용하라
__아이템 50 반복문 대신 반복 메서드를 사용하라
__아이템 51 유사 배열 객체에 범용적인 배열 메서드를 재사용하라
__아이템 52 Array 생성자 대신 배열 리터럴을 사용하라

6장 라이브러리와 API 설계
__아이템 53 일관된 컨벤션을 유지하라
__아이템 54 undefined를 ‘값 이 없는’ 것처럼 처리하라
__아이템 55 키워드 인자를 위해 옵션 객체를 받아들여라
__아이템 56 불필요한 상태 유지를 피하라
__아이템 57 유연한 인터페이스를 위해 구조화된 형식을 사용하라
__아이템 58 배열과 유사 배열 객체를 구별하라
__아이템 59 과도한 강제 형변환을 피하라
__아이템 60 메서드 체이닝을 지원하라

7장 동시성
__아이템 61 이벤트 큐를 I/O에 블로킹시키지 마라
__아이템 62 비동기 시퀀스를 위해 감싸지거나 이름이 지정된 콜백을 사용하라
__아이템 63 오류를 놓치지 않도록 조심하라
__아이템 64 비동기적인 반복문을 위해 재귀를 사용하라
__아이템 65 계산 중 이벤트 큐를 블로킹하지 마라
__아이템 66 동시성 연산을 수행하기 위해 카운터를 사용하라
__아이템 67 비동기 콜백을 절대 동기적으로 호출하지 마라
__아이템 68 더 깔끔한 비동기 로직을 위해 promise를 사용하라
 


아래는 책을 보다 알게 된 내용들을 아주 일부만 발췌하였고
이 책은 빌려봤는데 직접 사서 두고 봐야 모두 이해할 수 있겠고
나중에 개발을 하면서 참고용으로도 좋을 것 같다.


- 좌측 결합성(left-associative)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence


- NaN(IEEE 부동 소수점 표준에 따른 역설적인 이름 'not a number')값을 테스트하기는 특히나 어렵다.

var x = NaN;
x === NaN; // false

- 암묵적인 강제 형변환으로는 데이터 형이 실제로 주어지지 않는다.
자바스크립트는 보이지 않게 valueOf 메서드를 (먼저) 실행한 후 toString을 실행하여 이런 불확실함을 해소 함

- false로 처리되는 값은 false, 0, -0, "", NaN, null, undefined

- 선언문에서 세미콜론을 생략하려면 현재 파일의 다음 토큰뿐만 아니라 스크립트 병합으로 인해 따라올 수 있는 다른 토큰도 함께 고려해야한다.

// a.js
; (function() {
//
})()
// b.js
; (function() {
//
})()

- 클로저가 외부 변수의 값을 변경할 수 있다는 점이다. 클로저는 실제로 외부 변수의 값을 복사하지 않고 참조를 저장한다.

http://www.slideshare.net/duggj/javascript-the-good-parts-43716401
Closures
Closures are functions that refer to independent (free) variables.
In other words, the function defined in the cl...

- 자바스크립트는 암묵적으로 둘러싼 함수의 맨 윗부분으로 선언을 끌어올리고(호이스팅) 할당 부분은 그 자리에 그대로 둔다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting

http://www.slideshare.net/duggj/javascript-the-good-parts-43716401
Hoisting
 Variable declarations hoisted to top of function (top of scope)
 Function statements also hoisted
(function ()...

- 지역 변수 스코프를 만들기 위해 즉시 실행 함수 표현식을 사용하라

바인딩과 할당의 차이점을 이해해야 한다. ... 변수들을 바인딩하기 위해 메모리에 '슬롯'을 할당한다. ... 반복문의 본문은 감싸는 함수를 위한 클로저를 할당한다. ... 감싸진 함수가 생성되는 시점에 그 함수가 i의 값을 저장하고 있다고 기대 ... 사실은 i로의 참조를 포함할 뿐이다. ... 클로저는 외부 변수의 값이 아니라 참조를 저장한다.

- 어떤 실행 환경에서도 올바르게 동작하는 함수를 작성하기 위한 최선의 방법은 함수 선언문을 지역 블록이나 하위 명령에 절대 두지 않는 것이다. ... 함수를 조건에 따라 선택할 필요가 있다면 최선의 방법은 var 선언문과 함수 표현식을 사용하는 것이다.

- obj.hello() 표현식은 obj의 hello 프로퍼티를 찾고 수신자 객체 obj로 호출한다.

- apply 메서드는 인자의 배열을 받아 그 배열의 각 요소가 개별 인자 인 것처럼 함수를 호출한다. 인자의 배열 뿐만 아니라, ... 첫 번째 인자로 함수가 호출될 this의 바인딩을 명시할 수 있다.

- arguments 객체는 실제 인자의 배열과 비슷한 인터페이스를 제공한다. ... 이를 이용하면 arguments 객체의 각 요소를 순회하여 가변 인자 average 함수를 표현할 수 있다.

- prototype, getPrototypeOf, __proto__의 차이점을 이해하라.
. C.prototype은 new C()로 생성된 객체의 프로토타입을 만드는 데 사용된다.
. Object.getPrototypeOf(obj)는 obj의 프로토타입 객체를 가져오기 위한 표준 ES5 매커니즘이다.
. obj.__proto__는 obj의 프로토타입 객체를 가져오는 비표준 메커니즘이다.

- 비공개 데이터를 저장하기 위해 클로저를 사용하라.

- 인스턴스의 상태는 인스턴스 객체에만 저장하라.
. 수정 가능한 데이터는 공유 시 문제의 소지가 있으며, 프로토타입은 모든 인스턴스간에 공유된다.
. 각 인스턴스의 수정 가능한 상태 값은 인스턴스 객체에 저장하라.

- 객체를 열거하는 도중 새로운 프로퍼티가 이 객체에 추가된다면, 새롭게 추가된 프로퍼티는 현재 열거에 포함됨을 보장하지 않는다.

- for...in 반복문은 항상 키를 열거한다. ... 전통적인 for 반목문을 사용 ... 필요한 정수형 인덱스와 배열 요소를 얻을 수 있고 ... 기대하지 않은 문자열로의 강제 형변환도 발생시키지 않음을 보장해 준다. 게다가, 적절한 순서로 반복이 진행되며 배열 객체나 프로토타입에 저장된 정수가 아닌 프로퍼티를 우연히 포함하지 않음을 보장한다.

- Array 생성자 대신 배열 리터럴을 사용하라.
: 리터럴은 배열을 표현하기 위한 아주 매력적인 방법이다.

2015년 11월 1일 일요일

Tizen SDK 사용 시 사소한 문제점에 대한 해결 방법들 및 팁

Tizen SDK는 계속 업데이트 되므로 아래 내용이 최신 SDK와 맞지 않을 수 있습니다.
아래 링크를 꼭 참고하세요.
https://developer.tizen.org/fr/community/tip-tech/trouble-shooting-certification
 
- 빌드 및 실행 시 아래 에러가 발생하면 

"An internal error occurred during: "Launching xxxxx - Debug (12)". 
Unknown character property name {o} near index 5
res\po\.*?.po
     ^
> 단말내 앱을 지우고 다시 설치하고 시도.
> 만약 EDC 기반 app이라면 EDC 파일을 선택하여 개별 빌드 해보고 오류가 없는지 확인 필요.


- TPK 생성 시 Certificate 복사 실패 

> Linux Tizen SDK로 빌드한 프로젝트를 Window Tizen SDK에서 빌드하여 TPK 생성하는 경우이고 certificate를 복사할 수 없다는 에러가 뜬다면 프로젝트 폴더내 .sign 폴더를 삭제하고 다시 빌드 및 설치 하라.


- 빌드 시 elf 관련 에러 발생 시

> 빌드 시 단말이 선택 되어 있는지 확인하고 제대로 선택되어 있다면 target architecture를 확인하라. Project Properties > C/C++ Build > Tizen Settings > Platform > Architecture


- 빌드 후 단말로 설치 시 transfer 관련 error가 발생하면

> 혹시 개발용 안드로이드폰이 usb로 연결되어 있으면 빼고 다시 시도해보길.

- edc 파일 컴파일 시 이미지 못찾는다는 에러 나올 때

> 윈도우 SDK를 사용 중이라면 edc 파일에서 마우스 우클릭 > Properties > C/C++ Build >
   Settings > Tool Settings > EDC Resource Compiler > misc > Image Path 가
   image가 있는 폴더를 가리키는 지 확인하라.
   보통 res/images에 image들을 저장하고 사용할텐데
   windows SDK에서는 edje/images 를 가리키고 있음.

- native project에서 JSON parsing 해야 할 때

> cJSON 추천 ㅈㄹ 간편하다. http://sourceforge.net/projects/cjson/


- C++ std library header들을 못 찾는다고 나올 때 

> 혹시 c 구현부에서 에러가 나는 C++ 구현부의 header를 include하는 곳이 없는지 확인해라.
> 그래도 안되면 환경 문제일 가능성 농후..


- 단말에서 project 실행 시 temporary하게 install/uninstall을 못하는 경우

> 단말에 맞는 certificate을 받아서 등록하고 단말 대상을 permit 했는지 확인하라.
https://www.youtube.com/watch?v=Xy2B-nlnprg&feature=youtu.be&t=2m10s


- Tizen 2.3 기반 app을 Tizen 2.4 SDK에서 빌드할 경우 .project에 2.4용 설정들이 포함되어 다시 Tizen 2.3 SDK에서 빌드를 못할 수 있음.

> repository의 history를 보고 rollback하거나 2.3 project를 새로 생성해서 하나하나 옮긴다.