ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 변수(js)
    JavaScript 2022. 6. 15. 21:35
    728x90

    04장 변수

    변수란?

    • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체
    • 그 메모리 공간을 식별하기 위해 붙인 이름
    • 값의 위치를 가리키는 상징적인 이름
    // 변수는 하나의 값을 저장하기 위한 수단이다.
    var userId = 1;
    var userName = 'Lee';
    
    // 객체나 배열 같은 자료구조를 사용하면 여러 개의 값을 하나로 그룹화해서 하나의 값처럼 사용할 수 있다.
    var user = { id: 1, name: 'Lee' };
    
    var users = [
      { id: 1, name: 'Lee' },
      { id: 2, name: 'Kim' }
    ];

    var result = 10 + 20; 로 예를 들어보겠다.

    10, 20은 각각 어떠한 메모리를 가리키고있다.

    여기서 10 + 20 의 결과값인 30도 메모리를 할당받고 우리가 선언한 변수 result는 그 30의 메모리를 가리키고 있는 것이다.

    - result : 변수 이름(변수명)
    - 30 : 변수 값
    - 변수에 값을 저장하는 것 : 할당(대입, 저장)
    - 변수에 저장된 값을 읽는 것 : 참조

    식별자

    • 변수 이름을 식별자라 함.
    • 어떤 값을 구별해서 식별할 수 있는 고유한 이름
    • 식별자는 값이 아닌 메모리 주소를 기억하고 있다.

    변수 선언

    • 변수는 사용하려면 반드시 선언이 필요하다.
    • javascript에서는 var, let, const 키워드가 존재한다.
    • var 키워드는 여러 단점이 있으므로 주의해야한다.
    var score; // 변수 선언(변수 선언문)

    위처럼 선언하면 javascript는 undefined라는 값으로 암묵적으로 할당 후 초기화한다.

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

    console.log(score)
    var score;

    위 코드를 실행했을 때 우리는 참조 에러가 날 것이라고 생각할 수 있다. 하지만 javascript에서는 위 코드를 실행했을 때 undefined가 출력 되는 것을 볼 수 있다.

    이유는 javascript는 변수 선언이 런타임(소스코드가 한 줄씩 순차적으로 실행되는 시점)이 아닌 그 이전 단계에서 먼저 실행되기 때문이다.

    • 변수 호이스팅 : 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유 특징 (var, let, const, function, function*, class 키워드는 모두 해당함)

    값의 할당

    var score;
    socred = 80;
    var score = 80;

    같아 보이지만 score의 변수 생성이 런타임에 생성 되는 경우가 아래, 런타임 이전에 생성 되는게 위 임을 주의하자.

    console.log(score); // undefined
    
    var score;  // ① 변수 선언
    score = 80; // ② 값의 할당
    
    console.log(score); // 80

    위 코드는 변수 선언 > console.log(score) : unefined > score = 80 > console.log(score) : 80 순으로 이루어진다.

    undefined 의 메모리에 80이 할당됨.

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

    console.log(score); // 80

    위 코드는 console.log(score) : undefined > score = 80 > console.log(score)가 출력되게 된다.

    undefined와 80은 서로 다른 메모리에 할당됨.

    console.log(score); // undefined
    
    score = 80; // 값의 할당
    var score = 50;  // 변수 선언
    
    console.log(score); // ??

    ??은 50이 출력됨을 쉽게 알 수 있다.

    javascript를 실행하면 일어나는 순서대로 바꾼 것이 아래 코드이다.

    var score;
    console.log(score); // undefined
    
    score = 80; // 값의 할당
    score = 50;  // 변수 선언
    
    console.log(score); // 50

    값의 재할당

    var score = 80;
    score = 90;

    var 키워드로 선언한 변수는 선언과 동시에 undefined로 초기화 되기 때문에 80도 재할당이다.

    • 값을 재할당할 수 없다면 변수가 아닌 상수이다.
    • 여기서 undefined, 80의 사용하지 않는 메모리는 javascript가 내장하고 있는 가비지 콜렉터를 통해서 해제한다.

    식별자 네이밍 규칙

    • 식별자는 특수문자를 제외한 문자, 숫자, _ , $를 포함할 수 있다.
    • 식별자는 숫자로 시작할 수 없다.
    • 예약어는 식별자로 사용할 수 없다.
    • 변수는 쉼표(,)로 구분해 여러 개를 한번에 선언할 수 있지만 가독성이 나빠지므로 권장하지 않는다.
    var person, $elem, _name, first_name, val1;
    • ES5부터 식별자를 만들 때 유니코드 문자, 한글, 일본어 식별자도 허용하지만 권장하지 않는다.
    var 이름, なまえ;
    • 다음 식별자는 명명 규칙에 위배된다.
    var first-name; // SyntaxError: Unexpected token –
    var 1st;        // SyntaxError: Invalid or unexpected token
    var this;       // SyntaxError: Unexpected token this
    • javascript는 식별자의 대소문자를 구별할 수 있다.(아래 3개는 모두 다른 변수)
    var firstname;
    var firstName;
    var FIRSTNAME;
    • 변수 이름을 변수 존재 목적에 맞게 표현해야 가독성이 높아진다.
    var x = 3;       // NG. x 변수가 의미하는 바를 알 수 없다.
    var score = 100; // OK. score 변수는 점수를 의미한다.
    • 변수에 주석이 필요하면 변수 존재 목적을 명확히 하지 못한 것이다.
    // 경과 시간. 단위는 날짜다
    var d;                 // NG
    
    var elapsedTimeInDays; // OK
    • 자바스크립트는 변수나 함수의 이름에는 카멜 케이스를 사용하고, 생성자 함수, 클래스의 이름엔 파스칼 케이스를 사용한다.
      // 카멜 케이스 (camelCase)
      var firstName;
      

    // 스네이크 케이스 (snake_case)
    var first_name;

    // 파스칼 케이스 (PascalCase)
    var FirstName;

    // 헝가리언 케이스 (typeHungarianCase)
    var strFirstName; // type + identifier
    var $elem = document.getElementById('myId'); // DOM 노드
    var observable$ = fromEvent(document, 'click'); // RxJS 옵저버블
    ```

     

    참고

    모던자바스크립트 Deep Dive

    728x90

    'JavaScript' 카테고리의 다른 글

    연산자(JavaScript)  (0) 2022.06.27
    데이터 타입(js)  (0) 2022.06.22
    [JavaScript] 메모리 관리, GC(가비지 컬렉션)  (0) 2022.06.20
    [JavaScript]비동기 프로그래밍  (0) 2022.06.17
    표현식과 문(javascript)  (0) 2022.06.16

    댓글

Designed by Tistory.