2025-01-26T02:15:33

This commit is contained in:
2025-01-26 02:15:33 +09:00
parent f43f6328c0
commit f867e689aa
22 changed files with 2702 additions and 213 deletions

433
doc/03_내장_객체.md Normal file
View File

@@ -0,0 +1,433 @@
# 내장 객체
자바스크립트는 프로그래머가 효율적으로 코드를 작성할 수 있도록 다양한 **내장 객체(Built-in Objects)**를 제공합니다. 내장 객체는 브라우저나 Node.js 환경에서 기본적으로 사용할 수 있는 객체이며, 자바스크립트의 기능을 확장하거나 데이터 처리를 간편하게 만들어줍니다.
내장 객체는 크게 **기본 객체(Core Objects)**와 **호스트 객체(Host Objects)**로 나뉩니다.
* 기본 객체: ECMAScript 표준에 정의된 객체로, 모든 환경에서 동일하게 사용 가능.
- 예: Object, Array, String, Math
* 호스트 객체: 실행 환경(브라우저, Node.js 등)에서 제공하는 객체.
- 브라우저 예: window, document, fetch
- Node.js 예: process, fs
## Object 객체
모든 객체의 부모 역할을 하는 최상위 객체입니다. 객체를 생성하거나 조작할 때 사용됩니다.
```javascript
const obj = { name: "Alice", age: 25 };
console.log(Object.keys(obj)); // ["name", "age"]
console.log(Object.values(obj)); // ["Alice", 25]
console.log(Object.entries(obj)); // [["name", "Alice"], ["age", 25]]
```
## Array 객체
배열은 순서가 있는 데이터 리스트를 다루기 위한 객체입니다.
### 메서드
* push(): 배열의 끝에 새로운 요소를 추가합니다.
* pop(): 배열의 마지막 요소를 제거하고 반환합니다.
* shift(): 배열의 첫 번째 요소를 제거하고 반환합니다.
* unshift(): 배열의 처음에 새로운 요소를 추가합니다.
* splice(): 배열의 특정 위치에 요소를 추가, 삭제, 교체합니다.
* slice(): 배열의 일부분을 잘라서 새로운 배열을 반환합니다.
* concat(): 두 개 이상의 배열을 합쳐 새로운 배열을 만듭니다.
* join(): 배열의 모든 요소를 문자열로 연결합니다.
* indexOf(): 배열에서 특정 요소의 인덱스를 찾습니다.
* includes(): 배열에 특정 요소가 포함되어 있는지 확인합니다.
* forEach(): 배열의 모든 요소를 순회하며 함수를 실행합니다.
* map(): 배열의 각 요소를 변환하여 새로운 배열을 생성합니다.
* filter(): 특정 조건을 만족하는 요소만 추출하여 새로운 배열을 생성합니다.
* reduce(): 배열의 모든 요소를 하나의 값으로 축소합니다.
```javascript
const arr = [1, 2, 3, 4];
arr.push(5); // [1, 2, 3, 4, 5]
const squared = arr.map(x => x ** 2); // [1, 4, 9, 16, 25]
console.log(squared);
```
```javascript
let numbers = [1, 2, 3, 4, 5];
// 배열의 길이
console.log(numbers.length); // 5
// 요소 추가
numbers.push(6);
console.log(numbers); // [1, 2, 3, 4, 5, 6]
// 요소 삭제
numbers.splice(2, 1); // 인덱스 2부터 1개 요소 삭제
console.log(numbers); // [1, 2, 4, 5, 6]
// 모든 요소를 더하기
let sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum); // 18
// 짝수만 추출
let evenNumbers = numbers.filter(num => num % 2 === 0);
console.log(evenNumbers); // [2, 4, 6]
```
## String 객체
**문자열(String)**은 텍스트 데이터를 나타내는 자바스크립트의 기본적인 데이터형입니다. 문자열은 작은따옴표(')나 큰따옴표(")로 감싸서 표현합니다.
* 불변성: 한번 생성된 문자열은 변경할 수 없습니다. 새로운 문자열을 만들어 할당해야 합니다.
* 인덱스: 문자열의 각 문자는 0부터 시작하는 숫자로 접근할 수 있는 인덱스를 가집니다.
### 메서드
* slice(): 문자열의 일부분을 추출
* substring(): 문자열의 일부분을 추출 (slice와 유사하지만 음수 인덱스를 지원하지 않음)
* substr(): 문자열의 일부분을 추출 (deprecated)
* replace(): 문자열의 일부분을 다른 문자열로 대체
* trim(): 문자열 양쪽의 공백을 제거
* toLowerCase(): 문자열을 모두 소문자로 변환
* toUpperCase(): 문자열을 모두 대문자로 변환
```javascript
const str = "Hello, World!";
console.log(str.length);
console.log(str.charAt(0));
console.log(str.indexOf("World"));
console.log(str.toUpperCase()); // "HELLO, WORLD!"
console.log(str.slice(0, 5)); // "Hello"
console.log(str.split(", ")); // ["Hello", "World!"]
```
## Number 객체
숫자를 다루기 위한 객체로, 정수와 실수 연산을 지원합니다.
매우 정확한 계산이 필요한 경우에는 BigInt를 사용하거나 별도의 라이브러리를 활용해야 합니다.
### 속성
* Number.MAX_VALUE: JavaScript에서 표현할 수 있는 가장 큰 양수
* Number.MIN_VALUE: JavaScript에서 표현할 수 있는 가장 작은 양수 (0보다 크지만 0에 가장 가까운 수)
* Number.POSITIVE_INFINITY: 양의 무한대
* Number.NEGATIVE_INFINITY: 음의 무한대
* Number.NaN: Not a Number. NaN을 처리할 때는 isNaN() 함수를 사용하는 것이 좋습니다.
* Number.EPSILON: 두 개의 표현 가능한 숫자 사이의 최소 간격
### 메서드
* toFixed(): 소수점 이하 자릿수를 지정하여 반올림한 문자열을 반환합니다.
* toExponential(): 지수 표기법으로 변환합니다.
* toPrecision(): 유효 자릿수를 지정하여 반올림한 문자열을 반환합니다.
* toString(): 숫자를 문자열로 변환합니다.
* parseInt(): 문자열을 정수로 변환합니다.
* parseFloat(): 문자열을 부동소수점 숫자로 변환합니다.
```javascript
const num = 123.456;
console.log(num.toFixed(2)); // "123.46"
console.log(Number.isNaN(NaN)); // true
```
## Boolean 객체
불리언 값을 다룹니다.
```javascript
const bool = new Boolean(false); // 객체 생성 (잘 사용하지 않음)
console.log(bool.valueOf()); // false
```
## Math 객체
수학 계산을 위한 정적 메서드와 속성을 제공합니다.
### 메서드
* Math.abs(x): 숫자 x의 절댓값을 반환합니다.
* Math.ceil(x): x보다 크거나 같은 가장 작은 정수를 반환합니다. (올림)
* Math.floor(x): x보다 작거나 같은 가장 큰 정수를 반환합니다. (버림)
* Math.round(x): x를 반올림하여 정수를 반환합니다.
* Math.random(): 0 이상 1 미만의 난수를 생성합니다.
* Math.max(x, y, ...): 여러 개의 숫자 중 가장 큰 값을 반환합니다.
* Math.min(x, y, ...): 여러 개의 숫자 중 가장 작은 값을 반환합니다.
* Math.pow(x, y): x의 y승을 계산합니다.
* Math.sqrt(x): x의 제곱근을 계산합니다.
* sin(), cos(), tan(), asin(), acos(), atan() 등 : 다양한 삼각함수를 제공합니다.
```javascript
// 원의 넓이 계산
const radius = 5;
const area = Math.PI * radius * radius;
console.log(area); // 78.53981633974483
// 0부터 10 사이의 랜덤 정수 생성
const randomNum = Math.floor(Math.random() * 11);
console.log(randomNum);
// 두 수 중 큰 수 찾기
const maxNumber = Math.max(10, 5, 20);
console.log(maxNumber); // 20
```
## Date 객체
날짜와 시간을 처리하는 데 사용됩니다.
```javascript
// 현재 시각을 나타내는 Date 객체 생성
const now = new Date();
// 특정 날짜를 나타내는 Date 객체 생성
const specificDate = new Date(2023, 11, 25); // 월은 0부터 시작하므로 12월은 11
```
### Date 생성자에 전달할 수 있는 인수:
* 년, 월, 일, 시, 분, 초, 밀리초: 각각의 값을 숫자로 지정하여 날짜를 생성합니다.
* 문자열: ISO 8601 형식의 문자열 또는 자바스크립트에서 이해할 수 있는 다른 날짜/시간 표현식을 사용할 수 있습니다.
* 타임스탬프: 1970년 1월 1일 00:00:00 UTC부터 경과된 밀리초를 나타내는 숫자입니다.
### 메서드
* getFullYear(): 연도를 반환합니다.
* getMonth(): 월을 반환합니다. (0: 1월, 11: 12월)
* getDate(): 일을 반환합니다.
* getDay(): 요일을 반환합니다. (0: 일요일, 6: 토요일)
* getHours(): 시를 반환합니다.
* getMinutes(): 분을 반환합니다.
* getSeconds(): 초를 반환합니다.
* getMilliseconds(): 밀리초를 반환합니다.
* getTime(): 1970년 1월 1일 00:00:00 UTC부터 경과된 밀리초를 반환합니다.
* toDateString(): 날짜를 문자열로 변환합니다.
* toTimeString(): 시간을 문자열로 변환합니다.
* toISOString(): ISO 8601 형식의 문자열로 변환합니다.
* toLocaleString(): 지역 설정에 맞는 문자열로 변환합니다.
```javascript
const now = new Date();
console.log(now.getFullYear()); // 현재 연도
console.log(now.getMonth()); // 현재 월 (0부터 시작)
console.log(now.toISOString()); // ISO 형식의 날짜 문자열
```
* UTC 시간: getUTCXXX() 메서드를 사용하여 UTC 시간을 가져올 수 있습니다.
* 현지 시간: 기본적으로 getXXX() 메서드는 시스템의 현지 시간을 반환합니다.
* 월: 월은 0부터 시작하므로 1월은 0으로 표현합니다.
* 시간대: Date 객체는 시스템의 시간대 설정에 따라 다른 값을 반환할 수 있습니다.
* 타임존 오프셋: getTimezoneOffset() 메서드를 사용하여 UTC와의 시간 차이를 확인할 수 있습니다.
## JSON 객체
JSON(JavaScript Object Notation) 데이터를 다루는 데 사용됩니다.
### 메서드
* JSON.stringify(): 객체를 JSON 문자열로 변환
* JSON.parse(): JSON 문자열을 객체로 변환
```javascript
const obj = { name: "Alice", age: 25 };
const json = JSON.stringify(obj); // '{"name":"Alice","age":25}'
console.log(json);
const parsed = JSON.parse(json);
console.log(parsed.name); // "Alice"
```
## RegExp 객체
정규표현식을 다루는 객체입니다. 문자열 검색과 패턴 매칭에 사용됩니다.
```javascript
let str = "The quick brown fox jumps over the lazy dog.";
let re = /brown/;
// test() 메서드 사용
console.log(re.test(str)); // true
// exec() 메서드 사용
let result = re.exec(str);
console.log(result); // ["brown"]
// replace() 메서드 사용
let newStr = str.replace(re, "red");
console.log(newStr); // The quick red fox jumps over the lazy dog.
```
### 생성
* 리터럴 표기법 : 슬래시(/) 사이에 정규 표현식 패턴을 직접 작성하는 방법입니다. 간단한 패턴을 정의할 때 주로 사용합니다.
```javascript
let re = /pattern/;
```
* 생성자 함수 : RegExp 생성자 함수를 사용하여 정규 표현식을 생성하는 방법입니다. 동적으로 패턴을 생성해야 할 때 유용합니다.
```javascript
let re = new RegExp('pattern');
```
### 메서드
* test(): 주어진 문자열이 정규 표현식과 일치하는지 여부를 반환합니다. (boolean)
* exec(): 주어진 문자열에서 정규 표현식과 일치하는 첫 번째 부분을 배열로 반환합니다.
* match(): 주어진 문자열에서 정규 표현식과 일치하는 모든 부분을 배열로 반환합니다.
* search(): 주어진 문자열에서 정규 표현식과 일치하는 첫 번째 인덱스를 반환합니다.
* replace(): 주어진 문자열에서 정규 표현식과 일치하는 부분을 다른 문자열로 치환합니다.
## Map
키-값 쌍을 저장하는 객체. ES6에서 추가된 데이터 구조로, 보다 효율적인 데이터 관리가 가능합니다.
* 다양한 데이터 타입의 키: 일반 객체는 문자열만 키로 사용할 수 있지만, Map은 문자열뿐만 아니라 숫자, 객체 등 어떤 타입의 데이터든 키로 사용할 수 있습니다.
* 순서 유지: Map은 요소가 추가된 순서를 기억합니다.
* 중복된 키 허용하지 않음: 하나의 키에 대해 여러 개의 값을 저장할 수 없습니다.
* 크기 속성: size 속성을 통해 Map 객체에 저장된 요소의 개수를 쉽게 확인할 수 있습니다.
```javascript
// Map 객체 생성
const myMap = new Map();
// 키-값 쌍 추가
myMap.set('name', '홍길동');
myMap.set(1, '숫자 값');
myMap.set({ a: 1 }, '객체 키');
// 값 가져오기
console.log(myMap.get('name')); // 홍길동
console.log(myMap.get(1)); // 숫자 값
// 키 존재 여부 확인
console.log(myMap.has('name')); // true
// 모든 요소 순회
for (let [key, value] of myMap) {
console.log(key, value);
}
// Map 객체의 크기
console.log(myMap.size);
```
### 메서드
* set(key, value): Map에 새로운 키-값 쌍을 추가합니다.
* get(key): 지정된 키에 해당하는 값을 반환합니다.
* has(key): 지정된 키가 Map에 존재하는지 확인합니다.
* delete(key): 지정된 키와 값을 삭제합니다.
* clear(): Map의 모든 요소를 삭제합니다.
* keys(): 모든 키를 포함하는 Iterator를 반환합니다.
* values(): 모든 값을 포함하는 Iterator를 반환합니다.
* entries(): 모든 키-값 쌍을 포함하는 Iterator를 반환합니다.
## Set
중복되지 않는 값들의 집합. ES6에서 추가된 데이터 구조로, 보다 효율적인 데이터 관리가 가능합니다.
* 중복 허용 X: 같은 값이 여러 번 추가되어도 한 번만 저장됩니다.
* 순서 유지: 값이 추가된 순서대로 유지됩니다.
* 다양한 데이터 타입 지원: 숫자, 문자열, 객체 등 다양한 데이터 타입을 저장할 수 있습니다.
* 크기 속성: size 속성을 통해 Set 객체에 저장된 요소의 개수를 쉽게 확인할 수 있습니다.
```javascript
// 빈 Set 생성
const mySet = new Set();
// 값 추가
mySet.add(1);
mySet.add('hello');
mySet.add(true);
// 중복된 값 추가 시 무시
mySet.add(1); // 이미 존재하므로 추가되지 않음
// 값 존재 여부 확인
console.log(mySet.has(1)); // true
// 값 삭제
mySet.delete(1);
console.log(mySet.has(1)); // false
// 모든 값 순회
for (const value of mySet) {
console.log(value);
}
```
### 메서드
* add(value): Set에 새로운 값을 추가합니다.
* delete(value): Set에서 특정 값을 삭제합니다.
* has(value): Set에 특정 값이 존재하는지 확인합니다.
* clear(): Set의 모든 값을 삭제합니다.
* size: Set의 크기(요소의 개수)를 나타냅니다.
## WeakMap
WeakMap은 Map과 유사하게 키-값 쌍을 저장하는 객체지만, 몇 가지 중요한 차이점이 있습니다.
* 약한 참조: WeakMap의 키는 약한 참조를 가지므로, 더 이상 다른 곳에서 참조되지 않는 키 객체는 가비지 컬렉션의 대상이 됩니다. 즉, 메모리 누수를 방지하는 데 효과적입니다.
* 키 제한: WeakMap의 키는 반드시 객체여야 합니다. 원시 값(숫자, 문자열 등)은 키로 사용할 수 없습니다.
* 크기 속성 없음: WeakMap은 size 속성이 없어 저장된 요소의 개수를 직접 확인할 수 없습니다.
* 순회 불가: WeakMap은 for...of 문과 같은 반복문으로 순회할 수 없습니다.
```javascript
const weakmap = new WeakMap();
const obj = {};
weakmap.set(obj, 'value');
// obj가 더 이상 참조되지 않으면, weakmap에서도 자동으로 삭제됩니다.
```
## WeakSet
WeakSet은 Set과 유사하지만, 값(요소)이 반드시 객체여야 하고 약한 참조를 가진다는 점이 다릅니다.
* 약한 참조: WeakSet의 값은 약한 참조를 가지므로, 더 이상 다른 곳에서 참조되지 않는 값은 가비지 컬렉션의 대상이 됩니다.
* 값 제한: WeakSet의 값은 반드시 객체여야 합니다. 원시 값은 값으로 사용할 수 없습니다.
* 크기 속성 없음: WeakSet은 size 속성이 없어 저장된 요소의 개수를 직접 확인할 수 없습니다.
* 순회 불가: WeakSet은 for...of 문과 같은 반복문으로 순회할 수 없습니다.
```javascript
const weakset = new WeakSet();
const obj1 = {};
const obj2 = {};
weakset.add(obj1);
weakset.add(obj2);
// obj1이 더 이상 참조되지 않으면, weakset에서도 자동으로 삭제됩니다.
```
## Symbol
Symbol 객체는 ES6에서 새롭게 도입된 원시 값(primitive type)으로, 고유한 식별자를 생성하는 데 사용됩니다. 즉, Symbol은 다른 어떤 값과도 절대 일치하지 않는, 유일한 값을 만들어낼 수 있습니다.
* 유일성: 동일한 방법으로 생성된 Symbol이라도 서로 다른 값을 가집니다.
* 변경 불가능: 한번 생성된 Symbol은 변경할 수 없습니다.
* 객체의 프로퍼티 키로 사용: 일반 문자열 키와 달리, Symbol을 키로 사용하면 다른 코드와의 충돌을 방지하고, 객체 내부의 프로퍼티를 더 안전하게 관리할 수 있습니다.
```javascript
const sym1 = Symbol();
const sym2 = Symbol('description'); // description은 설명을 위한 문자열이며, 실제 값에 영향을 주지 않습니다.
```
* Symbol.for(key): 전역 심볼 레지스트리에서 해당 키에 해당하는 심볼을 찾거나, 없으면 새로운 심볼을 생성하고 등록합니다.
* Symbol.keyFor(sym): 전역 심볼 레지스트리에서 주어진 심볼에 해당하는 키를 찾습니다.
## BigInt 객체
BigInt는 자바스크립트에서 아주 큰 정수를 표현하기 위해 도입된 새로운 자료형입니다.
* BigInt 리터럴: 정수 뒤에 n을 붙여 BigInt를 생성합니다.
* BigInt 생성자: BigInt() 함수를 사용하여 숫자나 문자열을 BigInt로 변환합니다.
```javascript
const bigInt = 123456789012345678901234567890n;
const bigInt = BigInt("9007199254740991");
```
BigInt는 일반적인 숫자와 비슷하게 사칙연산, 비교 연산 등을 지원합니다. 하지만 BigInt와 Number를 직접 혼용해서 사용할 수는 없으며, 필요에 따라 형 변환을 해줘야 합니다.
```javascript
const bigInt1 = 10n;
const bigInt2 = 5n;
console.log(bigInt1 + bigInt2); // 15n
// BigInt와 Number를 직접 더하면 에러 발생
// console.log(bigInt1 + 2);
```
## Intl
Intl 객체는 자바스크립트에서 다양한 언어와 지역 설정에 맞춰 날짜, 시간, 숫자, 통화 등을 표현하고 처리할 수 있도록 지원하는 국제화 API입니다.
* 날짜와 시간 포맷팅: Intl.DateTimeFormat을 사용하여 다양한 형식으로 날짜와 시간을 표현할 수 있습니다.
* 숫자 포맷팅: Intl.NumberFormat을 사용하여 숫자를 지역별로 다양한 형식으로 표현할 수 있습니다.
* 통화 포맷팅: Intl.NumberFormat을 사용하여 통화를 지역별로 다양한 형식으로 표현할 수 있습니다.
* 문자열 비교: Intl.Collator를 사용하여 문자열을 지역별 정렬 규칙에 따라 비교할 수 있습니다.
```javascript
// 날짜 포맷팅 (한국어)
const date = new Date();
const formatter = new Intl.DateTimeFormat('ko-KR');
console.log(formatter.format(date)); // 예: 2023년 5월 15일 (월요일)
// 숫자 포맷팅 (미국)
const number = 12345.67;
const formatter = new Intl.NumberFormat('en-US');
console.log(formatter.format(number)); // 12,345.67
// 통화 포맷팅 (일본)
const price = 10000;
const formatter = new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' });
console.log(formatter.format(price)); // ¥10,000
```