Map과 WeakMap의 차이점 Map과 WeakMap은 모두 키(key)와 값(value)의 쌍을 저장한다는 점에서 기본적인 동작 방식은 같지만, 몇 가지 중요한 차이점이 있습니다. 1) 키 타입 제한 : WeakMap은 오직 객체(Object)만 키로 허용합니다. 반면 Map은 객체뿐만 아니라 문자열, 숫자 등 원시 타입(primitive)도 키로 사용할 수 있습니다. 2) 가비지 컬렉션 동작 : WeakMap은 키로 사용된 객체에 대한 참조가 더 이상 없으면, 해당 객체가 가비지 컬렉션(GC)에 의해 회수되는 것을 막지 않습니
Mean.io와 Mean.js의 차이점MEAN은 MongoDB, Node.js, Express.js, Angular.js를 결합하여 하나의 언어(자바스크립트)로 완전한 웹 애플리케이션을 구축할 수 있게 해주는 풀스택 프레임워크입니다. 이스라엘 출신 소프트웨어 개발자 아모스 하비브(Amos Haviv)가 Mean.io를 최초로 시작했으며, Mean.js는 Mean.io에서 포크(fork)되어 분리된 프로젝트입니다.두 프로젝트를 자세히 들여다보면 Mean.io와 Mean.js가 추구하는 방향과 목표가 서로 다르다는 것을 알 수 있습니다
JavaScript 스트릭트 모드(Strict Mode)란?스트릭트 모드(Strict Mode)는 ECMAScript 5(ES5)에서 도입된 JavaScript의 실행 방식입니다. 일반적인 JavaScript 코드에서는 조용히 통과되어 놓치기 쉬운 오류들이 스트릭트 모드에서는 명시적인 에러로 발생합니다. 이로 인해 디버ging이 훨씬 수월해지고, 개발자가 사소한 실수를 미리 잡아낼 수 있어 전반적인 코드 품질이 향상됩니다.특히 스트릭트 모드는 선언되지 않은 변수에 값을 할당하려 할 때 예외(exception)를 던지기 때문에, 의도
실시간 환경의 자바스크립트(JavaScript)는 다른 프로그래밍 언어에서 흔히 볼 수 있는 전통적인 클래스(class) 개념을 갖고 있지 않습니다. 대신 객체(Object)와 생성자(Constructor)를 기반으로 동작하며, 그중 Object.freeze()는 객체를 고정하는 데 사용되는 대표적인 생성자 메서드입니다.Object.freeze()란 무엇인가?객체를 고정(freeze)하면 해당 객체에 새로운 속성(property)을 추가할 수 없으며, 기존 속성의 값 변경이나 삭제도 불가능해집니다.또한 Object.freeze()는
피셔-예이츠(Fisher-Yates) 셔플 알고리즘이란?피셔-예이츠 셔플 알고리즘은 배열의 요소들을 무작위로 섞기 위해 사용되는 알고리즘입니다. 물론 개발자가 직접 셔플 로직을 작성할 수도 있지만, 많은 개발자들이 현대식 피셔-예이츠 셔플 알고리즘을 배열 요소를 섞는 가장 효율적이고 신뢰할 수 있는 방법으로 꼽습니다. 이 알고리즘은 시간 복잡도 O(n)으로 배열을 한 번만 순회하며, 모든 순열이 동일한 확률로 나타나는 편향 없는(unbiased) 셔플을 보장한다는 큰 장점이 있습니다.알고리즘 동작 단계뒤에서 앞으로 순회: 배열의 마
다형성(Polymorphism)이란?다형성(Polymorphism)은 객체 지향 프로그래밍(OOP)의 핵심 원칙 중 하나입니다. 다형성을 활용하면 객체들이 동일한 인터페이스를 공유하면서도, 필요에 따라 특정 동작을 재정의(오버라이드)하거나 그대로 상속받아 사용할 수 있도록 설계할 수 있습니다. 이러한 다형성은 상속(Inheritance)을 기반으로 구현됩니다.JavaScript에서는 프로토타입 체인을 통해 다형성을 손쉽게 구현할 수 있습니다. 아래 예제에서는 부모 객체 game을 상속받은 세 개의 자식 객체가 서로 다른 방식으로 동
커링(Currying)이란?커링(Currying)은 여러 개의 인수를 받는 함수를, 각각 하나의 인수만 받는 일련의 함수들로 변환하는 기법입니다. 쉽게 말해, 원래 한 번에 모든 인수를 받아야 하는 함수가 첫 번째 인수를 받고 새로운 함수를 반환하고, 그 함수가 두 번째 인수를 받아 또 다른 함수를 반환하는 식으로 동작하며, 마지막 인수가 전달될 때까지 이 과정이 반복되는 것입니다.커링 함수의 활용커링은 다음과 같은 상황에서 특히 유용합니다.같은 변수를 반복해서 전달해야 하는 번거로움을 줄여줍니다.이벤트 핸들링(event handl
메모리 수명 주기(Memory Life Cycle)프로그래밍 언어의 종류와 관계없이 메모리 수명 주기는 거의 비슷한 패턴을 따릅니다.메모리 수명 주기의 3단계필요한 메모리를 할당(Allocation)합니다.할당된 메모리를 사용(Use)합니다(읽기 또는 쓰기).더 이상 필요하지 않을 때 할당된 메모리를 해제(Release)합니다.여기서 첫 번째 단계와 마지막 단계는 C 언어 같은 저수준 언어에서는 개발자가 직접 처리해야 하지만, JavaScript처럼 고수준 언어에서는 엔진이 간접적으로(자동으로) 처리해 준다는 점이 큰 차이입니다.1
참조 카운팅(Reference-Counting) 가비지 컬렉션이란?참조 카운팅 방식은 가장 단순한 형태의 가비지 컬렉션(Garbage Collection) 알고리즘입니다. 이 알고리즘의 핵심 원리는 더 이상 어떤 곳에서도 참조되지 않는 객체를 찾아내어 메모리에서 해제하는 것입니다.객체에 연결된 참조가 하나도 남아 있지 않다면, 해당 객체는 가비지 컬렉션의 대상이 됩니다. 즉, 프로그램 어디에서도 그 객체에 접근할 수 없게 되면 메모리를 회수할 수 있는 것입니다.기본 동작 예제var obj = { x: { y: 2 } }; /
자바스크립트(JavaScript) 메모리 누수란?자바스크립트는 가비지 컬렉션(Garbage Collection) 언어라고 불립니다. 즉, 변수를 선언하면 자동으로 메모리가 할당되고, 해당 변수를 참조하는 곳이 더 이상 없으면 할당된 메모리는 자동으로 해제됩니다. 그러나 실제 개발 환경에서는 이 메모리 해제 과정이 제대로 이루어지지 않아 메모리 누수(Memory Leak)가 발생하는 경우가 많습니다.메모리 누수는 사용하지 않는 객체가 메모리에 계속 남아 있는 현상으로, 장기간 실행되는 웹 애플리케이션에서 성능 저하와 브라우저 충돌의
순환 참조(Circular Reference)란?두 변수가 서로를 참조하면 순환 참조(circular reference)가 형성되며, 이때 각 객체의 참조 카운트는 1이 됩니다.순수한 가비지 컬렉션(GC) 기반의 시스템에서는 해당 변수들을 가리키는 외부 참조가 더 이상 없다면 순환 참조 자체는 큰 문제가 되지 않습니다. 이 경우 선언된 변수들은 가비지 컬렉터에 의해 정상적으로 수거됩니다.반면 참조 카운팅(reference counting) 방식에서는 서로를 참조하는 두 객체의 참조 카운트가 절대 0이 될 수 없기 때문에 어느 한쪽
병합 정렬(Merge Sort)이란?병합 정렬은 분할 정복(Divide and Conquer) 방식의 대표적인 정렬 알고리즘입니다. 입력으로 받은 배열의 요소들을 오름차순(작은 값부터 큰 값 순서)으로 정렬하는 것이 목표입니다.병합 정렬은 배열을 계속 반으로 나눈 뒤, 다시 하나씩 합치면서 정렬하는 방식으로 동작하기 때문에 데이터가 많아도 안정적으로 좋은 성능(O(n log n))을 보여줍니다.병합 정렬의 동작 단계분할(Divide): 배열을 두 개의 하위 배열로 나누고, 각 하위 배열을 다시 두 개씩 나누는 과정을 반복하여 결국
Mark and Sweep 알고리즘이란?Mark and Sweep(표시 후 쓸기) 알고리즘은 더 이상 필요하지 않은 객체가 아니라 도달할 수 없는(unreachable) 객체를 찾아내는 방식으로 동작합니다. 이 알고리즘은 참조 카운팅(Reference Counting) 알고리즘을 개선한 형태로, 자바스크립트 엔진에서 널리 사용되는 대표적인 가비지 컬렉션 기법입니다.알고리즘의 3가지 핵심 단계루트(Root): 일반적으로 루트는 코드에서 사용되는 전역 변수를 의미합니다. 자바스크립트에서는 window 객체가 루트 역할을 할 수 있습니다
객체 복제란 무엇인가?JavaScript에서 클로닝(복제)이란 이미 존재하는 객체를 중복 생성하지 않기 위해, 하나의 객체가 가진 속성들을 다른 객체로 복사하는 작업을 의미합니다. 원본 객체는 그대로 유지하면서 동일한 데이터를 가진 새로운 객체를 만드는 것이 핵심입니다.JavaScript 객체를 복제하는 대표적인 방법은 다음과 같습니다.for-in 반복문으로 각 속성을 순회하며 새 객체에 복사하기JSON 메서드(JSON.stringify와 JSON.parse) 활용하기Object.assign() 메서드 활용하기아래에서 각 방법을 하
Map이란? Map은 키(key)와 값(value) 쌍을 저장하는 자바스크립트의 내장 자료구조입니다. Map의 가장 큰 특징은 다음 두 가지입니다. 키가 삽입된 실제 순서를 그대로 기억합니다. 키는 항상 고유(unique)해야 하며, 중복된 키는 허용되지 않습니다. Map의 기본 생성 문법은 다음과 같습니다. new Map([iterable]) Case 1: Map이 없을 때 발생하는 문제 Map이 등장하기 전에는 자바스크립트 객체(object)에 객체 타입의 키를 제대로 사용할 수 없다는 한계가 있었습니다. 객체를 키로 지정
Detached DOM 요소란?Detached DOM(분리된 DOM) 요소란 DOM 트리에서는 이미 제거되었지만, 자바스크립트의 어떤 변수나 객체가 여전히 해당 요소를 참조하고 있어 가비지 컬렉터(Garbage Collector)가 메모리를 회수하지 못하는 요소를 말합니다. 즉, 요소가 화면에서 사라진 후에도 어딘가에 참조가 남아 있다면 그 요소는 계속 메모리를 차지하게 됩니다.DOM은 양방향으로 연결된 트리 구조입니다. 따라서 트리 안의 특정 노드 하나만 참조하고 있어도, 그 노드를 포함한 전체 트리가 가비지 컬렉션 대상에서 제외
Array.some() 메서드란?Array.some() 메서드는 배열의 요소 중 하나라도 사용자가 제공한 콜백 함수로 구현된 테스트를 통과하는지 확인하는 자바스크립트 내장 메서드입니다.Array.every()와의 차이점을 이해하는 것이 중요합니다. every()는 모든 요소가 테스트를 통과해야만 true를 반환하는 반면, some()은 단 하나의 요소라도 테스트를 통과하면 즉시 true를 반환합니다. 반대로 모든 요소가 테스트에 실패할 경우에만 false를 반환합니다.기본 구문arr.some(callback(element[, ind
JavaScript Array.find() 메서드 소개Array.find() 메서드는 배열에서 주어진 테스트 조건(콜백 함수)을 만족하는 첫 번째 요소의 값을 반환하는 데 사용됩니다. 만약 어떤 요소도 조건을 통과하지 못하면 undefined를 반환합니다.이 메서드는 배열 전체를 순회하면서 각 요소를 콜백 함수에 전달하고, 조건이 참(true)이 되는 순간 검색을 중단하고 해당 값을 즉시 반환합니다. 따라서 대용량 배열에서도 효율적으로 원하는 값을 찾을 수 있습니다.주요 특징조건을 만족하는 첫 번째 요소의 값 자체를 반환합니다(인덱
JavaScript Array.findIndex() 메서드란?Array.findIndex() 메서드는 제공된 테스트 함수를 통과하는 배열 요소 중 첫 번째 요소의 인덱스를 반환합니다. 이 메서드는 배열의 각 요소에 대해 콜백 함수를 한 번씩 실행하며, 조건을 만족하는 첫 번째 요소를 발견하면 해당 인덱스를 즉시 반환합니다. 만약 조건을 만족하는 요소가 하나도 없다면 -1을 반환합니다.findIndex()의 동작 방식findIndex()는 조건을 만족하는 요소를 찾는 순간 나머지 요소는 더 이상 검사하지 않습니다. 이러한 특성 덕분에
Math.abs() 메서드란?Math.abs()는 JavaScript에서 숫자의 절댓값(absolute value)을 반환하는 내장 메서드입니다. 수학적으로 표현하면 다음과 같습니다.|p| = { p if p > 0 0 if p = 0 -p if p < 0 }위 수학적 정의를 살펴보면, p가 양수일 때는 절댓값이 p 그대로 반환되고, p가 음수일 때는 -(p)가 반환됩니다. 예를 들어 p가 -5라면 절댓값은 -(-5), 즉 +5가 됩니다. 결국 Math.abs()는 입력된 숫자의 부호가 양수