이 글은 자바스크립트 개론(Eloquent JavaScript 번역서)를 읽고 개인적으로 정리한 내용입니다.

4. 오류 처리

코드 상의 오류

  • 자바스크립트에서는 함수에 인자를 더 적게 전달하더라도 에러가 나지 않고 undefined이 전달될 뿐이다. 그리고 undefined이 담긴 매개변수로 수식 연산을 한다고 해도 오류가 발생되지 않고 결과는 NaN이 된다. 
  • 반면 오류를 인식하는 경우도 있다. 예로 undefined에서 프로퍼티를 읽으려 하거나 존재하지 않는 함수를 호출할 때 자바스크립트는 오류임을 알린다.

외부 입력에 의한 오류

  • 보통 사용자의 입력에 의해 일어나며 유효성 검증을 통해 무엇이 잘못되었는지 알려야 한다.

값을 반환하여 오류처리

  • 예로 정상적으로 동작할 때 문자열을 반환하는 함수는 잘못된 인자가 전달될 경우에 undefined을 반환하도록 할 수 있다.
  • 하지만 이 방법은 모든 타입의 값을 반환할 수 있는 함수라면, 어떤 값이 반환됐을 때 오류가 발생한 것인지 구별하기 어렵다.
  • 또 함수를 호출하는 모든 곳에서 오류 검사 코드를 작성해야 하는 단점도 있다.

예외 처리

  • 예외를 발생시키게(던지게) 되면 현재 실행 흐름에서 벗어나는 것과 동시에 함수가 호출되면서 쌓여있던 호출 스택을 풀어버린다.
  • try 문은 예외가 발생했을 때 호출 스택이 모두 풀어지지 않게 오류가 발생하는 지점을 감싼다.
  • catch문은 try에서 발생한 예외를 잡아서 처리한다.
  • finally문은 예외 발생여부와 관계없이 실행되어야 하는 코드를 작성할 수 있다.
function sum(a, b) {
    if(typeof a != 'number' || typeof b != 'number') {
        throw '숫자를 전달하세요.';
    } else {
        return a + b;
    }
}

function callSum(a, b) {
    return sum(a, b);
}

try {
    callSum(1, '1');
} catch (error) {
    console.log('에러 발생', error);
} finally {
    console.log('언제나 실행');
}

오류 객체

  • new 키워드와 Error 생성자를 이용하여 자바스크립트의 기본 에러 메시지와 비슷한 메시지를 출력할 수 있다.
try {
    throw new Error('custom error object');
} catch (e) {
    console.log(e.message); // 'custom error object'
}


이 글은 자바스크립트 개론(Eloquent JavaScript 번역서)를 읽고 개인적으로 정리한 내용입니다.

3. 객체와 배열

1. 프로퍼티

  • 자바스크립트의 어떤 값은 그 값과 관련된 다른 값을 갖기도 하는데, 이것을 프로퍼티라고 한다.
  • 예로 문자열 값에는 length라는 문자열의 크기를 나타내는 프로퍼티가 있다.

2. 객체

  • 문자열과 같은 값은 프로퍼티를 추가하거나 수정하는 것에는 제한적이다. 예로 문자열의 크기를 나타내는 length 프로퍼티는 변경할 수 없다.
  • 객체는 자유롭게 프로퍼티를 추가, 수정, 제거를 할 수 있다.
  • 객체의 프로퍼티에 접근하는 방법은 두 가지가 있다.
var object = { name: 'gyun' };
object['name'] // 'gyun'
object.name // 'gyun'
  • 대괄호를 이용한 방법은 대괄호 안에 표현식을 넣어 접근할 수도 있다.
var s = 'name';
object[s] // 'gyun'

3. 객체 비교

  • 숫자, 불린, 문자열 값은 같은 타입의 값을 비교하면 정확한 결과를 얻을 수 있다.
120 == 120 // true
true == true // true
'str' == 'str' // true
  • 두 객체에 == 연산자를 적용하면 생각했던 것과 다른 결과가 나올 수 있다.
var object1 = {name: 'gyun'};
var object2 = object1;
object1 == object2 // true

var object3 = {name: 'gyun'};
object1 == object3 // false
  • var object2 = object1에서는 {name: 'gyun'} 객체가 담기는 것이 아니라 object1의 주소값이 object2에 담긴다. object1object2의 주소값이 같기 때문에 object1 == object2true를 반환한다.
  • object3object1와 프로퍼티, 프로퍼티 값이 같지만 새로운 객체의 주소값이 담긴다. 따라서 object1 == object3false를 반환한다.

4. 배열

  • 객체에 저장된 모든 프로퍼티를 처음부터 끝까지 접근하기 좋게 만든 것이 배열이다.
  • 자바스크립트의 배열은 객체의 일종이다.

5. 메소드

  • 함수를 담고 있는 프로퍼티를 메소드라고 한다.

6. 날짜

  • 객체를 생성하는 방법에는 중괄호({ })말고도 new키워드와 생성자 함수를 이용한 방법도 있다.
  • Date는 자바스크립트에서 날짜 데이터를 다루기 위해 사용되는 생성자 함수다.
