호이스팅, 식별자

혜빈·2023년 6월 18일

JS

목록 보기
8/21

호이스팅(variable hoisting)
: 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징

console.log(score); // undefined

var score; // 변수 선언문
  • -> 인터프리터 언어인 자바스크립트는 위에서부터 한 줄씩 순차적으로 실행되는데,
    변수 선언은 런타임(runtime) '이전 단계'에 먼저 실행되기 때문에 참조에러가 아닌 undefined가 출력된다 !

  • 자바스크립트 엔진은 소스코드를 한 줄씩 시행하기 전에
    '소스코드 평가 과정'을 거치는데 이 때 모든 선언문을 먼저 실행하고,
    이후 순차적으로 실행함

  • var, let, const, function*, class 키워드 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅 됨

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

var score; //변수 선언
score = 80; //값의 할당

//위와 같이 변수에 값을 할당할 때는 
이전 값 undefined가 저장되어 있던 메모리 공간을 지우고
그 메모리 공간에 새롭게 80을 저장하는게 아니라 
새로운 메모리 공간을 확보하고 그곳에 할당값 80을 저장한다는 점 주의하기
var score = 80; 
// 변수 선언과 값의 할당을 하나의 문장으로 단축 표현 가능

//함께 표현하더라도 변수 선언과 할당은 따로 두 번 이루어지기 때문에
undefined가 할당되어 초기화 되는 것은 변함이 없음
  • 주의할점
    : 변수선언 - 소스코드 순차적 실행 전 런타임 '이전'에 먼저 실행
    값의 할당 - 소스코드 순차적 실행 시점인 런타임에 실행됨
console.log(score); 
// 런타임 이전에 변수 선언문만 먼저 실행된 상태니까 초기화 값인 undefined가 출력

        score = 80; // 값의 할당 ()
        var score; // 변수 선언 (런타임 전 1순위로 실행됨)

        console.log(score); 
        // 변수선언 -> 런타임 실행된 후니까 할당해준 값 80이 출력됨
 

값의 재할당
: 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것

  • var 키워드로 선언한 변수는 값을 재할당할 수 있음
  • var 키워드로 선언한 변수는 동시에 undefined로 초기화 되기 때문에 엄밀히 말하자면 변수에 처음으로 값을 할당하는 것도 재할당임
  • 재할당하면 기존 메모리 공간은 그대로 두고 새로운 메모리 공간에 새로운 값을 저장함
  • 불필요한 값들은 일정 시간이 지난 후 가비지 콜렉터에 의해 메모리에서 자동 해제됨

가비지 콜렉터(garbage collector)
: 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능

  • 더 이상 사용되지 않는 메모리 : 어떤 식별자도 참조하지 않는 메모리 공간
  • JS는 가비지 콜렉터 내장하고 있는 매니지드 언어
  • 가비지 콜렉터를 통해 메모리 누구 방지

상수(constant)
: 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없음

  • const 키워드는 단 한번만 할당할 수 있는 변수를 선언하니까
    상수를 표현할 수 있음

언매니지드 언어 VS 매니지드 언어

  • 언매니지드 언어
    -개발자가 명시적으로 메모리를 할당하고 해제하기 위해
    malloc( )과 free( )같은 저수준 메모리 제어 기능 제공
    -장점 : 메모리 제어를 개발자가 주도할 수 있으므로
    개발자의 역량에 따라 최적의 성능 확보 가능
    -단점 : 반대의 경우 치명적 오류 생산
    -대표적 언어 : C언어
  • 매니지드 언어
    -메모리 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당
    -개발자가 명시적으로 메모리 할당, 해제 불가능
    -가비지 콜렉터가 메모리 해제 수행, 개발자 관여 불가
    -장점 : 개발자 역량에 의존하는 부분이 상대적으로 작아져 어느 정도 일정한 생산성 확보 가능
    -단점 : 성능 면에서 어느 정도 손실 감수해야함
    -대표적 언어 : 자바스크립트

식별자 네이밍 규칙

  • 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($) 포함 가능
  • 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)로 시작해야 함 !
  • 숫자로 시작 불가능
  • 예약어는 식별자로 사용 불가

예약어
: 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어

  • 변수 선언에 별도의 주석이 필요하다면 변수의 존재 못적을 명확히 드러내지 못하는 것

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

  • 카멜케이스(camelCase)
    : 소문자로 시작해서 낙타 등처럼 중간에 대문자 사용
	var firstName;
  • 스네이크 케이스(snake_ccase)
    : 언더바로 연결해서 사용
	var first_name;
  • 파스칼 케이스(PascalCase)
    : 대문자로 시작해서 대문자로 연결
	var FirstName;
  • 헝가리언 케이스(typeHungarianCase)
	var strFirstName; // type + identifier
    var $elem = document.getElementById('myId') // DOM 노드
    var observable$ = fromEvent(document,'click'); // RxJS 옵저버블
  • 자바스크립트에서는 일반적으로
    변수나 함수의 이름- > 카멜 케이스 사용
    생성자 함수, 클래스 이름 -> 파스칼 케이스 사용
profile
최강 개발자를 꿈꾸는 병아리

0개의 댓글