thumbnail
[JS] JavaScript에서 객체 동결
JS
2023.01.10.

최종 코딩 테스트 문제를 다시 구현해보았다. 이 글에서 Java로 구현된 코드에선 shuffle메서드를 사용하기 위해 Enum 클래스를 활용하는 것 같았다고 말했었는데, 다시 공부하여 구현해보니 shuffle 메서드의 인자로 원소가 숫자가 아닌 배열이 들어오면 오류를 뱉어내는 것과 Enum 객체 활용과는 상관이 없었다..(그 당시, Java에서 Enum 객체를 만들면 그 열거되어있는 필드 순서대로 인덱스 마냥 숫자를 뽑을 수 있는 내장 메서드가 있나 싶었다..ㅎ) 단순히 음식이 나열 되어 있는 배열 원소의 인덱스들로 새 배열을 만들어서 그 배열을 shuffle의 인자로 넘겨주면 됐었다.. 어찌보면 단순했었는데 시험 전 날엔 왜 그렇게 생각할 수 없었을까.. 난 바보였다.(한 마디로 내가 막힌 shuffle 메서드에서의 문제는 Enum과 전혀 관련 없다는 것이다 ^_^)


서론이 너무 길었다. Enum에 대해 시험 전 날 공부를 하면서 안 것이 있었다. JavaScript에서 Enum의 역할을하는 객체를 만들기 위해선 Object.freeze()를 해주면 된다고 했다. 그러면서 객체 동결에 대해 알았던 것 같다. Enum은 상수가 열거되어있는 것이므로 외부로 인해 값이 변경되면 안되고 그래서 불변 객체여야하는데 그러기 위해 Object.freeze()를 사용하는 것이었다. 최종 코딩 테스트 문제를 다시 구현해보면서 활용하라고 주어진 카테고리와 메뉴에 대한 데이터는 외부로 인해 변경되면 안된다고 생각했기 때문에 그 데이터들을 Object.freeze()를 해주었다. 그런데 minuet이 코드리뷰를 해주며 이 부분에 대해서 하나 알려주었다..

미누리뷰


Object.freeze()는 얕은 동결로, 중첩 객체까지는 영향을 주지 못한다고 한다. 직접 실행해본 결과 양식에 돈가스가 추가되는 것을 확인하였다.

오류


객체의 중첩 객체까지 동결하여 변경이 불가능한 읽기 전용의 불변 객체를 구현하려면 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 한다고 한다.

깊은동결


deepFreeze 메서드를 하나 만들어 깊은 동결을 적용한 결과 객체내의 객체까지 동결된 것을 확인할 수 있다.

완료결과


이 처럼 객체 데이터의 불변성을 보장하기 위해서 다음부터는 deepFreeze를 구현하여 적용시켜야겠다. 외부에서 데이터를 바꿀 수 있게 한다는 것은 치명적인 오류를 범할 수 있다는 걸 프리코스를 하면서 알게되었다. 좋은 정보 알려준 minuet에게 감사를..


Reference

  • 모던 자바스크립트 Deep Dive 16.5.4 불변 객체
반갑습니다. 누군가에겐 도움이 되는 글을 쓰도록 노력하겠습니다.
© October.2022 yeopto, Powered By Gatsby.