자바스크립트에서의 삭제란?

Seong Hyeon Kim·2023년 12월 26일
0

개인공부

목록 보기
22/23

리엑트 공부중 갑자기 문득 궁금한게 생겨서 gpt 에 질문을 해보았다.

질문

궁금한게 있어. 나는 백엔드 개발자라서 주로 실제 디비를 사용해서 삭제한다라는 개념이 박혀있는 상황이야. 여기서 너가 알려준 slice 혹으 splice 역시도 삭제한다라고 말해줬는데 여기서 말한 삭제는 구체적으로 어디에서의 삭제를 말하는거야? 메모리상에서의 삭제를 말하는건가?

gpt 의 답변은 다음과 같앗다.

답변

네, 맞습니다. JavaScript에서 배열의 `slice` 및 `splice` 메서드를 사용하여 
"삭제"할 때, 실제로는 해당 메서드를 사용하여 배열의 내용을 
변경하게 되지만, 이는 메모리 상에서의 변경을 의미합니다. 

1. **splice 메서드:**
   - `splice` 메서드는 배열 자체를 변경하며, 특정 인덱스에서 시작하여 지정된 개수의 요소를 삭제하고, 필요한 경우 새로운 요소를 추가할 수 있습니다.
   - 배열을 직접 수정하기 때문에 메모리 상에서 해당 요소가 실제로 삭제됩니다.

2. **slice 및 concat 메서드:**
   - `slice` 메서드는 원본 배열을 변경하지 않고, 지정된 범위의 요소를 추출한 새로운 배열을 반환합니다.
   - `concat` 메서드는 여러 배열을 결합하여 새로운 배열을 생성합니다.
   - 원본 배열을 변경하지 않고 새로운 배열을 생성하기 때문에, 메모리 상에서 기존 배열은 그대로 남아있습니다. 단지 새로운 배열에는 특정 요소가 제외된 것처럼 보일 뿐입니다.

따라서 JavaScript에서의 "삭제"는 실제로는 해당 요소를 메모리에서 완전히 제거하는 것이 
아니라, 배열의 상태를 변경하여 특정 요소를 사용하지 않는 것처럼 보이게 하는 것을 의미합니다. 
메모리 관리는 JavaScript 엔진이 자동으로 처리하며, 더 이상 참조되지 않는 객체 
또는 배열은 가비지 컬렉션에 의해 메모리에서 해제됩니다.

그래서 문뜩 가비지 컬렉션 이라는 조금 생소한 개념을 알게 되었고 이에 관해 좀더 질문해보기로 햇다.

질문2

가비지 컬렉션에 대해서 자세히 설명해줘 .

  • 그리고 그렇게 해제된 메모리들은 이후에 어떻게 되는건지도 설명해줘.
  • 해제된 메모리들이 삭제가 자동으로 되는건지 자동으로 안된다면 지속적으로 영구적인 삭제를 통해서 메모리의 공간확보를 해야될것 같은데 이러한 방법은 어떻게 하는지에 대해서 알려줘

답변은 다음과 같아다.

답변2

가비지 컬렉션 (Garbage Collection):

가비지 컬렉션은 프로그램이 동적으로 할당한 메모리 중에서 사용되지 않는 메모리를 자동으로 찾아내고 해제하는 프로세스를 의미합니다. JavaScript는 가비지 컬렉션을 통해 개발자가 명시적으로 메모리를 관리할 필요가 없도록 합니다.

  1. 동작 방식:

    • JavaScript 엔진은 주기적으로 메모리를 검사하여 더 이상 참조되지 않는 객체를 식별합니다.
    • 참조되지 않는 객체는 더 이상 필요하지 않은 것으로 간주되고, 이를 해제하여 메모리를 확보합니다.
  2. Mark-and-Sweep 알고리즘:

    • 대부분의 JavaScript 엔진은 Mark-and-Sweep 알고리즘을 사용하여 가비지 컬렉션을 수행합니다.
    • 이 알고리즘은 루트 객체(전역 객체, 실행 중인 함수의 지역 변수 등)에서부터 시작하여 참조되는 모든 객체를 표시(mark)합니다.
    • 표시되지 않은 객체는 사용되지 않는 것으로 간주되어, 이후 수거(sweep)되어 메모리에서 제거됩니다.

메모리 해제 후의 동작:

가비지 컬렉션을 통해 해제된 메모리는 다음과 같이 처리됩니다:

  1. 메모리 반환:

    • 가비지 컬렉션이 발생하면 해제된 메모리는 다시 사용 가능한 자유 메모리로 표시됩니다.
  2. 자동으로 삭제:

    • 자바스크립트 엔진은 가비지 컬렉션에 의해 해제된 메모리를 자동으로 삭제합니다.
    • 개발자는 이를 수동으로 제어할 필요가 없습니다.

메모리 관리에 대한 추가 고려사항:

  1. 이벤트 루프:

    • 메모리 관리는 이벤트 루프의 한 부분으로 동작합니다.
    • 이벤트 루프는 비동기 작업 및 타이머를 관리하며, 메모리 관리도 포함됩니다.
  2. 메모리 누수 방지:

    • 개발자는 코드를 작성할 때 메모리 누수를 방지하는 데 주의를 기울여야 합니다.
    • 예를 들어, 불필요한 참조를 유지하지 않도록 주의가 필요합니다.
  3. 크롬 개발자 도구:

    • 브라우저의 개발자 도구에는 메모리 프로파일링 도구가 있어 메모리 사용을 모니터링하고 분석할 수 있습니다.

JavaScript에서는 메모리 관리가 자동으로 이루어지므로, 일반적으로는 개발자가 직접 메모리를 해제하는 작업이 필요하지 않습니다. 자바스크립트 엔진이 가비지 컬렉션을 통해 메모리를 효과적으로 관리하므로 개발자는 주로 코드의 효율성과 메모리 누수를 방지하는 데에 중점을 두어야 합니다.


결론

길게 설명해주기는 했지만 결국 내가 걱정했었던 삭제를 실행해도 어딘가에 메모리가 남아있을까 하는 걱정은 실제로는 자바스크립트가 자체적으로 잘 해결하고 있었기 때문에 메모리부분에서는 내가 따로 경쓰지 않아도 되는 부분이였고, 원래 하던 대로 더 효율적인 코드를 짜는데 집중하면 된다는것을 알게 되었다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글