Javascript?

변수

컴퓨터는 연산을 하는 부품과 기억을 하는 부품이 나누어져 있다. (쉽게 CPU는 연산 메모리는 기억)
JS엔진은 사람처럼 동작하려면 모든 기호를 기억하고 연산자도 기억하고 연산을 하고 값을 기억해야한다.
할게 많다. 사람은 그게 다 되어있으니 참 감사해야한다.

기억을 위한 메모리라는 부품은 1바이트 크기를 가진 메모리 셀의 집합체이다.
메모리 셀은 1 바이트 단위로 데이터를 저장하거나 읽어들인다. 또한 고유의 메모리 주소를 갖는다. 데이터는 이 주소에 맞게 저장되고 읽힌다.

좀 충격적인 것.
10 + 20을 연산한 결과인 30을 재사용하기위해서 메모리 주소에 직접 접근해야만 하는데 이는 시스템에 치명적인 위험을 가할 수도 있다고 한다. 그래서 변수를 쓴다. 대박.
변수는 개발자가 메모리에 직접 접근하지 않고도 저장한 결과를 재사용할 수 있게 해준다.
어떻게냐면 변수는 특정 값 하나만을 저장하기위해 확보된 메모리 공간 자체 또는 그 메모리 공간을 식별하기위해 붙여진 이름 즉, 식별자를 말한다. 값의 주소를 가리키는 상징적인 이름이다. 그렇게되면 값을 저장하고 참조할 수 있게 된다.

값이 저장된 메모리 공간에 상징적인 이름을 붙인 것은?

변수

식별자 네이밍 규칙

  • _ , $외에는 특수문자 사용 금지
  • 예약어(if,true처럼 언어 자체에서 어떤 기능을 위해 사용되거나 그럴 예정인 단어)사용 불가
  • 숫자가 맨 앞에 올 수 없다.
  • 그 외에 카멜형태 스네이크형태 파스칼형태로 각각 식별자 별로 쓰는 형태가 관례적으로 다른데 그건 알아서 하면된다.
  • 변수가 의미를 정확히 내포할 수 있도록 이름을 작성해야한다.

선언과 할당

변수는 변수 이름(식별자)를 통해 값이 저장된 메모리 주소와 관계를 맺는다.
식별자는 JS엔진이 식별자와 스코프를 관리하는 영역인 execution context에 등록된다.
식별자는 변수 함수 클래스 등의 모든 이름을 의미한다. 그래서 이름을 잘 지어야한다. 첫 아기이름 지을 때처럼 심사숙고해서 지으라고 이 책에서는 말하고있다.

선언

선언을 통해 JS엔진에 "나 여기 있어요"라고 알린다고 한다.
선언이 뭐냐면 식별자를 생성하는 것이고 생성하여 JS엔진에 존재를 알리는 것이다. 메모리를 할당하고 메모리 주소와 변수 이름을 연결 및 저장하여 JS엔진에 존재를 알린다. 이 메모리 공간은 해제하지 않는다면 침범할 수 없다. 다른 변수가 이 메모리 공간을 사용할 수 없다는 얘기다. 변수를 사용하려면 선언이 반드시 필요하다.

선언하는 방법

var foo
let foo
const foo //얘는 상수이지만 선언하는 법을 보여주려고 썼다.

위의 var, let, const같은 애들이 키워드라는 것인데 JS엔진이 수행할 동작을 규정한 명령어이다.
=>var 키워드는 뒤에 오는 식별자로 변수를 선언하여 초기화하는 명령어이다.

메모리 공간이 확보되고 거기에 들어갈 값을 정해주지 않았다면 JS엔진은 undefined를 암묵적으로 할당한다.
이게 초기화이다.
초기화를 안하면 쓰레기 값이 저장된다. (쓰레기 값은 완전 이상한 값)

만일 선언하지 않은 변수를 사용하려 한다면 Reference Error가 발생한다. (없는 데 어떻게 해요?라고 JS엔진이 말하는 것)

변수 호이스팅

JS는 인터프리터라 한 줄에 하나씩 순서대로 실행한다.

console.log(score);
var score;

위 처럼하면 당연히 참조 에러가 날 것 같지만 안난다?! 왜???
변수 선언은 코드 실행(runtime)이전에 실행된다. JS엔진은 소스코드를 평가하고 실행하는데 평가 단계에서 모든 선언문을 찾아내서 먼저 실행한다!!!
이를 변수 호이스팅이라고 한다. 어떤 선언이든 먼저 평가하고 다음 코드를 실행한다.

할당

var score;
score = 80;

위 그림은 코드를 따라한 것이다. 이렇게 값을 할당할 수 있다.
score가 더이상 참조하지 않는 undefined는 어느 식별자도 참조하지 않으므로 더이상 사용하지 않는 메모리가 되어서 가비지 콜렉터에 의해 자동으로 메모리에서 해제된다. 메모리 누수 방지를 위해서.
const로 지정한 상수는 값을 재할당할 수 없다. 있는 것 그대로 써야한다.

C언어에서는 배열 크기를 직접 정해주고 막 개발자가 메모리를 할당할 수 있고 Malloc쓰고 난리나는데
JS는 관리되는 언어이기 때문에 개발자가 메모리를 함부로 못 건든다. 위에서 본 가비지 콜렉터가 메모리를 관리하기 때문이다.

표현식과 문

값은 표현식이 평가되어 생성된 결과를 말한다. 평가는 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.

20+30 // 표현식 => 50 //평가되어 생성된 값

모든 값은 데이터 타입을 가지며 메모리에 2진수로 저장된다. 데이터 타입에따라 메모리에 저장된 2진수를 다르게 해석한다.

0100 0001 -> 65 or 'A'

변수에 값을 할당한다는 말은 우항의 식은 표현식이고 평가가되어 값으로 메모리에 저장될 수 있어야한다는 말이다.

값은 리터럴로 표기한다. 리터럴(literal)이란 사람이 이해할 수 있는 문자 or 약속된 기호로 값을 생성하는 표기법이다.

표현식

표현식은 값으로 평가될 수 있는 문이다. 변수 할당문도 표현식이므로 x=100라는 식 자체도 변수에 할당할 수 있다.

변수 선언문은 표현식이 아닌 문이므로 변수에 할당할 수 없다. var x=10은 변수에 할당 불가
변수에 할당했을 때 오류가 나지않으면 표현식이고 평가되어 값이 된다는 뜻이고 오류가 나면 표현식이 아닌 문이다.

문(명령문)

문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다. 문의 집합이 바로 프로그램이며 문을 작성하고 순서대로 나열하는 것이 프로그래밍이다. 문은 토큰들의 집합으로 구성된다. 토큰은 문법적으로 더이상 나눌 수 없는 코드의 기본 요소이다. 표현식인 문과 표현식이 아닌 문들이 있고 정말 많은 종류의 문이 있다. 선언문, 할당문, 조건문, 반복문 등.

profile
제발 제 코드에 훈수해 주세요 - 제제훈

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN