JS의 레퍼런스
js는 다른 언어와 다르게 포인터의 개념이 없다.
그렇기 때문에 포인터라는 개념 대신 참조(reference)를 이용한다.
*GO언어는 포인터도 있고 가비지컬렉터가 있다. 포인터가 없다고 해서 가비지컬렉터가 있는건 아니다.
자바스크립트에서 변수에 값을 할당할 때, 실제 값이 저장되는 것이 아니라 값이 저장된 메모리 주소를 참조하는 방식으로 동작한다. 따라서 변수를 이용하여 값을 변경하면 해당 메모리 주소에 있는 값을 변경하게 된다.
예를 들어 아래 코드에서 'obj1'과 'obj2'는 같은 객체를 참조한다.
따라서 'obj1'의 프로퍼티를 변경하면 'obj2'에서도 변경된 값을 확인할 수 있다.
var obj1 = { name: "John" };
var obj2 = obj1;
obj1.name = "Jane";
console.log(obj2.name); // "Jane" 출력
위 예시에서 'obj1' 변수에 객체 리터럴을 할당하고, 'obj2' 변수에 'obj1'을 할당한다.
이후 'obj1'의 'name' 프로퍼티를 변경하면 'obj2'에서도 변경된 값을 확인할 수 있다.
이는 'obj2'가 'obj1' 과 같은 객체를 참조하기 때문이다.
따라서 자바스크립트에서는 포인터라는 개념을 사용하지 않고 참조를 이용하여 객체를 다룬다.
객체의 생명주기
객채의 생성은 new 연산자를 이용하거나 객체 리터럴을 이용하여 생성할 수 있다.
객체가 더 이상 사용되지 않으면 가비지 컬렉터에 의해 검사되어 메모리에서 제거된다.
객체는 다양한 이유로 소멸될 수 있다.
예를 들어, 객체를 참조하던 변수가 다른 객체를 참조하도록 변경될 경우, 해당 객체는 더 이상 참조되지 않은 것으로 간주되어 가비지 컬렉터에 의해 메모리에서 제거된다.
또한, 객체가 명시적으로 소멸되도록 코드를 작성할 수 있다.
객체의 생명주기를 관리하는 것은 메모리 누수를 방지하고 성능을 최적화하는 데 중요하다.
따라서 개발자는 객체를 적절하게 생성하고, 사용하지 않는 객체는 최대한 빨리 해제하여 메모리를 효율적으로 관리해야 한다.
가비지 컬렉터
메모리 누수를 방지하고 성능을 최적화하는 데 자바스크립트에서는 가비지컬렉터가 사용된다.
가비지컬렉터는 자바스크립트 엔진에서 메모리를 관리하는 기능 중 하나이다.
가비지 컬렉터는 주기적으로 실행되며, 개발자가 실행 주기를 맞추지 못한다.
또한, 더 이상 참조되지 않는 객체들을 검사하여 메모리에서 제거한다.
이는 개발자가 수동으로 메모리를 관리하지 않아도 된다는 장점을 제공한다.
가비지 컬렉터가 실행될 때 일시적으로 애플리케이션의 실행 속도가 느려질 수 있다는 단점도 있다.
자바스크립트에서 메모리는 동적으로 할당되고 해제된다.
객체나 변수 등을 생성할 때 메모리가 할당되며, 사용이 끝나면 해당 메모리를 해제해야 한다.
그렇지 않으면 메모리 누수가 발생하여 시스템의 성능을 저하시키고, 결국 애플리케이션의 동작에 영향을 미칠 수 있다.
이러한 문제를 해결하기 위해 자바스크립트 엔진은 가비지 컬렉터라는 기능을 제공한다.
가비지 컬렉터는 자동으로 실행되지만, 개발자는 가비지 컬렉터가 언제 실행될지 예측할 수 없다.
따라서 객체나 변수를 사용한 후 적시에 해당 메모리를 해제하는 것이 중요하다.
이를 위해 개발자는 불필요한 객체나 변수를 최대한 빨리 해제하고, 큰 데이터셋이나 긴 생명주기를 가진 객체의 경우는 수동으로 메모리를 해제해주는 것이 좋다.
'개발 > html, css, js' 카테고리의 다른 글
[JS] var, let, const 차이 (0) | 2022.10.05 |
---|---|
[30일 챌린지 Day-17] 관사 제외하고 정렬하기 (0) | 2022.08.11 |
[30일 챌린지 Day-16] Mouse Move Shadow (0) | 2022.08.11 |
[30일 챌린지 Day-15] LocalStorage (0) | 2022.08.11 |
[30일 챌린지 Day-13] scroll event (0) | 2022.08.09 |