new Date() // 현재 시간의 날짜 객체 생성
new Date(2017, 11, 25) // 2017년 11월 25일의 날짜 객체 생성
  • Date 생성자 함수에는 년, 월, 일, 시, 분, 초, 밀리초 순서로 인자를 넘길 수 있다.
  • 날짜 객체는 <, >, <=, >=로 정확하게 날짜의 늦고 빠름을 정확하게 비교할 수 있지만, ==은 객체처럼 비교하기 때문에 정확한 결과를 얻을 수 없다.
  • 날짜가 같은지 비교할 때는 1970년 1월 1일부터 경과된 밀리초를 정수로 반환하는 getTime 메서드를 사용하면 된다.
var d1 = new Date(2017, 11, 25);
var d2 = new Date(2017, 11, 25);

d1 == d2 // false
d1.getTime() == d2.getTime() // true

7. 인자

  • 함수가 호출될 때마다 arguments라는 특별한 변수가 함수가 실행되는 환경에 담긴다.
  • arguments는 함수로 전달되는 모든 인자를 프로퍼티 0부터 순서대로 저장하는 것, 인자의 개수가 length 프로퍼티에 담기는 것을 봤을 때 배열이라고 생각할 수도 있다.
  • 하지만 arguments는 배열이 아니라 객체이고, 배열처럼 push, forEach와 같은 메서드를 사용할 수 없다.


이 글은 자바스크립트 개론(Eloquent JavaScript 번역서)을 읽고 개인적으로 정리한 내용입니다.


2. 함수

1. 선언

  • 프로그램이 실행되기 전에 함수 선언은 미리 저장된다.
  • 프로그램이 실행될 때 함수 선언문이 나오지 않았더라도 먼저 호출할 수 있으며, 먼저 선언된 함수가 나중에 선언된 함수를 호출하는 것도 가능하다.

2. 유효범위(Scope)

  • 함수의 인자(parameter)와 함수 안에서 var 키워드로 선언된 변수는 그 함수 안에서만 유효하다. 함수 실행이 완료되면 인자, 변수는 사라진다.
  • 함수가 중첩된 경우 내부 함수안에서 선언된 변수 이름과 외부 함수에서 선언된 변수 이름이 같아도, 내부 함수의 변수를 변경하여도 외부 함수의 변수에 영향을 미치지 않는다.
  • 함수 안에서 같은 이름의 변수를 선언하지 않았으면, 외부 함수나 전역 변수에 접근하는 것이 가능하다.
  • 함수의 스코프는 프로그램 소스코드 상에서의 위치에 따라 결정되며, 이것을 어휘적 스코프(lexical scope)라고 한다.

호출 스택

  • 새로운 함수가 호출되고 그 함수의 실행이 종료되면 원래 프로그램이 실행되던 지점으로 돌아갈 필요가 있다. 기존의 실행지점에 대한 정보를 문맥(Context)이라고 하며 이것은 스택(Stack)에 쌓인다.

값으로서의 함수

  • 자바스크립트에서는 함수도 ‘값’에 속해서 함수 이름을 변수처럼 쓰거나 함수를 다른 함수에 전달하거나 함수를 반환하는 함수를 작성할 수도 있다.

클로저

  • 함수가 함수를 반환하고, 반환되는 함수에서 함수가 속한 함수의 지역변수를 반환할 때 외부 함수의 실행이 종료되서 호출스택에서 사라져도 지역변수는 유지된다.
  • 이 현상을 닫힘(closure)라고 하며, 남아있는 변수에 접근하는 함수를 클로저(closure)라고 한다.

인자

  • 선언된 매개변수(parameter)보다 더 적은 인자(argument)를 넘겨주면 남는 매개변수(parameter)는 undefined가 된다.
  • 선언된 매개변수(parameter)보다 더 많은 인자(argument)를 넘겨주면 남는 인자(argument)는 무시된다.

함수 작성 원칙

  • 함수가 발명된 이유는 코드의 재사용이다.
  • 함수를 사용하지 않고, 동일한 로직이 반복된다면 코드가 길어져서 읽기가 힘들어지고, 코드를 수정할 때 일일이 다 찾아야 하기 때문에 유지보수가 어려워진다.
  • 함수는 되도록 한 개의 기능만 수행해야 여러 상황에서 사용되기 좋다.
  • 확실하게 필요하다고 판단하지 않은 기발한 기능은 되도록 함수에 추가하지 않는 것이 좋다.

순수 함수

  • 순수 함수란 동일한 인자를 전달하면 항상 같은 값을 반환하는 함수를 말한다.
  • 순수 함수는 함수 호출만으로 해당 함수가 의도대로 동작하는지 확인할 수 있기 떄문에 테스트하기 좋다.
  • 순수하지 않은 함수는 온갖 외부 요인에 따라 함수의 결과값이 바뀌기 때문에, 해당 함수만을 호출하여 의도대로 동작하는지 확인하기 힘들다.
  • 순수 함수는 순수하지 않은 함수의 기능을 대체하기 힘들기 때문에 순수하지 않은 함수를 작성하는 것을 꺼려하지 말되, 되도록 순수한 함수를 작성하도록 하자.

재귀(Recursive)

  • 재귀란 함수 자기 자신을 호출하는 것을 말한다.
  • 재귀를 통해 반복문을 대체할 수 있지만 재귀는 반복문보다 10배정도 느리며, 재귀 호출을 하는 횟수가 많아지면 호출 스택이 넘치는 현상이 발생할 수 있다.


+ Recent posts