es6의 const 와 let
간략하게 둘의 공통점과 차이점을 나열하면 아래처럼 말 할 수 있다.
공통점 : 재선언이 불가능하다
차이점 : let 은 재할당이 가능하지만, const 는 재할당이 불가능하다
그렇다면 const 와 let 은 어떤 식으로 쓰이고 이해될까?
누군가 위 코드를 보면 coffee와 caffeine은 재할당되는 변수라고 생각 할 것이다. 하지만 다른 부분에서 재할당이 없다면?
let 보다는 const 를 쓰는 편이 좋다.
왜?
예상치 못한 변수의 변경으로 인한 버그가 발생할 수 있기 때문이다.
함수형 프로그래밍에서 변경가능한 상태를 모두 변경불가능한 상태로 만들어 side-effect 를 막는 것 처럼, 자바스크립트에서도 변하는 부분을 최소화 시켜주는 편이 좋다. 따라서 위 코드도 재할당이 없다면 const 를 사용하는 것이 좋다.
그러면 어떤 식으로 const를 사용하면 좋을까?
1. const 를 기본으로 사용
2. 재할당이 필요한 경우에만 let 을 사용
3. var 는 ES2015에서는 사용하지 말자
여기서 하나 더 궁금한게 떠오른다.
재할당 및 재선언이 불가능한 const 는 immutable 한 것일까?
const 는 불변인가
const 로 선언한 apple에 할당된 값은 절대 변하지 않는다. 한번 red 가 할당되면 blue로 바꿀 수 없다.
하지만 이것이 constant 하거나 immutable 함을 의미하지는 않는다. 아래의 예를 보자.
const myBrain 에 할당된 오브젝트에 key-value 가 추가되고 변경되었다. 아래도 마찬가지다.
const 변수에 할당된 값은 절대 바뀌지 않는다면서 왜 이런일이 벌어진걸까?
왜냐하면 자바스크립트에서 변수에 오브젝트가 할당될 때는 오브젝트 자체가 아니라 오브젝트를 가리키는 주소가 할당된다.
수수깨끼는 모두 풀렸어.
const 에 할당된 것은 오브젝트가 아니라 그 주소였다.
const 변수에 할당된 것은 오브젝트의 주소다. 이것은 재할당되지 않고 불변한다. 그러나 오브젝트는 const 에 바인딩 되는 것이 아니기에 당연하게도 변경이 가능하다.
const 의 사용이 모든걸 해결해 줄까?
그렇지는 않은 듯 하다.
위 링크의 글을 읽어보면 변수의 사용 자체가 좋지 않은 프로그램 습관이라고 말하고 있다.
소프트웨어의 복잡성은 상태(state)에 있고, 좋은 프로그래밍은 결국 상태를 효과적으로 관리하는 방법을 찾는 겁니다. 객체지향 프로그래밍은 캡슐화(encapsulation)를 통해 서로 연관된 상태를 한 곳에 모아서 상태 관리의 복잡성을 줄이고, 함수형 프로그래밍은 불변 데이터 타입(immutable data type)을 통해 아에 상태를 만들지 않거나, 모나드와 같은 수학적인 구조를 이용해 상태를 효과적으로 제어합니다.
const 가 모든 변수를 통제하지는 못하지만 var 를 사용하는 것 보다는 나은 방법인 것 같다. 애초에 변경가능한 부분을 최소화 하는 것이 조금 더 근본적인 해결방법이 아닐까 생각한다.
자세한 내용은 위 링크 ‘왜 변수는 나쁜가’를 참고하기 바란다.
const 변수에 할당된 배열에 어떻게 push 가 가능한지 궁금했는데, 의외로 기본적인 곳에 답이 있었다. 애초에 좀 더 깊이 있게 들여다 보았으면 아하! 하고 알았을 것 같은데 그러지 못한 나의 두뇌와 습관이 아쉽다.
잘못된 부분이나 추가할 부분들에 대한 의견은 언제나 환영입니다.
참고자료