변수란 무엇인가? 왜 필요한가?
변수는 프로그래밍 언어에서 데이터 관리를 위한 핵심 개념
- 컴퓨터는 CPU를 통해 연산하고, 메모리를 통해 데이터를 기억함
- 메모리 : 데이터를 기억하는 메모리 셀의 집합체 (메모리 셀 : 1바이트 (8비트))
- 컴퓨터는 1바이트 단위로 데이터를 저장하거나 읽음
- 메모리 셀 : 고유의 메모리 주소를 가짐
- 메모리 주소 : 메모리 공간의 위치
- 연산 결과를 재사용하려면 저장된 메모리 공간에 직접 접근해야 됨
- 메모리 주소 직접 접근은 치명적 오류 발생 위험이 있음 ⇒ 값이 바뀌면 그 값과 연관된 값들이 모두 바뀔 수 있기 대문
- 메모리 : 데이터를 기억하는 메모리 셀의 집합체 (메모리 셀 : 1바이트 (8비트))
⇒ 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어들여 재사용하기 위해 변수 사용
변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름 ⇒ 값을 저장하고 참조하는 매커니즘으로, 값의 위치를 가리키는 상징적인 이름
- 변수 이름 : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름
- 변수 값 : 변수에 저장된 값
- 변수에 값을 저장하는 것 : 할당, 대입, 저장 (assignment)
- 변수 값 읽어들이는 것 : 참조 (reference)
식별자
- 식별자 : 어떤 값을 구별해서 식별할 수 있는 고유한 이름 (변수 이름과 같은 의미)
- 값은 메모리 공간에 저장되어 있고 식별자는 메모리 공간에 저장되어 있는 값을 구별해서 식별해야 됨 ⇒ 식별자는 어떤 값이 저장되어 있는 메모리 주소를 기억해야 됨
- 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며, 매핑 정보도 메모리에 저장
⇒ 식별자는 값이 아닌 메모리 주소를 기억하고 있음 (즉, 식별자는 메모리 주소에 붙인 이름)
+) 식별자는 네이밍 규칙을 준수해야 하며, 선언에 의해 자바스크립트 엔진에 식별자의 존재를 알림
변수 선언
- 변수 선언 : 변수를 생성하는 것
- 값을 저장하기 위한 메모리 공간 확보 → 변수 이름과 메모리 공간 주소를 연결 ⇒ 값을 저장할 수 있게 준비
- 변수 선언에 의해 확보된 메모리는 해제되기 전까지 누구도 그 공간 사용 X
- 변수를 사용하려면 반드시 선언이 필요
- 자바스크립트 엔진이 변수 선언 시 수행하는 단계
- 선언 단계 : 변수 이름을 등록하여 자바스크립트 엔진에 변수의 존재를 알림
- 초기화 단계 : 값을 저장하기 위한 메모리 공간 확보 후, undefined를 할당하여 초기화
- 변수 선언 키워드
- var
- 변수 선언 시 선언 단계와 초기화 단계 동시 진행 = 선언할 때 값 할당하지 않아도 됨 (자동으로 undefined라는 값이 할당되어 초기화되기 때문)
- 초기화는 선언 후 최초로 값을 할당하는 것인데, 초기화를 하지 않으면 메모리 공간에 이전에 사용했던 값이 남아 garbage value가 생길 수 있다. 이러면 값을 할당하지 않은 채 변수 값을 참조하면 garbage value가 나올 수 있다. 하지만 var 키워드는 암묵적으로 초기화를 수행하므로 이러한 위험으로부터 안전하다.
- 함수 레벨 스코프를 지원하여 의도치 않게 전역 변수가 선언될 수 있음
- 재할당 가능
- 변수 선언 시 선언 단계와 초기화 단계 동시 진행 = 선언할 때 값 할당하지 않아도 됨 (자동으로 undefined라는 값이 할당되어 초기화되기 때문)
- let
- 블록 레벨 스코프 지원
- 변수 선언 시 선언 단계와 초기화 단계 동시 진행
- 재할당 가능
- const
- 블록 레벨 스코프 지원
- 변수 선언 시 초기화 단계 필수 (var나 let 키워드처럼 암묵적으로 초기화를 수행하지 X)
- 재할당 불가능
- var
변수 선언의 실행 시점과 변수 호이스팅
- 변수 선언은 런타임이 아니라 그 이전 단계에서 먼저 실행됨
- 자바스크립트 언어는 인터프리터 언어라 한 줄식 순차적으로 수행되는데, 실행 전 소스코드 평가 과정에서 자바스크립트 엔진이 모든 선언문을 모아 먼저 실행 → 소스코드 평가 과정이 끝나면 모든 선언문을 제외하고 소스코드를 한 줄씩 순차적으로 실행
- 자바스크립트 엔진은 변수 선언문이 소스코드 어디에 있든 다른 코드보다 먼저 실행 ⇒ 변수 선언문 이전에 변수 참조 가능
- var 키워드는 undefined를 암묵적으로 할당하여 초기화해주고, 자바스크립트 엔진이 모든 선언문을 먼저 실행하기 때문에 참조 에러가 발생하지 않고 undefined 출력
console.log(score); // undefined 출력
var score;
⇒ 변수 호이스팅 : 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징
값의 할당
- 변수에 값 할당 시 할당 연산자 = 사용 (우변의 값을 좌변의 변수에 할당)
- 자바스크립트 엔진은 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행
- 변수 선언 : 런타임 이전인 소스코드 평가 과정에서 실행
- 값의 할당 : 소스코드가 순차적으로 실행되는 런타임에 실행
// 두 코드 모두 자바스크립트 엔진은 변수 선언과 값의 할당으로 나누어 각각 실행
var score;
score = 100;
var score = 100;
값의 재할당
- 재할당 : 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것
- 재할당이 불가능한 변수 : 상수 (const) ⇒ const 키워드는 재할당 불가
- 재할당을 하면 이전 값이 있던 메모리 주소에 새로운 값을 저장하는 것이 아니라, 새로운 메모리 공간을 확보하고 값을 저장하는 것
- 재할당하면 이전 값이 들어있는 메모리 공간은 가비지 콜렉터에 의해 자동으로 메모리에서 해제됨
- 언제 해제될지는 예측 X
+) 가비지 콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더이상 사용하지 않는 메모리를 해제하는 기능 ⇒ 메모리 누수 방지
식별자 네이밍 규칙
- 특수문자를 제외한 문자, 숫자, 언더스코어 (_), 달러 기호 ($) 포함 가능
- 특수문자를 제외한 문자, 언더스코어 (_), 달러 기호 ($) 로 시작해야 됨 ⇒ 식별자 이름 숫자로 시작할 수 X
- 예약어는 식별자로 사용할 수 X
- 예약어 : 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어
await, break, case, catch, class, const, continue, debugger, default, delete, do, else, enum, export, extends, false, finally, for, fuction, if, implements, import, in, interfaseof, interface, let, new, null, package, private, protected, public, return, super, static, switch, this, throw, true, try, typeof, var, void, while, with, yield * implements와 yield 는 식별자로 사용 가능하지만 strict mode에서는 사용 불가
- 네이밍 컨벤션 : 하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 명명 규칙
- 카멜 케이스 (firstName)
- 스네이크 케이스 (first_name)
- 파스칼 케이스 (FirstName)
- 헝가리언 케이스 (strFirstName) ⇒ type + identifier
+) ECMAScript 사양에 정의된 객체와 함수들도 카멜 케이스와 파스칼 케이스를 사용하고 있어서 코드 전체의 가독성을 높이려면 카멜 케이스와 파스칼 케이스를 따르는 것이 유리하다.
'Web > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
[모던 자바스크립트 Deep Dive] 06. 데이터 타입 (0) | 2023.08.01 |
---|---|
[모던 자바스크립트 Deep Dive] 05. 표현식과 문 (0) | 2023.07.19 |
[모던 자바스크립트 Deep Dive] 03. 자바스크립트 개발 환경과 실행 방법 (1) | 2023.07.19 |
[모던 자바스크립트 Deep Dive] 02. 자바스크립트 (0) | 2023.07.18 |
[모던 자바스크립트 Deep Dive] 01. 프로그래밍 (0) | 2023.07.18 |