Set
과 Map
이라는 유용한 자료구조도 살짝 맛보는 시간을 갖겠습니다.const numbers = [1, 2, 3];
numbers.forEach((num, index) => {
console.log(`${index}번째 요소: ${num}`); // 각 요소를 순서대로 출력
});
// 출력:
// 0번째 요소: 1
// 1번째 요소: 2
// 2번째 요소: 3
const numbers = [1, 2, 3];
const squaredNumbers = numbers.map(num => num * num); // 각 요소를 제곱
console.log(squaredNumbers); // 출력: [1, 4, 9]
console.log(numbers); // 출력: (원본 배열은 그대로)
true
인 요소들만 모아 const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = numbers.filter(num => num % 2 === 0); // 짝수만 필터링
console.log(evenNumbers); // 출력: [2, 4, 6]
console.log(numbers); // 출력: (원본 배열은 그대로)
accumulator
는 누적된 결과값이고, currentValue
는 현재 요소입니다. initialValue
는 초기 누적값입니다(선택 사항).
배열 요소들을 이용해 합계, 평균, 특정 객체 생성 등 다양한 작업을 할 수 있습니다.const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, cur) => acc + cur, 0); // 초기값 0부터 시작하여 합계 계산
console.log(sum); // 출력: 15
const strings = ["hello", " ", "world", "!"];
const combinedString = strings.reduce((acc, cur) => acc + cur, ""); // 빈 문자열부터 시작하여 문자열 합치기
console.log(combinedString); // 출력: "hello world!"
compareFunction
이 없으면 요소들을 compareFunction
을 제공해야 합니다.
a - b
반환 시: 오름차순 정렬b - a
반환 시: 내림차순 정렬const unsortedNumbers = [5, 3, 8, 1, 2];
// 잘못된 숫자 정렬 (문자열로 변환되어 비교)
// console.log(unsortedNumbers.sort()); // 출력 예시: (잘못됨!)
// 오름차순 숫자 정렬
unsortedNumbers.sort((a, b) => a - b);
console.log(unsortedNumbers); // 출력: [1, 2, 3, 5, 8]
// 내림차순 숫자 정렬
unsortedNumbers.sort((a, b) => b - a);
console.log(unsortedNumbers); // 출력: [8, 5, 3, 2, 1]
const fruits = ["banana", "apple", "orange"];
fruits.sort(); // 문자열은 기본 정렬 동작
console.log(fruits); // 출력: ["apple", "banana", "orange"]
객체 배열을 특정 속성 기준으로 정렬할 때도compareFunction
을 활용합니다.
undefined
를 반환합니다.-1
을 반환합니다.const users = [
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 25 }
];
const firstAdult = users.find(user => user.age >= 30);
console.log(firstAdult); // 출력: { name: 'Bob', age: 30 }
const indexOfBob = users.findIndex(user => user.name === "Bob");
console.log(indexOfBob); // 출력: 1
true
를 반환하고 즉시 멈춥니다. 아니면 false
.true
를 반환합니다.
하나라도 만족하지 않으면 false
를 반환하고 즉시 멈춥니다.const nums = [1, 3, 5, 7, 8];
const hasEven = nums.some(num => num % 2 === 0); // 짝수가 하나라도 있는지?
console.log(hasEven); // 출력: true (8 때문에)
const allOdd = nums.every(num => num % 2 !== 0); // 모두 홀수인지?
console.log(allOdd); // 출력: false (8 때문에)
push(element)
: 배열 pop()
: 배열 unshift(element)
: 배열 shift()
: 배열 push
와 shift
를 사용할 수 있지만 shift
의 성능 이슈를 인지해야 합니다.
스택(Stack)은 push
와 pop
으로 효율적으로 구현 가능합니다.
const arr = [1, 2, 3];
arr.push(4); // 배열 끝에 4 추가
console.log(arr); // 출력: [1, 2, 3, 4]
const lastElement = arr.pop(); // 배열 끝에서 요소 제거
console.log(lastElement); // 출력: 4
console.log(arr); // 출력: [1, 2, 3]
start
인덱스부터 end
인덱스 start
인덱스부터 deleteCount
개의 요소를 제거하고, 그 자리에 item1
, item2
등을 추가합니다.
(반환값: 제거된 요소들의 배열) 코딩 테스트에서는 원본 배열을 변경하는 특성 때문에 주의해서 사용해야 합니다.const original = ['a', 'b', 'c', 'd', 'e'];
const sliced = original.slice(1, 4); // 인덱스 1부터 4 직전까지
console.log(sliced); // 출력: ['b', 'c', 'd']
console.log(original); // 출력: ['a', 'b', 'c', 'd', 'e'] (원본 유지)
const removed = original.splice(1, 2, 'X', 'Y'); // 인덱스 1부터 2개 제거('b', 'c')하고 'X', 'Y' 추가
console.log(removed); // 출력: ['b', 'c'] (제거된 요소)
console.log(original); // 출력: ['a', 'X', 'Y', 'd', 'e'] (원본 변경됨!)
true
또는 false
반환.depth
(기본값 1)만큼 펼쳐서 map
과 flat(1)
을 합친 기능. 각 요소에 대해 콜백 함수를 실행하고, 그 결과를 1단계 펼쳐서 새로운 배열로 반환합니다.map
, filter
, reduce
, sort
등 새로운 배열을 반환하거나 원본 배열을 변경하는 메서드들을 연결하여 사용하면 코드를 간결하게 만들 수 있습니다.const numbers = [1, 2, 3, 4, 5];
const result = numbers
.filter(num => num % 2 === 0) // 짝수만 필터링:
.map(num => num * 10) // 각 요소에 10 곱하기:
.reduce((acc, cur) => acc + cur, 0); // 모든 요소 더하기: 100
console.log(result); // 출력: 100
const person = { name: "홍길동", age: 25, city: "서울" };
// 객체 리터럴person.name
또는 person['name']
// 속성 값 접근 (결과: "홍길동")person.age = 26;
// 속성 값 변경person.job = "개발자";
// 새 속성 추가delete person.city;
// 속성 삭제hasOwnProperty()
메서드로 자신의 속성인지 확인하는 것이 안전할 수 있습니다.
const student = { name: "Alice", major: "CS", grade: 2 };
for (const key in student) {
// if (student.hasOwnProperty(key)) { // 자신의 속성만 출력하고 싶을 때
console.log(`${key}: ${student[key]}`);
// }
}
// 출력:
// name: Alice
// major: CS
// grade: 2
for...of
와 함께 사용하기 좋습니다.
const car = { brand: "Hyundai", model: "Sonata", year: 2023 };
console.log(Object.keys(car)); // 출력: ['brand', 'model', 'year']
console.log(Object.values(car)); // 출력: ['Hyundai', 'Sonata', 2023]
console.log(Object.entries(car)); // 출력: [['brand', 'Hyundai'], ['model', 'Sonata'], ['year', 2023]]
// Object.entries와 for...of 조합
for (const [key, value] of Object.entries(car)) {
console.log(`${key} = ${value}`);
}
// 출력:
// brand = Hyundai
// model = Sonata
// year = 2023
const book = { title: "모던 JavaScript 튜토리얼", author: "이웅모", price: 30000 };
// 기존 방식
// const title = book.title;
// const author = book.author;
// 구조 분해 할당
const { title, author, price } = book;
console.log(title); // 출력: "모던 JavaScript 튜토리얼"
console.log(author); // 출력: "이웅모"
// 일부 속성만 가져오거나, 변수 이름 변경도 가능
const { title: bookTitle, price: bookPrice } = book;
console.log(bookTitle); // 출력: "모던 JavaScript 튜토리얼"
console.log(bookPrice); // 출력: 30000
const name = "Alice";
const age = 20;
// 기존 방식
// const person = { name: name, age: age };
// 단축 속성명 사용
const person = { name, age };
console.log(person); // 출력: { name: 'Alice', age: 20 }
[]
를 사용하여 표현식의 결과값을 키 이름으로 사용할 수 있습니다.const prefix = "user_";
let count = 0;
const users = {
[prefix + ++count]: "Alice", // 키가 'user_1'
[prefix + ++count]: "Bob", // 키가 'user_2'
[prefix + ++count]: "Charlie" // 키가 'user_3'
};
console.log(users); // 출력: { user_1: 'Alice', user_2: 'Bob', user_3: 'Charlie' }
Set
과 Map
자료구조가 있습니다.add
), 삭제(delete
), 포함 여부 확인(has
) 연산이 평균적으로 O(1)으로 매우 빠릅니다.const mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add(5); // 중복된 값은 추가되지 않음
mySet.add("hello");
console.log(mySet); // 출력: Set(3) { 1, 5, 'hello' }
console.log(mySet.has(1)); // 출력: true
console.log(mySet.has(3)); // 출력: false
console.log(mySet.size); // 출력: 3
mySet.delete(5);
console.log(mySet); // 출력: Set(2) { 1, 'hello' }
// 배열에서 중복 제거
const duplicateArray = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(duplicateArray)]; // Set으로 변환 후 다시 배열로 (스프레드 연산자 활용)
console.log(uniqueArray); // 출력: [1, 2, 3, 4, 5]
set
), 조회(get
), 삭제(delete
), 포함 여부 확인(has
) 연산이 평균적으로 O(1)입니다.
size
속성으로 요소 개수를 쉽게 알 수 있습니다.const myMap = new Map();
const keyObject = { id: 1 };
const keyFunc = () => {};
myMap.set("a string", "문자열 키의 값"); // 문자열 키
myMap.set(keyObject, "객체 키의 값"); // 객체 키
myMap.set(keyFunc, "함수 키의 값"); // 함수 키
myMap.set(1, "숫자 키의 값"); // 숫자 키
console.log(myMap.size); // 출력: 4
console.log(myMap.get(keyObject)); // 출력: "객체 키의 값"
console.log(myMap.has("a string"));// 출력: true
// Map 순회 (forEach)
myMap.forEach((value, key) => {
console.log(`${JSON.stringify(key)} => ${value}`);
});
// Map 순회 (for...of)
for (const [key, value] of myMap) {
console.log(key, value);
}
map
, filter
, reduce
와 같은 강력한 배열 메서드와 객체 순회 및 조작 방법, 그리고 Set
과 Map
자료구조는 문제 해결의 효율성을 크게 높여줄 것입니다.
더불어, 메서드 체이닝, 구조 분해 할당, 화살표 함수 등 코드를 더욱 간결하고 읽기 쉽게 만드는 팁들도 함께 익혔습니다.다음 마지막하(下) 편에서는알고리즘 구현에 필수적인 시간 복잡도 개념을 이해하고,정렬(Sort) 알고리즘 심층 분석, 재귀(Recursion), 그리고 스택(Stack), 큐(Queue), 해시 테이블(Hash Table)과 같은 필수 자료구조를 자바스크립트로 어떻게 효과적으로 다룰 수 있는지 알아보겠습니다.