관리 메뉴

흰둥씨의 개발장

[자바스크립트] 딥다이브 ) 변수편 본문

BoOk/JS deep dive

[자바스크립트] 딥다이브 ) 변수편

돈워리비해삐 2023. 4. 18. 00:50

컴퓨터는 CPU를 사용하여 연산하고, 메모리를 사용해서 데이터를 기억함. 

 

메모리 ?  데이터를 저장할수 있는 메모리 셀의 집합체 (메모리셀 하나의 크기는 1byte = 8bit)

셀은 고유의 메모리주소를 갖는다 (메모리공간위치 나타내고, 메모리크기만큼 정수로 표현됨)

 

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

=값의 위치를 나타내는 상징적인 이름 , 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요 없음 

 

데이터를 가져오기 위해 직접 메모리 주소를 통해 값에 접근하는 것은 위험한 일로,

기억하고 싶은 값을 저장하고, 저장된 값을 재사용 하귀 위해 변수라는 메커니즘을 제공함

 

-변수명 : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름 

-변수값 : 변수에 저장된 값

-할당(=대입, 저장) : 변수에 저장하는 것 할당연산자 '=' 를 사용함 (우변의값을 좌변에 대입)

-참조 : 변수에 저장된 값을 읽어 들이는 것

-식별자 : 변수명, 함수, 클래스등의 이름은 모두 식별자 이고, 메모리 주소를 기억한다. 

 

-변수 선언 : 변수 생성하는 것 (=값을 저장하기 위한 메모리공간확보하고, 변수이름과 확보된 메모리 공간연결해서 값저장할수있게 준비)

ㄴ변수 선언시 var, let , const키워드 사용 

ㄴ선언 후 값 할당 전에는 자바스크립트 엔진에 의해 undefined가 암묵적으로 할당되어 초기화됨 

(초기화 ? 변수선언이후 최초로 값을 할당하는 것)

ㄴ선언하지 않은 식별자에 접근하면 ReferenceError가 발생

 

*키워드 : 자바스크립트 코드를 해석하고 자바스크립트 엔진이 수행할 동작을 규정한 일종의 명령어 

console.log(score); // undefined

var score; //변수 선언

score가 선언되기 전 Console.log를 실행해도 참조에러ReferenceError가 발생하지 않는데

ㄴ그 이유는 변수 선언은 호이스팅 되기 때문

변수 뿐아니라 var, let, const, function, class키워드를 사용해서 선언하는 모든 식별자는 호이스팅 됨

ㄴ다만 변수 선언은 호이스팅으로 런타임 이전에 먼저 실행되지만, 

할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행됨

ㄴ그렇기 때문에 var score = 80 은 score가 먼저 호이스팅되면서 undefined으로 초기화되고 런타임에 80이 할당됨 

(undefined을 지우고 80을 할당하는 것이 아니고, 새로운 메모리 공간확보후 80할당하는 것)

 

-재할당 : 변수에 저장된 값을 다른 값으로 변경 

ㄴscore에 80이 아닌 90을 재할당하면? 새로운 메모리 공간확보하고 그 공간에 90을 저장함 (80과 undefined은  있지만 어떤 식별자와도 연결되어있지 않은 것 => garbage collector(할당한 메모리공간을 주기적 검사함)에 의해 메모리에서 자동 해체됨)

ㄴ상수 : 값을 재할당할수 없어서 저장값 변경할수 없는 것 ; 한번 정해지면 변하지 않는 값, 딱한번만 할당할수 있는 변수

ㄴES6에서 도입된 const는 재할당이 금지된다. 

 

-네이밍 규칙 

ㄴ식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러기호($)포함가능

ㄴ식별자는 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러기호($)로 시작해야하고 숫자 시작은 금지됨 

ㄴ예약어는 식별자로 사용할수 없다. 

-예약어? 프로그래밍언어 안에서 사용되고 있거나 사용될 예정인 언어 (ex) await, break... 

ㄴ쉼표(,)로 구분해서 여러개의 변수를 한번에 선언할 수 있다. (가독성 나빠서 권장안함)

let hi, myName, HDoongs;

ㄴES5부터 식별자 만들때 유니코드 문자 허용해서 한글, 일본어 사용할수 있지만. 알파벳을 권장 

ㄴ대소문자 구별해서 아래의 변수는 각각 다른 변수임 

let Zzanggu;
let zzanggu;
let ZZANGGU;

 ㄴ변수의 이름은 존재 목적을 쉽게 이해할수있도록 의미를 명확히 표현해야함 

let x ; // 안좋은 변수명의 예시
let score ; //점수를 내기 위한 변수임을 나타내서 좋은 변수명

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

ex)카멜케이스(camelCase), 스네이크 케이스(snake_case) , 파스칼케이스(PascalCase) , 헝가리언 케이스 (typeHungarianCase)

//헝가리언 케이스 
let strMyName; //무슨 타입인지 + 식별자 이름

대체로는 변수나 함수이름에는 카멜케이스 

생성자 함수, 클래스이름에는 파스칼 케이스 사용