Immutability 변경불가성

developer.do·2023년 6월 9일
0

Immutability 는 객체가 생성된 이후에 그 상태를 변경할 수 없는 디자인 패턴을 의미한다.

1. Javascript의 원시타입은 변경 불가능한 값이다.

  • boolean
  • null
  • undefined
  • number
  • string
  • symbol

위 원시 타입을 제외한 모든 값은 객체타입으로 변경이 가능한 값이다.
Object -> mutable value
즉 객체는 새로운 값을 만들 필요없이 직접 변경이 가능하다.

var str = 'Hello';
str = 'world';

식별자 str은 메모리에 생성된 문자열의 'Hello'의 메모리주소를 가리킨다.
그리고 두번째 str은 기존의 'Hello'를 수정하는 것이 아니라, 
  새로운 문자열 'world'를 메모리에 생성하고 식별자 str은 이것을 가리킨다.

String은 immutable이기 때분에 변경이 불가능하다.

var statement = 'I am an immutable value';
var otherSTr = statement.slice(8,17);

console.log(otherStr) / immutable
console.log(statement) / i'am an immutable value
2행에서 String 객체의 slice 메소드는  statement변수에 저장된 문자열을 변경하는 것이 아니라, 새로운 문자열을 생성하고 반환하고 있는 것이다.
이유는 문자열은 변경이 불가한 immutable 이기 때문이다.

배열은 immutable이 아니여서 변경이 가능하다.

var arr =[]
console.log(arr.length) //0

var v2 = arr.push(2);
console.log(arr.length) // 1

배열(객체) 메소드 push는 직접 대상 배열을 변경하기 때문에
기존 arr의 배열안에 2가 들어간다.

이유는 배열은 객체이자, immutable이 아니기 때문이다.

String 타입은 Immutable 하다.

var user = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var myName = user.name; // 변수 myName은 string 타입이다. 따라서 직접 변경이 불가능하다.

user.name = 'Kim';
console.log(myName); // Lee

myName = user.name;  // 재할당
console.log(myName); // Kim

객체 타입은 mutable하다.

var user1 = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var user2 = user1; // 변수 user2는 객체 타입이다. 따라서 user2.name으로 값을 바꾸면 바로 변경이 가능하다.

user2.name = 'Kim';

console.log(user1.name); // Kim
console.log(user2.name); // Kim

0개의 댓글