study: javascript | 숨참고 deep dive (4) 변수 - 221119

Lumpen·2022년 11월 19일
0

Study

목록 보기
7/92

1. 변수

애플리케이션은 아무리 복잡해도 데이터를 입력 받아 처리 후 결과를 출력 하는 것이 전부다
컴퓨터는 연산과 기억을 수행하는 곳이 나뉘어져 있다
CPU를 통해 연산하고 메모리를 사용하여 데이터를 기억한다

메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체다
셀 하나의 크기는 1바이트 (8비트), 메모리 셀의 크기인 1 바이트 단위로 데이터를 저장하거나
읽어들인다

각 셀은 고유의 메모리 주소를 갖는다
이 주소는 메모리 공간의 위치를 나타내며
0 부터 메모리 크기만큼의 정수로 표현된다
4GB의 메모리가 있다면, 0부터 4,294,967,295 (0x0000000 ~ 0xFFFFFFFF) 까지의
주소를 갖는다

컴퓨터는 모든 데이터를 2진수로 처리하고 저장한다

사용되는 데이터는 메모리 상의 임의의 위치에 저장되고, CPU 는 저장된 값을 읽어
연산을 수행한다
연산 결과도 메모리에 저장된다

이 값들을 재사용 하기 위해 변수를 사용한다
메모리 주소를 통해 직접 접근하는 것은 매우 위험한 일로
자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 공간을 식별하기 위해 붙인
이름을 말한다

변수에 값을 저장하는 것을 할당이라 하고, 변수에 저장된 값을 읽어 들이는 것을 참조라고 한다

2. 식별자

식별자는 어떤 값을 구별해서 식별할 수 있도록 하는 고유한 이름을 말한다
식별자는 값이 아닌 메모리 주소를 기억하고 있다
번수, 함수, 클래스 등의 이름을 모두 식별자라고 한다

3. 변수 선언

변수 선언이란 변수를 생성하는 것을 말한다
값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결하여,
값을 저장할 수 있도록 준비하는 것이다

변수를 사용하려면 반드시 선언을 해야한다.
변수 선언 시에는 var, let, const 키워드를 사용한다

var 키워드는 블록 레벨 스코프를 지원하지 않고 함수 레벨 스코프를 지원한다

변수 선언문

var score;
위와 같이 선언하면 메모리 공간에 변수의 이름을 등록하고 값을 저장할 메모리 공간을 확보한다
변수 선언 후 값을 아직 할당하지 않았지만 undefined 값이 암묵적으로 할당되어 초기화 된다
이 것은 자바스크립트의 독특한 특징이다
사용자 입장에서는 선언과 초기화가 함께 일어나는 것과 같다

실행 컨텍스트

변수의 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록된다 
실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고,
실행 결과를 실제로 관리하는 영역이다 엔진은 실행 컨텍스트를 통해 식별자를 관리한다
변수 이름과 변수의 값은 키 - 값 형태의 객체로 등록되어 관리된다

var 키워드의 선언과 초기화는 동시에 일어난다
초기화란 변수 선언 이후 최초로 값을 할당하는 것을 말한다
초기화 단계를 거치지 않으면 메모리 공간에 이전에 사용 후 아직 남아있는 값이 있을 수 있다
자바스크립트의 변수 선언은 암묵적인 초기화가 진행되므로 이러한 위험으로부터 안전하다

만약 선언되지 않은 식별자에 접근하면 ReferenceError 가 발생한다
참조 에러는 식별자를 찾을 수 없을 때 발생한다

4. 변수 선언의 실행 시점과 호이스팅

변수 선언은 코드가 인터프리터에 의해 한 줄씩 실행되는 시점인 런타임 이전에 실행된다
자바스크립트는 런타임 이전에 소스코드의 평가 과정을 거친다
이 과정에서 모든 선언문을 찾아내 먼저 실행한다
소스코드의 평가 과정이 끝나면 선언문을 제외한 코드를 한 줄씩 실행한다
선언문은 코드에서의 위치와 상관 없이 다른 코드들 보다 먼저 실행된다
이처럼 선언문이 코드의 상단으로 끌어 올려진 것처럼 동작하는 특징을
호이스팅 이라고 한다

5. 값의 할당

변수 선언과 할당을 2개로 나누어 표현한 것과 하나로 단축하여 표현한 코드는
정확히 동일하게 동작한다
자바스크립트 엔진은 선언과 할당을 하나의 문으로 표현하여도 2개의 문으로 각각 나누어 실행한다
주의할 점은 변수 선언과 값의 할당의 실행 시점이 다르다는 것이다
변수 선언은 런타임 이전에 실행되지만, 값의 할당은 런타임에 실행된다

6. 값의 재할당

var, let 키워드로 선언된 변수는 값을 재할당 할 수 있다
재할당은 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것이다
엄밀히 말하면 초기화도 재할당일 수 있다

값을 재할당 할 수 없으면 상수라고 한다
const 키워드는 재할당이 금지되어 상수를 표현할 수 있지만 상수에만 쓰이지는 않는다

재할당 후 남은 값에 대한 메모리 공간은 초기화에 사용된 undefined 값과 마찬가지로 가비지 컬렉터에 의해 회수된다

매니지드 언어 / 언매니지드 언어

매니지드 언어는 자바/자바스크립트와 같이 가비지 컬렉터가 자동으로 메모리 관리를 해주는 것
언매니지드 언어는 C와 같이 사용자가 직접 메모리 관리를 해야하는 것

7. 식별자 네이밍 규칙

  • 특수문자를 제외한 문자, 숫자, 언더스코어, 달러 기호를 포함할 수 있다
  • 숫자로 시작하는 것은 허용하지 않는다
  • 예약어는 식별자로 사용될 수 없다

변수이름도 식별자이기 때문에 위와 같은 규칙을 따른다
ES5 부터는 유니코드 문자를 허용하므로 한글이나 일본어 등의 식별자도 가능하지만
그런 것은 사용하지 않는 편이 좋다

자바스크립트는 대소문자를 구별한다
변수 이름은 변수의 존재 목적에 따라 의미를 명확히 표현해야 한다

네이밍 컨벤션은 하나 이상의 영어 단어로 구성된 식별자를 만들 때
가독성 좋게 구분하기 위해 규정한 명명 규칙이다

카멜 케이스, 스네이크 케이스, 파스칼 케이스, 헝가리언 케이스 등이 있고
주로 자바스크립트에서는 클래스: 파스칼, 상수: 대문자, 나머지: 카멜 등으로 사용

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글