JavaScript의 메모리 관리
기본형, 참조형 데이터와 가변성을 이해해보자!
변수 선언과 데이터 할당 방식, 기본형 데이터와 참조형 데이터의 차이, 불변성과 가변성에 대해 알아보자!
변수 선언과 데이터 할당 방식
1-1) 변수 선언과 할당을 분리한 경우
-
메모리 사용
- 변수를 선언할 때 메모리에서 변수 공간만 할당되며 이후 데이터를 할당할 때만 추가 메모리 공간이 필요함
-
효율성
- 변수를 선언한 후 나중에 데이터를 할당하면, 처음에는 최소한의 메모리만 사용하고 필요에 따라 메모리를 추가로 사용하는 방식이다.
-
유연성
- 변수의 값을 런타임에 동적으로 결정해야 할 때 유용함
-
초기화
- 변수를 선언만 하고 나중에 할당하는 경우는 변수의 초기 상태를 명확히 알 수 있으며, 다ㅔ이터 할당 시점을 제어할 수 있음
-
복잡성
- 변수 선언과 데이터 할당이 분리되어 있어 코드가 길어질 수 있고 읽기 어려울 수 있음
let a; // 변수 선언
let a = 'hi'; // 데이터 할당
1-2) 변수 선언과 할당을 같이 한 경우
-
메모리 사용
- 변수를 선언함과 동시에 할당을 함으로써 초기 메모리 할당이 한번에 이루어짐. 데이터가 필요 없을 때 메모리를 낭비할 수 있음
-
효율성
- 선언과 할당을 동시에 하면 코드가 간결하며, 변수와 데이터가 동시에 메모리가 저장됨
-
간결성
- 선언과 할당이 동시에 이루어져 코드가 간결하고 직관적이며 변수가 선언되며 바로 값을 가지게 되어 읽기 쉽다.
-
초기화 보장
- 변수를 선언하자마자 초기 값을 설정하므로, 변수 사용 시점에서 데이터가 항상 존재하도록 보장할 수 있음
-
초기화 시점 제한
- 선언과 할당이 동시에 이루어져 초기화될 시점을 제어하기 어려움. 동적으로 할당해야할 경우 어려움이 있음
let a = 'hi'; // 변수 선언과 데이터 할당
기본형 데이터와 참조형 데이터
2-1) 기본형 데이터
기본형 데이터는 변수에 할당된 값이 변경되면, 기존 데이터가 아닌 새로운 데이터가 생성된다.
- 특징
- 불변성 : 기본형 데이터는 값이 변경되지 않고, 변경 시 새로운 데이터가 생성된다.
- 단순성 : 값 자체가 메모리에 저장된다.
let num1 = 10; // 기본형 숫자 10 할당하며 메모리에 저장됨
let num2 = num1; // num2는 num1의 값을 복사함
num1 = 50; // num1 의 값이 변경됨 10은 현재 num2에 있고 50이란 값이 할당되고 메모리에 저장됨
// num2 = 10임
2-2) 참조형 데이터
참조형 데이터는 메모리에서 객체의 참조를 저장하므로, 객체의 내용이 변경되면 참조하는 모든 변수에서 그 변경을 확인할 수 있음
- 특징
- 가변성: 참조형 데이터는 그 내용이 변경될 수 있으며 객체의 참조만 저장함
- 복잡성: 객체, 배열, 함수 등 복잡한 데이터 구조를 저장함
let obj1 = {a: 1, b: 'bbb'};
let obj2 = obj1; // obj2는 obj1을 참조함
obj1.a = 2; // obj1의 내용이 변경됨
// obj2.a도 2로 변경됨
불변성과 가변성
2-1) 불변성
불변 데이터는 수정할 수 없는 데이터이다. 데이터를 변경하려면 새로운 데이터가 생성됨
- 문자열
a
에 새로운 값을 추가하여b
를 생성하면a
의 데이터는 그대로 유지됨
let a = 'hello';
let b = a + 'world';
// a는 'hello'
// b는 'hello world'
2-2) 가변성
변 데이터는 수정할 수 있으며, 직접적으로 데이터의 내용이 변경됨.
- 배열
arr
에 4를 추가하면 배열의 내용이 직접적으로 변경됨
let arr = [1,2,3];
arr.push(4); // 배열의 내용이 수정됨
// arr => [1,2,3,4]
메모리 관리와 최적화
- 기본형 데이터
- 메모리에서 값 자체가 저장되며, 불변성이 보장된다. 값이 변경되면 새로운 데이터가 생성되고 기존 데이터는 변경되지 않음
- 참조형 데이터
- 메모리에서 객체의 참조를 저장하며, 객체의 내용은 변경될 수 있다. 참조형 데이터는 메모리 효율성과 관리 측면에서 주의가 필요함
- 메모리 누수
- 참조형 데이터를 사용할 때는 가비지 컬렉터가 사용되지 않는 데이터를 수거하지만, 메모리 누수가 발생할 수 있으므로 코드작성 시 주의가 필요함
마무리
JavaScript의 메모리 관리에 대해 알아보았다.
예시의 코드들은 짧지만 추후 프로젝트가 커지면 커질수록 코드가 정말 길어질 것이며 그럴경우 메모리 관리도 중요하다고 생각이 되며, 공부한 내용을 바탕으로 효율적인 코드를 작성할 수 있으면 좋을 것 같다.