JavaScript 객체와 불변성

정성현·2022년 5월 17일
0

항해99

목록 보기
16/33

기본 자료형과 객체 자료형

기본 자료형은 이전 글에서 자세히 적어놓았으니 오늘은 객체 자료형에 대해서 알아보자.

  • 객체 자료형 : 자바스크립트(뿐만 아니라 거의 모든 컴퓨터 개념)에서 객체는 식별자로 참조할 수 있는, 메모리에 저장된 값이다.
    자바스크립트 객체는 키와 값의 매핑이다. 키는 문자열이고 값은 다른 어떤 값도 될 수 있다.

객체 자료형의 종류

  • Array(배열)
  • Dictionary
  • new 함수

객체자료형과 기본 자료형의 큰 차이점

객체 자료형과 기본형 자료형의 가장 큰 차이점은 Reference(참조)에 있다. 기본형 변수는 다른 변수에 값을 할당하거나 함수 인자로 넘길 때 값을 복사하여 전달하지만, 객체는 메모리 주소를 복사시키며 값 자체는 복사되지 않아 같은 객체를 참조하게 된다.
즉, 함수를 호출할 때 new을 붙이면 새로운 객체를 만든 후에 이를 리턴한다.

얕은 복사와 깊은 복사

얕은복사는 복사한 변수에 다른 값을 넣어도 변경되지 않지만 깊은 복사는 기존의 값도 변경이 된다.

shallow copy(얕은 복사)와 deep copy(깊은 복사)인데요. shallow copy는 가장 상위 객체만 새로 생성되고 내부 객체들은 참조 관계인 경우를 의미합니다. deep copy는 내부 객체까지 모두 새로 생성된 것을 의미합니다.

얕은 복사와 깊은 복사를 그림으로 나타내면 위에 같은 그림으로 설명이 가능하다.

불변 객체의 필요성

  • 불변객체의 필요성에 대해 논하기 전에 불변객체란 것은 어떤 객체내부의 프로퍼티들을 변경할 수 없도록 되어있는 객체를 뜻한다.
  • 불변객체가 필요한 이유는 무엇일까 앞서 얕은복사와 깊은복사에 대해 알아보았다. 기존의 자료형들은 복사한 값을 변경해도 기존의 값이 변경되지 않았지만 깊은 복사는 다르다. 하지만 이 깊은 복사는 객체를 복사할 때 생긴다. 만약 하나의 객체에 이름과 성별 나이 이러한 정보들이 담겨있다고 가정해보자 그럼 이 객체를 복사해서 이름, 성별, 나이만 바꿔주어서 하나하나 다른 객체를 만들려고 할 때 문제가 생긴다 왜냐하면 깊은 복사가 이루어져서 결국 그 객체와 똑같은 정보만 담은 객체만 복사가 되기 때문이다.
let people = {
		name : 'a',
        gender : 'male',
        age : '10,
        // 더욱 많은 프로퍼티가 있다고 가정해보자
        
 const changeName = function(people, newname)
 {
 let newpeople = people;
 newpeople.name = newname;
 return newpeople;
 }
 let people1 = changeName(people, "b")
 let people2 = changeName(people, "c")
 let people3 = changeName(people, "d")
 let people4 = changeName(people, "e")
 //console.log를 찍으면 결국 name e로 모두 동일하다.
 객체를 복사해서 name에 newname으로 바꿔주었지만 깊은 복사가 일어나서 해당 객체의 프로퍼티 값도 같이 바꿔버리게 된 것이다.
 결국 이러한 문제를 해결하기위해 불변 객체가 필요하다.
    
  • 문제해결 방안

모든 변수가 같은 주소공간을 바라보기 때문에 생기는 현상, 이러한 문제를 해결하기 위해 원본 객체 내부의 값들을 복사한 새로운 객체를 생성하여 변수에 할당해주어야 한다.

const changeName = function(people, newname)
{
return {
name : newname,
gender : people.gender,
age : people.age,
key : people
	   }
}

javaScript의 불변객체를 만드는 방법

  • jvascript는 java와 같이 변수에 접근제한자를 부여하여 외부에서 변경이 불가능하게 하는 등을 할 수 가 없다. 따라서 객체를 불변하게 만들기 위해서는 약속을 통해 지켜야한다.
    위 코드와 같이 people객체에서 이름만이 변경한 새로운 객체를 만들때에는 앞서 만든 changeName()함수를 이용해서만 객체를 만들 것이라는 약속등을 모두가 지켜야 비로소 people객체가 불변객체가 되는 것이다.
  • 라이브러리를 통한 불변객체 강제화
    객체의 불변을 도와주는 라이브러리가 존재하고 약속이란 것은 깨지기 쉽기 때문에 사람간의 규칙으로 프로젝트를 관리하기보다는 강제화 할 수 있는 라이브러리를 사용하는 것을 추천한다.
profile
I want to be programmer

0개의 댓글