:ledger: 기본형, 참조형 데이터와 가변성을 이해해보자!

변수 선언과 데이터 할당 방식, 기본형 데이터와 참조형 데이터의 차이, 불변성과 가변성에 대해 알아보자!

:one: 변수 선언과 데이터 할당 방식

:pushpin: 1-1) 변수 선언과 할당을 분리한 경우

  1. 메모리 사용
    • 변수를 선언할 때 메모리에서 변수 공간만 할당되며 이후 데이터를 할당할 때만 추가 메모리 공간이 필요함
  2. 효율성
    • 변수를 선언한 후 나중에 데이터를 할당하면, 처음에는 최소한의 메모리만 사용하고 필요에 따라 메모리를 추가로 사용하는 방식이다.
  3. 유연성
    • 변수의 값을 런타임에 동적으로 결정해야 할 때 유용함
  4. 초기화
    • 변수를 선언만 하고 나중에 할당하는 경우는 변수의 초기 상태를 명확히 알 수 있으며, 다ㅔ이터 할당 시점을 제어할 수 있음
  5. 복잡성
    • 변수 선언과 데이터 할당이 분리되어 있어 코드가 길어질 수 있고 읽기 어려울 수 있음
let a; // 변수 선언
let a = 'hi'; // 데이터 할당

:pushpin: 1-2) 변수 선언과 할당을 같이 한 경우

  1. 메모리 사용
    • 변수를 선언함과 동시에 할당을 함으로써 초기 메모리 할당이 한번에 이루어짐. 데이터가 필요 없을 때 메모리를 낭비할 수 있음
  2. 효율성
    • 선언과 할당을 동시에 하면 코드가 간결하며, 변수와 데이터가 동시에 메모리가 저장됨
  3. 간결성
    • 선언과 할당이 동시에 이루어져 코드가 간결하고 직관적이며 변수가 선언되며 바로 값을 가지게 되어 읽기 쉽다.
  4. 초기화 보장
    • 변수를 선언하자마자 초기 값을 설정하므로, 변수 사용 시점에서 데이터가 항상 존재하도록 보장할 수 있음
  5. 초기화 시점 제한
    • 선언과 할당이 동시에 이루어져 초기화될 시점을 제어하기 어려움. 동적으로 할당해야할 경우 어려움이 있음
let a = 'hi'; // 변수 선언과 데이터 할당

:two: 기본형 데이터와 참조형 데이터

:pushpin: 2-1) 기본형 데이터

기본형 데이터는 변수에 할당된 값이 변경되면, 기존 데이터가 아닌 새로운 데이터가 생성된다.

  1. 특징
    • 불변성 : 기본형 데이터는 값이 변경되지 않고, 변경 시 새로운 데이터가 생성된다.
    • 단순성 : 값 자체가 메모리에 저장된다.
let num1 = 10; // 기본형 숫자 10 할당하며 메모리에 저장됨
let num2 = num1; // num2는 num1의 값을 복사함  
num1 = 50; // num1 의 값이 변경됨 10은 현재 num2에 있고 50이란 값이 할당되고 메모리에 저장됨
// num2 = 10임 

:pushpin: 2-2) 참조형 데이터

참조형 데이터는 메모리에서 객체의 참조를 저장하므로, 객체의 내용이 변경되면 참조하는 모든 변수에서 그 변경을 확인할 수 있음

  1. 특징
    • 가변성: 참조형 데이터는 그 내용이 변경될 수 있으며 객체의 참조만 저장함
    • 복잡성: 객체, 배열, 함수 등 복잡한 데이터 구조를 저장함
let obj1 = {a: 1, b: 'bbb'};
let obj2 = obj1; // obj2는 obj1을 참조함
obj1.a = 2; // obj1의 내용이 변경됨
// obj2.a도 2로 변경됨

:three: 불변성과 가변성

:pushpin: 2-1) 불변성

불변 데이터는 수정할 수 없는 데이터이다. 데이터를 변경하려면 새로운 데이터가 생성됨

  • 문자열 a에 새로운 값을 추가하여 b를 생성하면 a의 데이터는 그대로 유지됨
let a = 'hello';
let b = a + 'world';
// a는 'hello'
// b는 'hello world'

:pushpin: 2-2) 가변성

변 데이터는 수정할 수 있으며, 직접적으로 데이터의 내용이 변경됨.

  • 배열 arr에 4를 추가하면 배열의 내용이 직접적으로 변경됨
let arr = [1,2,3];
arr.push(4); // 배열의 내용이 수정됨
// arr => [1,2,3,4]

:four: 메모리 관리와 최적화

  1. 기본형 데이터
    • 메모리에서 값 자체가 저장되며, 불변성이 보장된다. 값이 변경되면 새로운 데이터가 생성되고 기존 데이터는 변경되지 않음
  2. 참조형 데이터
    • 메모리에서 객체의 참조를 저장하며, 객체의 내용은 변경될 수 있다. 참조형 데이터는 메모리 효율성과 관리 측면에서 주의가 필요함
  3. 메모리 누수
    • 참조형 데이터를 사용할 때는 가비지 컬렉터가 사용되지 않는 데이터를 수거하지만, 메모리 누수가 발생할 수 있으므로 코드작성 시 주의가 필요함

:fire: 마무리

JavaScript의 메모리 관리에 대해 알아보았다.
예시의 코드들은 짧지만 추후 프로젝트가 커지면 커질수록 코드가 정말 길어질 것이며 그럴경우 메모리 관리도 중요하다고 생각이 되며, 공부한 내용을 바탕으로 효율적인 코드를 작성할 수 있으면 좋을 것 같다.

태그:

카테고리: ,

업데이트: