모던 자바스크립트 Deep Dive - 2

2023. 3. 22. 14:36개발 관련 책 읽기/모던 자바스크립트 Deep Dive

✅ 아래 내용들에 대해서 알아보자

- 변수란?
- 변수 사용 방법
- 변수 호이스팅
- 값 할당/재할당
- 네이밍 규칙

 

변수란

 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 또는 식별하기 위해 붙인 이름을 말한다. 변수이름을 식별자라고도 한다. 식별자를 통해 메모리 공간에 저장되어 있는 값을 나타내는 주소를 가지고 있다. 즉, 메모리 주소를 통해 메모리 공간에 접근하여 해당 값을 읽어 올 수 있다.

 

메모리

 

컴퓨터는 모든 데이터를 2진수로 처리하여 저장한다. 따라서 메모리에 저장되는 데이터는 종류(숫자, 텍스트, 이미지, 동영상 등) 상관없이 모두 2진수로 메모리에 저장된다.

 

메모리는 1바이트 크기의 각 공간을 가지며 4GB 메모리에서는 (0x00000000 ~ 0 xFFFFFFFF)까지의 메모리 주소를 갖는다. 해당 메모리 공간에 데이터가 저장이 되어 CPU가 해당 메모리 주소값을 읽어 가져온다.

 

메모리 주소값을 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높은 매우 위험한 일이다. 따라서 JS는 개발자의 직접적인 메모리 제어를 허용하지 않는다. 따라서 변수라는 식별자를 통해 메모리 공간에 저장되어 있는 값을 가져올 수 있게 된다! 

 

 

변수 사용 방법

 변수를 사용해서 한다는 의미는 메모리에 공간을 확보하여 값을 저장하겠다는 의미이다.

변수를 사용하려면 var, let, const 키워드를 사용해서 선언을 해줘야한다. var 키워드는 단점이 존재하는데 아래와 같다

 

var 키워드 단점

  • 변수의 스코프가 블록레벨 스코프가 아닌 함수 레벨 스코프이다. 즉, 변수가 선언된 함수 내에서만 유효하기 때문에 변수가 함수 외부에서 선언되었을 때 문제가 생기게 된다.
  • 변수 중복 선언이 될 수 있다. -> 기존의 같은 이름의 변수 선언 시 덮어씌워지는 현상이 발생하게 됨
  • 변수의 호이스팅이 발생하게 된다. -> 결과가 어느 것인지 예측하기 힘들어지고 코드 가독성을 떨어뜨리고 예상치 못한 결과를 초래해서 버그를 발생시킬 수 있다.
  • 그리고 오류의 원인을 찾기 어렵게 하여 디버깅을 어렵게 한다.

 

이러한 단점으로 인해 const, let 키워드가 등장하게 된다.

 

var 예시 코드

//변수 선언 -> 변수 선언 후 값을 할당하지 않으면 JS는 undefined라는 값이 암묵적으로 할당되어 초기화된다.
var userName;

//객체나 배열 같은 자료구조 사용시 여러 개의 값을 그룹화하여 하나의 값처럼 사용 가능
var user={id:1, name:'t'}

var users=[
    {id:1, name:'lee'},
    {id:2, name:'kim'}
]

 

JS는 변수 선언 시 값을 할당하지 않으면 undefined라는 값으로 암묵적으로 초기화한다.(undefined는 JS의 원시 타입중 하나이다.) JS는 변수 선언 시 값을 초기화하지 않으면 쓰레기 값을 참조하게 될 수 있으므로 undefined 값으로 초기화 과정을 진행하게 된다.

 

 

변수 호이스팅

 아래 코드를 보면 인터프리터 언어가 한줄씩 순차적으로 실행되므로 참조 에러가 발생할 것처럼 보이지만, 참조 에러가 발생하지 않고 undefined가 출력된다.

console.log(score); // undefined

var score;	//변수 선언문

 

그 이유는 변수 선언(=메모리 적재)이 런타임이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.

이처럼 변수 선언문의 코드의 상위로 올라와서 동작하는 것을 변수 호이스팅이라고 한다.

 

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

=>모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문

 

장점

  • 변수 호이스팅은 변수 선언을 어디서든 할 수 있게 해 줘서 코드의 유연성을 증가시켜 준다.
  • 변수를 먼저 사용 후 선언해도 동작하기 때문에 편의성을 증가시켜 준다.

단점

  • 변수 선언하기 전에 변수를 사용하는 것은 코드의 가독성을 떨어뜨릴 수 있어서 협업 시 주의해야 할 포인트이다.
  • 호이스팅을 제대로 이해하지 못하고 사용 시 예기치 못한 문제가 발생하여 이슈가 발생할 수 있다.

 

값의 할당

 아래 코드를 보면 변수 선언(1)은 런타임 이전에 실행되고 값의 할당(2)은 런타임에 실행된다.

따라서 첫 로그는 undefined가 찍히고 그다음 로그는 80이 찍히게 된다. 이때 값 80은 새로운 메모리 공간에 할당된다!

console.log(score); //undefined

var score;	// 1.변수 선언 -> 런타임 이전에 먼저 실행
score=80;	// 2.값 할당   -> 값의 할당은 런타임에 실행

console.log(score);	//80

 

 

값의 재할당

 아래 코드는 score 값을 80->90으로 재할당하고 있다. var 키워드는 변수 선언과 동시에 undefined로 초기화하기 때문에 처음에 값을 할당하는 것도 재할당이다.

var score=80;   //변수 선언과 값의 할당(처음 값 할당도 재할당이다)
score=90        //값 재할당 (새로운 메모리 공간에 값을 저장함)

 

값 재할당


위 그림처럼 값을 재할당 undefined -> 80 -> 90으로 값이 재할당되고 각 메모리 공간에 할당된다. 따라서 불필요한 메모리가 생기게 되고 JS에서는 GC(가비지 컬렉터)에 의해 메모리가 자동 해제되어 메모리 릭을 방지한다.(시점은 예측하기 힘듦)

 

 

네이빙 컨벤션

  • 변수, 함수 카멜 케이스
  • 생성자 함수, 클래스 파스칼 케이스
  • 전체적으로 카멜 케이스 + 파스칼 케이스 사용 
//카멜 케이스
var firstName;

//파스칼 케이스
var FirstName;

 

 

 

 

 

참고자료

 

 

https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/get-started/ch1.md

https://tecoble.techcourse.co.kr/post/2021-04-25-hoisting/

반응형