변수란 무엇인가? 왜 필요한가?
애플리케이션은 본질적으로 데이터를 처리하는 것입니다. 복잡한 애플리케이션도 결국 데이터를 입력 받아 처리하고, 그 결과를 사용자에게 제공합니다. 이러한 과정에서 변수는 프로그래밍 언어에서 데이터를 관리하는 핵심적인 역할을 담당합니다.
변수의 역할
변수는 메모리 상에 데이터를 저장하고, 저장된 데이터를 재사용할 수 있도록 지원합니다. 예를 들어, JavaScript 코드 10 + 20
은 데이터(10
, 20
)와 연산자(+
)를 포함하고 있습니다. 이 표현식을 컴퓨터가 계산하기 위해서는 해당 데이터와 연산의 의미를 알고 있어야 하며, 계산 결과인 30
은 메모리에 저장됩니다.
10 + 20
그러나 여기서 문제는 계산 결과를 저장했음에도 불구하고, 해당 데이터를 나중에 재사용할 수 없다는 점입니다. JavaScript는 개발자가 메모리에 직접 접근하는 것을 허용하지 않으며, 메모리를 직접 조작할 경우 심각한 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 변수를 사용합니다. 변수를 활용하면, JavaScript는 변수 이름을 통해 저장된 데이터의 메모리 위치를 찾을 수 있습니다.
즉, 변수는 메모리 공간 혹은 그 공간을 식별하기 위한 이름이라고 할 수 있습니다.
var result = 10 + 20;
위 코드에서는 10
, 20
을 메모리에 저장하고, 계산 결과인 30
을 result
라는 이름의 변수에 저장합니다. 이 과정을 할당이라고 하며, 저장된 값을 불러오는 과정을 참조라고 합니다.
식별자
- 변수 이름은 식별자(identifier)라고도 합니다. 식별자는 메모리 주소를 저장하는 공간으로, 변수뿐만 아니라 클래스, 함수 등 메모리 상에 저장될 수 있는 모든 것을 식별자라고 합니다.
변수 선언
변수를 사용하기 위해서는 반드시 선언해야 합니다. 변수 선언에는 var
, const
, let
키워드를 사용할 수 있습니다.
키워드 | 장점 | 단점 |
---|---|---|
var | 함수 스코프 내에서 유효, 호이스팅 가능 | 블록 스코프 무시, 재선언 가능으로 코드 복잡성 증가 |
const | 블록 스코프, 재할당 불가로 안정성 보장 | 초기화 시 값을 할당해야 함, 재할당 불가능 |
let | 블록 스코프, 재할당 가능 | 호이스팅 시 참조 에러 가능성 |
변수가 선언되었지만 값이 할당되지 않았다면, 자바스크립트는 자동으로 undefined
로 초기화합니다.
변수 선언, 실행 시점, 그리고 호이스팅
변수 선언과 그 실행 시점에 대해 알아보면, 자바스크립트 엔진이 코드를 처리하는 방식을 이해할 수 있습니다. 특히, 변수 호이스팅(variable hoisting)이라는 개념을 통해 자바스크립트에서 변수가 어떻게 처리되는지 볼 수 있습니다.
console.log(score); // 출력: undefined
var score; // 변수 선언문
위 코드를 실행하면, 변수 score
가 선언되기 전에 참조됩니다. 일반적으로, 변수를 선언하기 전에 그 변수를 사용하려고 하면 참조 에러(ReferenceError)가 발생해야 합니다. 그러나, 자바스크립트에서는 undefined
가 출력됩니다. 왜 그럴까요?
호이스팅(Hoisting)이란?
호이스팅은 변수(또는 함수) 선언문이 해당 스코프의 최상단으로 끌어올려진 것처럼 동작하는 자바스크립트의 기본 행동입니다. 실제로 코드가 재배치되는 것은 아니지만, 자바스크립트 엔진은 모든 선언문을 해당 스코프의 시작 부분에서 처리하는 것처럼 동작합니다.
실행 시점
- 코드 평가 단계: 자바스크립트 엔진은 코드 실행 전에 코드를 먼저 평가합니다. 이때, 변수와 함수 선언이 메모리에 저장됩니다. 변수는
undefined
로 초기화됩니다. - 코드 실행 단계: 실제 코드가 순차적으로 실행됩니다. 이 때, 변수에 값이 할당되거나 함수가 호출됩니다.
위 예시에서 console.log(score);
가 실행될 때, score
변수는 이미 선언되었고 undefined
로 초기화된 상태입니다. 따라서, 참조 에러가 발생하지 않고 undefined
가 출력됩니다.
호이스팅의 중요성
호이스팅을 이해하는 것은 변수 선언과 관련된 버그를 방지하고, 코드의 동작을 예측하는 데 중요합니다. 변수를 사용하기 전에 항상 선언해야 한다는 좋은 습관을 기르는 데 도움이 됩니다. let
과 const
를 사용하면 호이스팅 관련 혼란을 줄일 수 있지만, 이들도 호이스팅되지만, 초기화되지 않은 상태로 접근하려 할 때 참조 에러를 발생시킵니다.
이와 같이, 자바스크립트에서 변수 선언의 실행 시점과 호이스팅은 코드를 작성하고 디버깅할 때 이해해야 할 중요한 개념입니다.
값의 할당과 변수 선언
변수의 선언과 할당은 프로그래밍에서 매우 흔히 발생하는 작업입니다. 자바스크립트에서 이 두 과정은 다음과 같은 방식으로 처리됩니다:
변수 선언
변수를 선언하는 과정에서 자바스크립트 엔진은 먼저 변수의 이름을 메모리 공간에 등록합니다. 이 때, 변수는 undefined
로 초기화됩니다. 이 초기화 과정이 바로 변수 선언이 실행되는 시점, 즉 호이스팅(hoisting)의 일부입니다.
값의 할당
변수에 값을 할당할 때, 자바스크립트 엔진은 새로운 메모리 공간을 확보하고 그곳에 할당할 값을 저장합니다. 이 과정은 실제 코드가 실행되는 시점, 즉 런타임에 발생합니다.
var score; // 변수 선언
score = 80; // 값의 할당
위 코드에서 var score;
는 선언 과정을 나타내며, score = 80;
은 할당 과정을 나타냅니다. 선언과 할당을 한 문장으로 결합할 수도 있습니다:
var score = 80; // 변수 선언과 값의 할당
이 문장은 대중적으로 많이 사용되며, 코드를 간결하게 만들어 줍니다.
주의할 점
변수의 선언이 런타임 이전에 먼저 실행되며, 값의 할당은 런타임에 실행된다는 점입니다. 초기에 undefined
로 할당된 값을 나중에 실제 값으로 덮어쓰는 것이 아니라, 새로운 메모리 공간에 값을 저장하는 것입니다. 이로 인해 변수는 런타임에 결정된 값으로 업데이트 됩니다.
이러한 과정을 이해하는 것은 자바스크립트의 실행 컨텍스트와 호이스팅 메커니즘을 이해하는 데 중요하며, 프로그램의 흐름을 제어하고 버그를 예방하는 데 도움이 됩니다.
💡 핵심 포인트: 변수의 선언과 할당은 프로그래밍의 기본이지만, 그 과정에서 일어나는 메커니즘은 복잡할 수 있습니다. 자바스크립트에서는 이 두 과정이 실행 컨텍스트의 생성 및 코드 실행 단계에 따라 분리되어 처리되며, 이를 정확히 이해하는 것이 중요합니다.
값의 재할당과 메모리 관리
변수에 새로운 값을 할당하는 행위를 재할당이라고 합니다. 이는 프로그래밍에서 매우 흔한 작업으로, 이미 값이 할당되어 있는 변수에 다른 값을 또 할당하는 것을 의미합니다.
var score = 80; // 변수 선언과 초기 값의 할당
score = 90; // 값의 재할당
var
키워드를 사용하여 선언된 변수는 재할당이 가능합니다. 재할당 과정에서 현재 변수에 저장된 값은 새로운 값으로 대체됩니다. var
로 선언된 변수는 초기에 undefined
로 초기화 되는데, 엄밀히 말해서 처음으로 값을 할당하는 것 역시 재할당의 일종입니다.
💡 통찰: 변수에 새로운 값을 재할당할 수 없게 되면, 그 변수는 사실상 상수가 됩니다. 이러한 변수는 값이 변하지 않으므로 프로그램 내에서 안정적인 참조를 제공합니다.
재할당을 통해 변수의 이전 값은 더 이상 사용되지 않게 되며, 메모리 상에서도 참조되지 않는 상태가 됩니다. 이러한 더 이상 필요 없게 된 메모리 공간을 정리하는 역할을 가비지 콜렉터가 수행합니다.
가비지 콜렉터는 애플리케이션에 할당된 메모리 공간을 주기적으로 검사하여, 더 이상 사용되지 않는 메모리를 자동으로 해제하는 기능을 담당합니다. 이는 매니지드 언어의 주요 특징 중 하나입니다.
구분 | 설명 | 장점 | 단점 | 예시 |
---|---|---|---|---|
매니지드 언어 | 메모리 관리를 개발자 대신 언어가 알아서 처리하는 프로그래밍 언어 유형입니다. | 메모리 관리에 대한 부담이 줄어들며, 메모리 누수 등의 문제를 예방할 수 있습니다. | 직접 메모리 관리를 할 수 없어 성능 최적화에 제약이 있을 수 있습니다. | 자바스크립트, 파이썬, 자바 등 |
언매니지드 언어 | 메모리 관리를 개발자가 직접 수행해야 하는 프로그래밍 언어 유형입니다. | 성능 최적화의 여지가 더 많습니다. | 메모리 누수와 같은 문제가 발생할 위험이 있습니다. | C, C++ 등 |
메모리 관리의 측면에서 매니지드 언어는 개발자에게 높은 수준의 편리성을 제공하지만, 때로는 세밀한 최적화가 어려울 수 있습니다. 반면, 언매니지드 언어는 더 깊은 수준의 메모리 관리를 가능하게 하지만, 그만큼 더 큰 주의가 필요합니다.
'Javascript' 카테고리의 다른 글
자바스크립트 데이터 타입은 뭐가 있지? (0) | 2024.04.09 |
---|---|
표현식과 문은 무엇일까? (0) | 2024.04.09 |
mouseenter / mouseover 차이 (2) | 2022.09.05 |
search() / match() / charAt() (7) | 2022.08.22 |
[javascript] indexOf() || lastIndexOf() (3) | 2022.08.17 |