Logo

[ES2015] const로 상수 선언하기

이번 포스팅에서는 ES2015에서 let과 함께 자바스크립트에 추가된 const 사용법에 대해서 알아보도록 하겠습니다.

let 사용법에 대해서는 아래 포스팅들을 참고바라겠습니다.

매직 넘버

아래 코드에서 findUser 함수는 안자로 받은 id 값이 100보다 작은지 여부에 따라서 로직이 분기되어 있습니다. 그리고 id 값이 100보다 큰 경우, 가짜 사용자 객체를 생성 후, name 속성값의 길이가 50보다 큰지 여부에 따라 다시 한 번 로직이 분기되고 있습니다.

function findUser(id) {
  if (id < 100) {
    let failureMsg = "잘못된 아이디입니다!";
    console.log(failureMsg);
  } else {
    let successMsg = "사용자를 조회하였습니다.";
    console.log(successMsg);
    let fakeUser = { id: id, name: "사용자 #" + id };
    if (fakeUser.name.length > 50) {
      fakeUser.name = fakeUser.name.slice(0, 50) + "...";
    }
    console.log(fakeUser);
  }
}

예제와 같은 코드에서 100, 50과 같은 숫자 리터럴은 흔히 매직 넘버라고 불립니다.

왜냐하면, 코드 최초 작성자가 아닌 이상 이와 같은 숫자의 정확한 용도를 파악하기 어려워서 유지보수가 어렵기 때문입니다.

그리고 이러한 숫자가 코드 베이스 전반에 흩어져 있는 경우, 이 값이 바뀌었을 때 일일이 찾아서 변경해줘야하기 때문에 애플리케이션의 안정성을 떨어뜨리게됩니다.

상수 선언하기

자바스크립트에서는 const 키워드를 이용해서 상수를 선언할 수 있습니다. 여기서 상수란 한 번 선언되어 초기화되면 다시 선언되거나 할당될 수 없는 변수를 의미합니다.

따라서 예제 코드는 다음과 같이 개선할 수 있습니다.

function findUser(id) {
  const MIN_USER_ID = 100;
  const MAX_NAME_LENGTH = 50;
  if (id < MIN_USER_ID) {
    let failureMsg = "잘못된 아이디입니다!";
    console.log(failureMsg);
  } else {
    let successMsg = "사용자를 조회하였습니다.";
    console.log(successMsg);
    let fakeUser = { id: id, name: "사용자 #" + id };
    if (fakeUser.name.length > MAX_NAME_LENGTH) {
      fakeUser.name = fakeUser.name.slice(0, MAX_NAME_LENGTH) + "...";
    }
    console.log(fakeUser);
  }
}

상수 선언을 위해서 기존 코드 보다 두 줄이 더 추가되었지만, 대신 읽기 쉽고 유지 보수하기 용이한 코드를 얻게 되었습니다.

const 사용시 주의 사항

const 키워드로 선언된 변수는 재할당 뿐만 아니라 재선언도 불가능합니다. 즉, 다음과 같은 코드는 구문 오류를 일으킵니다.

const MIN_USER_ID = 100;
// ...
const MIN_USER_ID = 101;

또한, const는 선언과 동시에 반드시 초기화가 되어야 합니다. 따라서 다음과 같은 선 선언, 후 할당 코드도 허용되지 않습니다.

const MIN_USER_ID;
// ...
MIN_USER_ID = 100;

마지막으로 constlet과 마찬가지로 block scope을 가집니다. 따라서 특정 블록 내부에서 선언한 상수는 블록 외부에서 접근이 불가합니다.

마치면서

지금까지 자바스크립트에서 상수 선언을 위해 제공하는 const 키워드에 대해서 알아보았습니다.

그럼, varlet, const 중에서 어떤 것을 이용하여 변수를 선언해야 할까요?

저는 개인적으로, ES2015를 지원하는 자바스크립트 엔진에서 돌아가는 코드라면 var를 쓸 이유는 없다고 봅니다. 이전 포스팅에서 설명드렸던 것 처럼 여러 가지 예측할 수 없는 상황들이 발생하기 때문입니다.

letconst는 변수가 프로그램의 생명 주기 동안 변경될 수 있는지 없는지, 그리고 로직의 문맥에 따라서 결정해야 할 일이라 봅니다.

참고

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const