변수는 프로그래밍 언어에서 데이터를 관리하기 위한 핵심 개념 !
변수 (variable)
하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘, 값의 위치를 가리키는 상징적인 이름
프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행
[변수에 여러 개의 값을 저장하는 방법]
- 하나의 값을 저장하기 위한 메커니즘. 여러 개의 값을 저장하려면 여러 개의 변수 사용
- 단, 배열이나 객체 같은 자료구조 사용시 관련 있는 여러 개의 값을 그룹화해 하나의 값처럼 사용
//변수는 하나의 값을 저장하기 위한 수단
const userId = 1;
const userName = 'Lee';
//객체, 배열 같은 자료구조 사용시 여러 개의 값을 하나로 그룹화해 하나의 값처럼 사용
const user = { id: 1, name: 'Lee' };
const users = [
{ id: 1, name: 'Lee' },
{ id: 2, name: 'Kim' }
];
- 할당 : 변수에 값을 저장하는 것 (대입, 저장)
- 참조 : 변수에 저장된 값을 읽어 들이는 것
- 변수 이름 : 사람을 위해 사람이 이해할 수 있는 언어로 값이 저장된 메모리 공간에 붙인 상징적 이름
변수 이름을 사용해 참조 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 저장된 값 반환
따라서 좋은 이름, 즉 변수에 저장된 값의 의미를 파악할 수 있는 이름은 가독성을 높이는 효과를 줌
코드는 컴퓨터에 내리는 명령이지만 개발자를 위한 문서.
따라서 개발자 의도를 나타내는 명확한 네이밍은 코드를 이해하기 쉽게 하며 협업과 품질 향상에 도움을 줌 (가장 중요)
[변수 선언]
변수를 생성하는 것
값을 저장하기 위한 메모리 공간 확보, 변수 이름과 확보된 메모리 공간의 주소를 연결해 값을 저장할 수 있게 준비하는 것
변수를 사용하려면 반드시 [선언]이 필요! (var, let, const)
이 때, var 키워드는 블록 레벨 스코프를 지원하지 않고 함수 레벨 스코프를 지원하는 등 여러 단점 존재
var score; //변수 선언 (변수 선언문)
위 변수 선언문은 변수 이름을 등록하고 저장할 메모리 공간 확보함
변수 선언 후 아직 변수에 값을 할당하지 않음
따라서 변수 선언에 의해 확보된 메모리 공간은 비어 있을 것이라 생각
But 확보된 메모리 공간에 자바스크립트 엔진에 의해 undefined 라는 값이 암묵적 할당되어 초기화
[undefined] 자바스크립트에서 제공하는 원시 타입의 값.
❗️자바스크립트 엔진의 변수 선언 2단계
1. 선언 단계 : 변수 이름을 등록해 자바스크립트 엔진에 변수 존재 알림
2. 초기화 단계 : 값 저장하기 위한 메모리 공간 확보, 암묵적으로 undefined 할당해 초기화
[변수 선언 실행 시점과 변수 호이스팅]
console.log(score); //undefined
var score; //변수 선언문
호이스팅 : 변수 선언문이 코드의 선두로 끌어 올려진 것 처럼 동작하는 JS 고유의 특징
- console.log(score); 의 값이 undefined 인 이유?
변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행되기 때문
JS 엔진은 소스코드를 한 줄씩 실행하기 앞서 소스코드의 평과 과정을 거치며 소스코드 실행위한 준비
- 변수 선언 포함 모든 선언문(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아 먼저 실행 (var score;)
- 평과 과정 끝나면 변수 선언 포함한 모든 선언문 제외하고 소스코드 한 줄씩 순차적 실행 (console.log(score);)
[값의 할당]
변수에 값 할당 할 때 할당 연산자(=) 사용
❗️주의 : 변수 선언은 소스코드가 순차적 실행되는 시점(런타임) 이전에 먼저 실행
값의 할당은 소스코드가 순자적 실행되는 시점(런타임)에 실행
console.log(score); //undefined
var score; //(1) 변수 선언
score = 80; //(2) 값의 할당
console.log(score); //80
(1) 변수 선언 : 런타임 이전 실행
(2) 값의 할당 : 런타임에 실행 (이미 변수 선언이 완료된 상태, undefined로 초기화되어 있음)
→ socre 변수 값은 undefined에서 새롭게 할당한 숫자 80으로 변경(재할당)
변수에 값 할당 할 때 이전 값 undefined가 저장되어 있던 메모리 공간에 80을 새롭게 저장하는 것 아님!!
새로운 메모리 공간 확보하고 그곳에 할당 값 80을 저장하는 것
[값의 재할당]
var score = 80; //변수 선언과 값의 할당
socre = 90; //값의 재할당
var 키워드로 선언한 변수는 값 재할당 가능 (재할당 : 현재 변수에 저장된 값 버리고 새로운 값 저장)
마찬가지로 새로운 메모리 공간을 확보하고 그 메모리 공간에 숫자 값 90을 저장
현재 score의 값은 90.
score 변수 이전의 값인 undefined와 80은 어떤 변수도 값으로 가지지 않음 (이런 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동해제.. 언제 해제될지는 예측 불가)
가비지 콜렉터
애플리케이션이 할당한 메모리 공간을 주기적으로 검사해 더 이상 사용되지 않는 메모리 해제 기능
자바스크립트는 가비지 콜렉터를 내장하는 매니지드 언어로, 메모리 누수 방지
언매니지드 언어 / 매니지드 언어
- 언매니지드 언어 (C 언어)
개발자가 명시적으로 메모리 할당, 해제 위해 malloc()과 free()같은 저수준 메모리 제어 기능 제공
메모리 제어를 개발자가 주도 가능해 개발자 역량에 따라 최적의 성능 확보가능, 반대 경우 치명적 오류 생산 가능성 존재
- 매니지드 언어 (자바스크립트)
메모리 할당 및 해제 위한 메모리 관리 기능을 언어 차원에서 담당. 개발자의 직접적 메모리 제어 허용x
즉, 개발자가 명시적으로 메모리 할당, 해제 불가
더이상 사용하지 않는 메모리 해제는 가비지 콜렉터가 수행 (이 또한 개발자가 관여 불가)
개발자 역량에 의존하는 부분이 상대적으로 작아져 일정한 생산성 확보가능, 하지만 성능 면에서 어느 정도 손실은 감수해야 함
[식별자 네이밍 규칙]
- 특수문자 제외한 문자, 숫자, 언더스코어(_), 달러 기호($) 포함 가능
- 단, 특수문자 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)로 시작 (숫자로 시작xxx)
- 예약어 사용 불가 (예약어 : 프로그래밍 언어에서 사용되거나 예정인 단어)
var first-name; //SyntaxError: Unexpected token -
var 1st; //SyntaxError: Invalid or unexpected token
var this; //SyntaxError: Unexpected token this
- 자바스크립트는 대소문자 구별 (다음과 같은 변수는 각각 별개의 변수)
var firstname;
var firstName;
var FIRSTNAME;
- 변수 이름은 변수 존재 목적을 쉽게 이해할 수 있도록 의미를 명확히 표현할 것(가독성 높이기)
- 네이밍 컨벤션 : 하나 이상의 영어 단어로 구성된 식별자 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 규칙
//카멜 케이스(camelCase)
var firstName;
//스네이크 케이스(snake_case)
var first_name;
//파스칼 케이스(PascalCase)
var FirstName;
//헝가리언 케이스(typeHungarianCase)
var strFirstName; //type + identifier
var $elem = document.getElementById('myId') //DOM 노드
var observable$ = fromEvent(document, 'click'); //RxJS 옵저버블
일반적으로
- 변수 / 함수 이름 : 카멜 케이스
- 생성자 함수 / 클래스 이름 : 파스칼 케이스