From 53fdafc23bbf96bd8636807b76bb2bd9b35acc79 Mon Sep 17 00:00:00 2001 From: sehyun Date: Mon, 29 Jan 2024 13:11:21 +0900 Subject: [PATCH] =?UTF-8?q?docs:=2029,=2047=EC=9E=A5=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\353\202\230\354\204\270\355\230\204.md" | 102 ++++++++++++++++++ .../\353\202\230\354\204\270\355\230\204.md" | 89 +++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 "docs/29_Math/\353\202\230\354\204\270\355\230\204.md" create mode 100644 "docs/47_\354\227\220\353\237\254 \354\262\230\353\246\254/\353\202\230\354\204\270\355\230\204.md" diff --git "a/docs/29_Math/\353\202\230\354\204\270\355\230\204.md" "b/docs/29_Math/\353\202\230\354\204\270\355\230\204.md" new file mode 100644 index 00000000..825809d5 --- /dev/null +++ "b/docs/29_Math/\353\202\230\354\204\270\355\230\204.md" @@ -0,0 +1,102 @@ +## 29장 `Math` + +표준 빌트인 객체인 `Math`는 수학적인 상수와 함수를 위한 프로퍼티와 메서드를 제공하며, 생성자 함수가 아니기 때문에 정적 프로퍼티와 정적 메서드만 제공한다. + +### 📍 29.1: `Math` 프로퍼티 + +#### `Math.PI` + +원주율 파이 값을 반환한다. + +### 📍 29.2: `Math` 메서드 + +#### `Math.abs` + +인수로 전달된 숫자의 절대값을 반환한다. + +```javascript +Math.abs(-1); // 1 +Math.abs('-1'); // 1 +Math.abs(''); // 0 +Math.abs([]); // 0 +Math.abs(null); // 0 +Math.abs(undefined); // NaN +Math.abs({}); // NaN +Math.abs('string'); // NaN +Math.abs(); // NaN +``` + +#### `Math.round` + +인수로 전달된 숫자의 소수점 이하를 반올림한 정수를 반환한다. + +```javascript +Math.round(1.4); // 1 +Math.round(); // NaN +``` + +#### `Math.ceil` + +인수로 전달된 숫자의 소수점 이하를 올림한 정수를 반환한다. + +```javascript +Math.ceil(1.4); // 2 +Math.ceil(-1.4); // -1 +Math.ceil(); // NaN +``` + +#### `Math.floor` + +인수로 전달된 숫자의 소수점 이하를 내림한 정수를 반환한다. + +```javascript +Math.floor(1.9); // 1 +Math.floor(-1.9); // -2 +Math.floor(); // NaN +``` + +#### `Math.sqrt` + +인수로 전달된 숫자의 제곱근을 반환한다. + +```javascript +Math.sqrt(9); // 3 +Math.sqrt(-9); // NaN +Math.sqrt(); // NaN +``` + +#### `Math.random` + +0에서 1 미만의 실수인 임의의 난수를 반환한다. + +#### `Math.pow` + +첫번째 인수를 밑으로, 두번째 인수를 지수로 거듭제곱한 결과를 반환한다. +ES7에서 도입된 지수 연산자를 대신 사용하면 가독성이 더 좋다. + +```javascript +Math.pow(2, 8); // 256 +Math.pow(); // NaN + +2 ** (2 ** 2); // 16 +Math.pow(Math.pow(2, 2), 2); // 16 +``` + +#### `Math.max` + +전달받은 인수 중에서 가장 큰 수를 반환한다. +인수가 전달되지 않으면 `-Infinity`를 반환한다. + +```javascript +Math.max(1, 2, 3); // 3 +Math.max(); // -Infinity +``` + +#### Math.min + +전달받은 인수 중에서 가장 작은 수를 반환하며, 인수가 전달되지 않으면 `Infinity`를 반환한다. + +```javascript +Math.min(1, 2, 3); // 1 +Math.min(); // Infinity +``` diff --git "a/docs/47_\354\227\220\353\237\254 \354\262\230\353\246\254/\353\202\230\354\204\270\355\230\204.md" "b/docs/47_\354\227\220\353\237\254 \354\262\230\353\246\254/\353\202\230\354\204\270\355\230\204.md" new file mode 100644 index 00000000..fb88adb3 --- /dev/null +++ "b/docs/47_\354\227\220\353\237\254 \354\262\230\353\246\254/\353\202\230\354\204\270\355\230\204.md" @@ -0,0 +1,89 @@ +## 47장 에러 처리 + +### 📍 47.1: 에러 처리의 필요성 + +발생한 에러에 대해 대처하지 않고 방치하면 프로그램은 강제 종료된다. +`try ... catch`문을 사용해 발생한 에러에 적절하게 대응하면 프로그램이 강제 종료되지 않고 계속해서 코드를 실행시킬 수 있다. +직접적으로 에러를 발생시키지 않는 예외적인 상황(`null` 반환 등)이 발생할 수도 있다. +이런 예외적인 상황에 적절하게 대응하지 않으면 에러로 이어질 가능성이 크다. + +### 📍 47.2: `try ... catch ... finally`문 + +기본적으로 에러 처리를 구현하는 방법은 두 가지가 있다. + +1. `querySelector`나 `Array#find` 메서드처럼 예외적인 상황이 발생하면 반환하는 값(`null` 또는 `-1`)을 `if`문이나 단축 평가, 옵셔널 체이닝 연산자를 통해 확인해서 처리하는 방법 +2. 에러 처리 코드를 미리 등록해 두고 에러가 발생하면 에러 처리 코드로 점프하도록 하는 방법 + +`try ... catch ... finally`문은 두번째 방법이고, 일반적으로 이 방법을 에러 처리라고 한다. +`finally`문은 불필요하다면 생략한다. + +```javascript +try { + // 실행할 코드 (에러가 발생할 가능성이 있는 코드) +} catch (err) { + // try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행됨 + // err에는 try 코드 블록에서 발생한 Error 객체가 전달됨 +} finally { + // 에러 발생과 상관없이 반드시 한 번 실행됨 +} +``` + +### 📍 47.3: `Error` 객체 + +`Error` 생성자 함수는 에러 객체를 생성하며, 에러를 상세히 설명하는 에러 메시지를 인수로 전달할 수 있다. + +```javascript +const error = new Error('invalid'); +``` + +`Error` 생성자 함수가 생성한 에러 객체는 `message`와 `stack` 프로퍼티를 갖는다. + +- `message`: `Error` 생성자 함수에 인수로 전달한 에러 메시지 +- `stack`: 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용 + +자바스크립트는 `Error` 생성자 함수를 포함해 7가지의 에러 객체를 생성할 수 있는 `Error` 생성자 함수를 제공한다. (`SyntaxError`, `ReferenceError`, `TypeError`, `RangeError`, `URIError`, `EvalError`) +이 생성자 함수가 생성한 에러 객체의 프로토타입은 모두 `Error.prototype`을 상속받는다. + +### 📍 47.4: `throw`문 + +`Error` 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다. +에러를 발생시키려면 `try` 코드 블록에서 `throw`문으로 에러를 던져야 한다. + +```javascript +try { + throw new Error("something's wrong"); +} catch (err) { + console.log(err); +} +``` + +### 📍 47.5: 에러의 전파 + +**에러는 호출자 방향으로 전파된다.** +즉, 콜 스택의 아래 방향(실행 중인 실행 컨텍스트가 푸시되기 직전에 푸시된 실행 컨텍스트 방향)으로 전파된다. + +```javascript +const foo = () => { + throw new Error('foo에서 발생한 에러'); +}; + +const bar = () => { + foo(); +}; + +const baz = () => { + bar(); +}; + +try { + baz(); +} catch (err) { + console.log(err); +} +``` + +`baz` 함수를 호출한 결과로 `foo` 함수가 `throw`한 에러는 `foo` 실행 컨텍스트 - `bar` 실행 컨텍스트 - `baz` 실행 컨텍스트 - 전역 실행 컨텍스트를 순서대로 거쳐 전파되어 전역에서 캐치된다. + +주의할 점은 비동기 함수인 `setTimeout`이나 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다는 것이다. +`setTimeout`이나 프로미스 후속 처리 메서드의 콜백 함수는 태스크 큐나 마이크로태스크 큐에 일시 저장되었다가 콜 스택이 비면 이벤트 루프에 의해 콜 스택으로 푸시되어 실행된다. +이때 콜 스택에 푸시된 콜백 함수의 실행 컨텍스트는 콜 스택의 가장 하부에 존재하게 되므로 에러를 전파할 호출자가 존재하지 않는다.