메모리 최적화
1. 메모리
메모리 최적화는 프로그램이 사용하는 메모리를 효율적으로 관리하는 것을 의미합니다. 이는 프로그램의 성능과 안정성에 큰 영향을 미칩니다.
1.1. 메모리의 생명 주기
메모리의 생명 주기는 크게 세 단계로 나눌 수 있습니다.
- 메모리 할당: 프로그램이 사용할 수 있도록 운영체제가 메모리를 할당합니다.
- 메모리 사용: 개발자가 코드 상에서 할당된 변수를 사용함으로써 읽기와 쓰기 작업이 이루어집니다.
- 메모리 해제: 프로그램에서 필요하지 않은 메모리 전체를 되돌려주어 다시 사용 가능하게 만드는 단계입니다.
1.2. 메모리 누수와 Garbage Collection
메모리 누수는 프로그램이 더 이상 필요하지 않은 메모리를 계속해서 점유하는 현상을 의미합니다. 이러한 현상을 방지하기 위해 자바스크립트와 같은 고수준 언어에는 가비지 컬렉터(Garbage Collector) 가 존재합니다. C, C++과 같은 저수준 언어와는 다르게 자바스크립트에서 사용되지 않는 메모리는 가비지 컬렉터가 추정하여 삭제합니다.
자바스크립트 엔진이 사용되지 않는 메모리를 자동으로 파악하여 삭제할 때, 주로 사용되는 방식이 참조 카운팅 (reference counting) 입니다. 이는 메모리에 존재하는 값을 몇 개의 변수와 함수가 참조하고 있는지 확인하는 방식입니다. 참조 횟수가 0이 되면 해당 값은 메모리에서 삭제됩니다.
객체가 서로를 참조하여 가비지 컬렉터에 의해 삭제되지 않는 문제를 순환 참조 문제라고 합니다. 이러한 문제를 해결하기 위해 최신 브라우저에서는 마크 앤 스위프(Mark and Sweep) 알고리즘 을 사용합니다. 전역 객체에서 시작하여 도달 가능한 모든 객체를 찾아 마킹하고(mark), 마킹되지 않은 객체는 삭제(sweep)하는 방식입니다.
Mark and Sweep | MDN자바스크립트에서 메모리 관리에 특별히 주의해야 하는 경우 중 하나는 전역 변수의 사용입니다. 전역 변수는 프로그램이 종료되기 전까지 계속 메모리에 존재하므로, 가능한 한 전역 변수의 사용을 최소화해야 합니다.
2. 좋은 습관 기르기
좋은 코딩 습관은 많은 에러를 사전에 예방하고, 코드의 품질을 향상시킵니다. 다음은 자바스크립트 개발에서 권장되는 몇 가지 좋은 습관입니다.
2.1. 배열이나 객체를 불변하는 객체처럼
배열이나 객체는 불변하는 객체처럼 다루는 것이 데이터의 변화를 추적하는 데 용이합니다. 배열이나 객체를 수정할 때, 원본 데이터를 수정하지 않고 새로운 배열이나 객체를 생성하는 습관을 들이는 것이 좋습니다.
실습
다음 코드에서 배열의 원소에 💖 이모지를 추가해보세요
2.2. 엄격모드(strict mode)로 사용
자바스크립트에서는 엄격 모드를 사용하는 것을 권장합니다. 엄격 모드는 많은 잠재적 에러를 미리 방지할 수 있게 해줍니다.
엄격 모드를 활성화하려면 파일 또는 함수의 시작 부분에 'use strict';
를 추가하면 됩니다.
엄격 모드의 특징
- 선언하지 않은 변수에 값을 할당할 수 없습니다.
- 읽기 전용 객체에 값을 할당하면 에러가 발생합니다. (일반 모드에서는 조용한 에러)
- 지울수 없는 값을 지우려고 하면 에러가 발생합니다. (일반 모드에서는 조용한 에러)
- 함수 파라미터에 중복된 이름을 사용할 수 없습니다.
'use strict';
// 1. 선언하지 않은 변수에 값을 할당할 수 없습니다.
x = 3.14; // ReferenceError: x is not defined
// 2. 읽기 전용 객체에 값을 할당하면 에러가 발생합니다.
const obj = Object.freeze({ name: 'weniv' });
obj.name = 'licat';
// 에러 발생: 매개변수 이름 중복
function sum(a, a, c) {
return a + a + c;
}
'use strict';
// 1. 선언하지 않은 변수에 값을 할당할 수 없습니다.
x = 3.14; // ReferenceError: x is not defined
// 2. 읽기 전용 객체에 값을 할당하면 에러가 발생합니다.
const obj = Object.freeze({ name: 'weniv' });
obj.name = 'licat';
// 에러 발생: 매개변수 이름 중복
function sum(a, a, c) {
return a + a + c;
}
2.3. 일치연산자 사용
동등 연산자(==
) 대신 일치 연산자(===
)를 사용하는 것이 좋습니다. 일치 연산자는 값뿐만 아니라 타입까지 비교하므로 예기치 않은 타입 변환으로 인한 오류를 방지할 수 있습니다.
이러한 좋은 습관들을 실천하면 코드의 품질과 유지보수성을 크게 향상시킬 수 있습니다. 또한, 이는 메모리 관리와 성능 최적화에도 도움이 됩니다.