Jin's IT Story
[JavaScript] 변수와 상수 본문
목차

프로그래밍 언어를 처음 접하는 이들에게 변수와 상수의 개념은 단순한 문법 요소처럼 보이지만, 실제로는 코드의 안정성과 가독성, 그리고 프로그램의 의도를 명확히 드러내는 데 중요한 역할을 한다.
특히 JavaScript는 동적 언어로서 변수의 선언 방식에 따라 동작이 크게 달라질 수 있으며, 이러한 차이를 이해하는 것은 견고한 코드를 작성하기 위한 첫걸음이라 할 수 있다.
본 글에서는 JavaScript에서 변수와 상수가 지니는 의미를 차분히 살펴보고, 두 개념이 프로그램 구조 속에서 어떤 역할을 수행하는지 또한, 실제 코드에서 어떻게 사용되는지 쉽게 이해할 수 있도록 설명한다.
변수의 개념과 역할
변수(variable)는 말 그대로 변할 수 있는 값을 담는 그릇이다. JavaScript에서는 let 키워드를 사용하여 변수를 선언하며, 이는 프로그램의 실행 과정에서 값이 바뀌는 상황을 자연스럽게 표현한다. 변수는 시간의 흐름에 따라 상태가 변화하는 로직을 구현할 때 필수적이며, 반복문이나 조건문과 같은 제어 구조 속에서 특히 자주 사용된다.
let counter = 0;
counter = counter + 1;
여기서 counter는 시간의 흐름에 따라 값이 증가하는 특성을 지닌다. 이러한 변화 가능성은 변수의 본질이며, 프로그램의 상태를 표현하는 데 중요한 역할을 한다.
변수를 조금 더 쉽게 이해하기 위해 일상 속 장면을 떠올려보면 도움이 된다.
예를 들어 책상 위에 놓인 연필꽂이를 생각해보자. 처음에는 연필이 꽂혀 있을 수 있지만, 시간이 지나면 볼펜이나 형광펜으로 바뀔 수도 있다. 연필꽂이라는 ‘그릇’은 그대로지만, 그 안에 담긴 내용물은 필요에 따라 언제든 바뀔 수 있다.
변수도 이와 마찬가지로, 이름은 그대로 유지되지만 그 안에 담긴 값은 프로그램의 흐름에 따라 자유롭게 변할 수 있다.
이러한 비유는 변수를 단순히 “값을 담는 상자”로 이해하는 데 도움이 되지만, 실제로 변수는 그보다 조금 더 기술적인 의미를 지닌다. 변수는 컴퓨터 메모리 속 특정 위치를 가리키는 이름표와도 같다. JavaScript는 변수를 선언하는 순간 메모리 어딘가에 공간을 만들고, 그 공간에 값을 저장한다. 그리고 변수 이름은 그 공간을 찾아가는 주소 역할을 한다. 우리가 변수 이름을 통해 값을 읽거나 수정할 수 있는 이유가 바로 여기에 있다.
또한 변수는 “스코프(scope)”라는 중요한 개념과 함께 동작한다. 스코프는 변수가 유효하게 사용될 수 있는 범위를 의미하는데, 예를 들어 함수 안에서 선언된 변수는 함수 밖에서 접근할 수 없다. 이는 프로그램의 안전성과 예측 가능성을 높이기 위한 장치로, 변수의 영향 범위를 명확히 구분함으로써 의도치 않은 값 변경이나 충돌을 방지한다. 이러한 스코프 개념은 코드가 복잡해질수록 더욱 중요한 역할을 하며, 변수의 사용을 보다 체계적으로 관리할 수 있게 해준다.
상수의 개념과 재할당 불가의 의미
상수(constant)는 한 번 정해진 값을 다시 바꿀 수 없는 선언 방식이다. JavaScript에서는 const 키워드를 사용하여 상수를 선언한다. 상수는 프로그램의 흐름 속에서 변하지 않는 값을 표현할 때 사용되며, 코드의 의도를 명확히 드러내는 데 큰 도움이 된다.
const PI = 3.141592;
이렇게 선언된 상수는 다시 다른 값으로 재할당할 수 없다. 만약 다음과 같은 시도를 한다면 오류가 발생한다.
PI = 3.14; // 오류 발생
그러나 상수로 선언된 값이 객체나 배열일 경우, 그 내부의 속성이나 요소는 변경이 가능하다는 점을 기억해야 한다. 이는 JavaScript에서 상수가 “값 자체”가 아니라 “변수의 재할당”을 막는 개념이기 때문이다.
const user = { name: "Jin" };
user.name = "Kim"; // 내부 값 변경 가능
여기서 user라는 상수는 같은 객체를 계속 가리키고 있으므로 문제가 없다. 단지 객체 안의 내용만 바뀐 것이다.
하지만 다음과 같은 코드는 불가능하다.
user = {}; // 오류 발생
이것은 상수 자체를 다른 값으로 바꾸려는 시도이기 때문이다.
상수는 변수를 설명할 때 사용했던 ‘연필꽂이’ 비유와 비교하면 훨씬 쉽게 이해된다.
상수는 마치 ‘뚜껑이 봉인된 상자’와 같다. 상자 겉면에는 이름이 붙어 있고, 그 상자 자체를 다른 상자로 바꾸는 것은 허용되지 않는다. 즉, 상수는 한 번 정해진 값이 다시는 바뀌지 않는다는 의미를 가진다.
하지만 상자 안에 들어 있는 물건이 ‘조립식’이라면 이야기가 조금 달라진다. 상자 자체는 바꿀 수 없지만, 상자 안에 들어 있는 조립식 장난감의 부품을 바꾸는 것은 가능하다. JavaScript에서 객체나 배열이 바로 이런 조립식 구조를 가진 데이터다.
그래서 상수로 선언된 객체의 내부 속성은 바뀔 수 있지만, 그 객체 자체를 통째로 다른 객체로 바꾸는 것은 허용되지 않는다.
이러한 동작 방식은 JavaScript의 데이터가 저장되는 방식과 깊은 관련이 있다.
JavaScript의 값은 크게 두 가지 종류로 나뉜다. 숫자나 문자열처럼 단순한 값은 ‘원시형(Primitive)’이라고 부르며, 이들은 값 자체가 메모리에 직접 저장된다. 반면 객체, 배열, 함수처럼 여러 요소로 이루어진 복잡한 데이터는 ‘참조형(Reference)’으로 분류되며, 실제 데이터가 저장된 위치를 가리키는 주소만 저장된다.
const는 바로 이 “주소”를 바꾸지 못하게 막는 역할을 한다. 즉, 상수로 선언된 참조형 데이터는 그 주소가 유지되는 한 내부 내용은 자유롭게 바뀔 수 있다. 상자 자체는 바꿀 수 없지만, 상자 안의 조립식 장난감은 얼마든지 수정할 수 있는 것과 같은 원리다.
이 차이를 이해하면 상수의 동작 방식이 훨씬 명확해지고, 왜 객체나 배열을 const로 선언해도 내부 값이 변할 수 있는지 자연스럽게 받아들일 수 있다.
변수와 상수의 선택 기준과 실무적 활용
변수와 상수 중 어떤 선언 방식을 선택할지는 코드의 목적과 데이터의 성격에 따라 달라진다. 일반적으로 값이 변할 필요가 없다면 상수를 사용하는 것이 권장된다. 이는 코드의 안정성을 높이고, 의도를 명확히 드러내기 때문이다. 반면 값이 시간에 따라 변화해야 한다면 변수로 선언하는 것이 자연스럽다.
실무에서는 다음과 같은 기준이 자주 사용된다.
- 기본적으로 const를 사용하고, 값이 변해야 할 때만 let을 사용한다.
- 객체나 배열을 다룰 때 const를 사용하더라도 내부 값이 변할 수 있음을 인지해야 한다.
- 반복문에서 증가하는 값이나 조건에 따라 변하는 값은 let으로 선언한다.
for (let i = 0; i < 5; i++) {
console.log(i);
}
실무 개발자들은 변수와 상수를 선택할 때 보통 아주 단순한 질문 하나를 던진다. “이 값은 바뀌어야 하는가?” 만약 값이 바뀌어야 한다면 let을 사용하고, 바뀌지 않아야 한다면 const를 사용한다. 이 기준은 단순하지만 매우 강력하며, 대부분의 상황에서 올바른 선택을 이끌어준다.
예를 들어 게임에서 점수는 계속 바뀌므로 let이 자연스럽다. 반면 서버 주소나 프로그램의 버전 정보처럼 절대 바뀌면 안 되는 값은 const로 선언하는 것이 맞다.
반복문에서 증가하는 숫자 역시 매 순간 값이 변하므로 let을 사용한다. 반대로 사용자 정보 객체처럼 내부 값만 바뀌면 되는 경우에는 const로 선언해도 문제가 없다.
또한 const를 사용하면 코드의 의도가 훨씬 명확해진다. 예를 들어 const MAX_USER = 100;이라는 코드를 보면, 이 값이 고정된 상한선이라는 사실을 누구나 쉽게 이해할 수 있다. 이런 작은 차이가 코드 전체의 가독성과 유지보수성을 크게 높여준다.
JavaScript에서 변수와 상수는 단순한 선언 방식의 차이를 넘어, 프로그램의 구조와 의도를 드러내는 중요한 개념이다.
변수는 변화하는 값을 담아 프로그램의 상태를 표현하며, 상수는 변하지 않는 값을 통해 코드의 안정성과 명확성을 보장한다. 특히 상수는 재할당을 막아 실수로 값이 바뀌는 상황을 방지하는 데 큰 역할을 한다.
또한 객체나 배열의 내부 값이 변경될 수 있다는 점은 JavaScript의 참조형 데이터 구조에서 비롯된 특성이며, 이를 이해하는 것은 상수 개념을 올바르게 활용하는 데 필수적이다.
기본적으로 상수를 사용하고, 값이 변해야 하는 상황에서만 변수를 사용하는 방식은 현대 JavaScript 개발에서 널리 권장되는 접근법이다.
'CodeStack > Javascript' 카테고리의 다른 글
| [JavaScript] 비동기 처리 방식과 Promise, Async Await 개념 완벽 정리 (0) | 2025.10.27 |
|---|