자바스크립트 변수


상수와 변수

상수(Constant)

  • 변하지 않는 수
  • 변경이 없음 숫자 10은 10이다 값이 바뀔일이 없음
  • 변수와 구분하기 위한 목적으로 상수의 이름은 모두 대문자로 작성 표기
  • 코드가 실행 중인 상황에서 값을 변경할 수 없다
  • 상수를 공식적으로 지원하는 것은 ECMAScript 2015 버전부터 지원함
    • 이전까진 IE에선 상수를 지원하지 않아서 굳이 사용하지 않았음.
    • 앞으로 상수가 얼마나 활발하게 사용이 될진 아직 모름

변수 (Variables)

  • 자료를 담는 공간(그릇) == 메모리 공간
  • 변수의 값은 메모리cpu에 저장됨
  • 한개의 값만 저장 할 수 있다.
  • 변하는 수 : 어떤값을 넣느냐에 따라 값이 변동됨
  • 데이터 유형에 따라 값을 복사를 할수도 있고 참조 할수도 있다.
  • 변수는 값이 담긴 데이터로 접근하도록 하는 식별자이다.
  • var 키워드로 변수 선언 var 변수이름 = 정보유형;
// 변수(Variable) VS 상수(Constant)
var bim = 'LG bim';
const HOUR = 60;

// 변수는 실행 중인 상황에서 값을 변경할 수 있는 반면
console.log('bim', bim);
// 상수는 실행 중인 상황에서 값을 변경할 수 없다
console.log('HOUR', HOUR);

//값 변경
bim = 'samsung';  
HOUR = 120;  

console.log('bim', bim); //바뀜
console.log('HOUR', HOUR); //오류발생


변수 할당(대입)

  1. = 할당의 의미
    • var a = 10; => 숫자10을 변수 a에 값을 할당하다.
    • 언제든지 값은 변할수 있다.
    • a = 7 + 2; a의 값은 9로 변경됨


변수 정의 패턴

  1. 한개의 var 키워드에 변수선언

    var x, y, z; 
    // 값을 할당하지 않고 선언만 하는 경우 
    // undefined 원시 데이터 유형 값으로 변수에 할당(복제)된다.
    
  2. var 키워드를 변수 이름마다 사용해서 선언 : 일반적으로 많이 쓰는 방법

    var x;
    var y;
    var z;
    
    // 선언 이후에 값(Data)을 변수에 할당한다.
    x = '바버';
    y = 999;
    z = null;
    
    
  3. 변수 선언과 동시에 값을 할당 : 일반적으로 많이 쓰는 방법

    var x = 10;
    var y = 50;
    
  4. var singleton pattern : var 키워드를 한번만 사용하는 코딩 패턴(방법)

    var a=1, b=2, c=9;
    
    // 아래와 같이 개행 가능
    var a=1,
        b=2,
        c=9;


변수명 작성 규칙

  1. 이름 앞에 숫자 No 하지만 뒤는 Ok

    • => var 999qkqj; Error
    • => var qkqj999; Ok
  2. 이름 사이의 공백 No 공백대신 언더바

    • => var my name; Error
    • => var my_name; Ok
  3. 이름 앞에 특수문자는 $, _ 만 가능

    • => var ^^#@_name; Error
    • => var $name; Ok : $가 붙은 변수는 주로 제이쿼리를 담은 변수를 나타냄
  4. 변수명이 모두를 대문자로 사용하지 않는다.

    • => 오류가 발생하는 것은 아니지만 이름이 전부 대문자이면 관례적으로 상수로 인식한다.
    • => var SMART_PHONE; ==> 상수로 인식
    • => 상수선언은 const 이름 = '값'; ==> const STORAGE;
  5. 카멜 케이스(camelCase) 표기법

    • 대문자를 변수 이름에 사용하는 경우는 카멜 케이스 표기법을 따르는 경우가 많다.
    • var smartPhone;

참고 및 주의사항

  • 한국어도 가능하지만 크롬말고 다른 브라우저는 인식 못할수도 있음
  • 예약어 사용 안됨


변수 값의 복사, 참조의 구분

  1. 값 복사 : 데이터가 원시데이터형일 때 복사가 된다.

    • 원시 데이터(Primitive Data Type) 유형 5가지
      • undefined , null , Number , String , Boolean
    // 실행구문 1
    // x에 10을 대입
    x = 10;
    
    // x의 변수값 복사
    y = x;
    
    console.log('x: ',x);  // 10
    console.log('y: ',y);  // 10
    
    // 실행구문 2 (x값 변동, y의 값은?? )
    // x 변수의 상태가 변경 ( === 값이 변경)
    x = 5;
    
    // z에 연산된 값 할당 
    z = x * y -150;
    
    console.log('x: ',x);  // 5
    console.log('y: ',y);  // 10  ==> y값은 변동되지 않음 처음 복사한값 그대로 
    console.log('z: ',z);  // -100
    
    // 실행구문 3  (x값 변동, y값 연산된 값은??, z의 값은???)
    // x 변수의 상태가 변경 ( === 값이 변경)
    x = -15;
    
    // y의 연산결과 : y = -15 + 10
    y = x + 10;
    
    console.log('x: ',x); // -15
    console.log('y: ',y); // -5
    console.log('z: ',z); // -100  
    //==> z의연산의 위치는 변수x,y의 값이 바뀌기전임 그래서 위의 z값과 같음
    
    
    
  2. 참조 : 주소를 가르키고있다 개념으로 자료형 데이터 일때 참조됨

    • 참조형 데이터(Reference Data Type) == 자료형데이터
      • 객체(Object), 함수(Function Object), 배열(Array Object)
  • 변수 값 참조 예제 1
// tea_time 변수에 배열데이터 할당
// == tea_time 변수가 배열테이터 참조
var tea_time = ['cake', 'coffee'];
// food 변수가 tea_time에 할당된 값을 참조.
var food = tea_time;

console.log('tea_time:', tea_time); // ['cake', 'coffee']
console.log('food:', food); // ['cake', 'coffee']

//실행구문 2
tea_time[2] = 'ice-cream';

console.log(tea_time); // ["cake", "coffee", "ice-cream"]
console.log(food); // ["cake", "coffee", "ice-cream"]

// => 참조된값이 바뀌면 변경된다.

var a = 10;
var b = a;
var c = {x: a};
var d = c; // c에 참조된 객체를 d도 참조함.

console.log('a:',a);
console.log('b:',b);
console.log('c:',c);
console.log('d:',d);


//변수 데이터값 변경
a = 100;
b = 200;
c.x = 300;

console.log('a:',a);
console.log('b:',b);
console.log('c.x:',c.x);
console.log('d.x:',d.x); // c에 참조된 객체를 d도 참조하고 있기에 값이 변경됨.

//---------------- 중요한 개념 ----------------------
// 변수c가 참조하고 있는 객체에서 키인 x는 객체가 아님 
// x라는 이름을 가진 변수 라서 데이터 값이 복사됨. 
// 대신 변수d는 변수c의 객체를 참조 하고 있기에 c의 키인 x가 변경되면 변경된 값을 가지고있음


전역변수와 지역변수

전역 : global scope variable

  • 전역(window) 공간에 정의된 변수
var mouse = '매직 마우스';
console.log(1, mouse);

지역 변수 : local scope variable

function localScope() {
  var mouse = '돌핀 마우스';
  console.log(2, mouse);
}
localScope();
console.log(3, mouse);

매개 변수 : parameter

function callMe(who, when, where, how) {
  // 매개변수는 해당 함수의 내부에서 접근이 가능하다.
  // console.log('a', who);
  console.log('who:', who);
  console.log('when:', when);
  console.log('where:', where);
  console.log('how:', how);
}
callMe('boy', 'yesterday', 'school', 'using smartphone');
// console.log('b', who); // Reference Error

멤버 변수

  • 객체가 소유한 멤버
  • 객체란? 속성의 집합
var phone = {
  'name': 'iPhone',
  'version': 7
}


그외

  • CPU

    • cpu는 계산담당(cache는 cpu를 위한 저장공간)
    • ram은 기억담당(비싼 호텔! 저장하는 주소, 방 많이 가지고 있음) : 계산할 값을 저장하고 있음
    • hdd/sdd는 영구적으로 데이터 저장
    • cpu--cache--ram--hdd 순으로 데이터가 이동함
    • gpu 모니터에서 랜더링되는 화면을 연산
    • cpu-직렬처리/ gpu-병렬처리 로 작동방식, 목적이 다름
    • cpu i-5, i-7(쿼드코어) 같은거, 노트북과 데스크탑 cpu는 좀 다름...
    • gpu 는 동시에 여러 코드를 처리 가능.-테슬러 자동차 처럼 여러 센서가 대규모 데이터 주는거 처리할 때 사용하기도 함
    • cpu작동 방식은 잘 모르겠다!! 여러 코드를 여러개의 cpu가 처리하지 못함
    • 32bit os는 ram 4기가 이상 쓸 수 없다, 인식 못함.
  • undefined는 예약어 아님. 변수이름으로 쓸 수 있지만 값이 실제로 담기지는 않음


'Javascript' 카테고리의 다른 글

[자바스크립트] 기본 - basic  (0) 2017.02.28

자바스크립트

기본

  • 자바스크립트 정식 명칭 ECMAScript
  • 자바스크립트 기본문법
    • 대소문자구분
    • 유니코드 기반, 영어 아닌 다른 언어도 코드 안에서 사용 가능
      • 유니코드 - 유사이래 모든!!(고대한글도) 문자를 표현하는게 목표
    • 명령어는 문장을 구성됨 typeof 등
    • 스페이스, 탭, 줄바꿈 문자는 공백(white-space)라 부름
  • <script type="text/javascript">마임타입!</script>
    • 스크립트 코드 위치에 따라 눈에 보이는 페이지 로딩 속도가 달라보임!
    • 스크립트가 위쪽에 있으면 아래 html문서가 로딩되지 않아서 늦게 뜨는것처럼 보임


스크립트 속성

  • type
    • type ="text/javascript" 
    • 생략가능
  • src
    • 외부스크립트 주소
  • charset
    • UTF-8, euc-kr 과 같은 스크립트의 Character Set를 지정
  • async
  • defer

=> async와 defer 속성이 같이 사용될 경우 async가 높은 우선순위를 갖음


<script async src = “js/script.js"></script>


<script defer src = “js/script.js"></script>




주석

  • // 한줄
  • /* */ 여러줄 주석


엄격모드 발동

  • 문법이 엄격함 지키지않으면 오류발생 : 'use strict';
  • 일반 vs 엄격 모드 때의 this가 가르키는것

    // 일반적인 방법
    (function(aa){
       console.log('this는 뭐니',this);
    })(this);
    
    ==> this는 뭐니 ?
    Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}
    
    // 엄격모드 발동
    (function(aa){
    'use strict'
       console.log('this는 뭐니',this);
    })(this);
    
    ==>  this는 뭐니?  undefined
    
    
    (function(aa){
    'use strict'
       console.log('this는 뭐니',this);
       console.log('aa는 뭐니',aa);
    })(this);
    ==> 출력  this는 뭐니 undefined
    ==> 출력   aa는 뭐니 Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}
    undefined
    
    


dot syntax

//자바스립트 문장은 점으로 연결되어 이루어진다.
주어.동사('목적어');
console.log('뭐야');


스크립트 로딩시 주의

  • JS는 통역언어 : 브라우져 엔진이 읽어서 가져오는언어 그래서 느려
  • head나 body 요소 안에 작성
    • head나 body 요소밖에 작성해도 동작은 되지만 웹표준에 어긋남
  • body 요소 안 끝부분에 선언
    • html문서가 다 읽히고 나서 스크립트 읽어서 실행 되어야 모두 동작
    • 상단에 들어가면 html문서가 읽히고 출력은 되어보이지만 실제적으론 스크립트 구문이 먼저 읽힐 당시엔 html문서를 찾을수 없어서 실행이 안됨
    • 만약 무조건 head 안에 작성해야 한다면 불러올 스크립트에 onlode 이벤트 발생 시켜야함 window.onload = function(){};
  • 블러오는 순서가 매우 중요
// 변수만 모아 놓은 파일
<script src="js/var.js"></script>
// 실행문들,, : 이것이 변수파일보다 위로 올라간다면 변수를 읽어오지 못해서 변수를 찾을수 없음
<script src="js/write.js"></script>



자바스크립트 호출 실행 흐름

<!DOCTYPE html>
<html lang="ko-KR">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Comㅌpatible" content="IE=Edge">
    <script>alert('title 위에서 실행');</script> 
    <title>자바스크립트 호출 실행 흐름</title>
    <style type="text/css">
      body{background-color: pink; color: #4C4C4C;}
    </style>
    <script>alert('style 아래에서 실행');</script> 
  </head>
  <body>
    <h1>요소 먼저 읽지만 js구문 만나서 출력하지 않고 js끝나고 화면에 출력</h1>
    <script>alert('body 시작지점에서 실행');</script> 
    <h2>javascript</h2>
    <script>alert('h2 뒤에서 실행');</script> 
    <p>Lorem ipsum dolor sit amet.</p>
    <script>alert('p 뒤에서 실행');</script> 
  </body>
</html>



스크립트 파일 분리

  • HTML:구조, CSS:표현, JS:동작
  • 인라인으로 사용하지 않는다. : 코드더러워짐 유지보수 어려움
<button 
    type="button"
    onclick="document.body.style.background='#EA92FF';"
    style="padding: 1rem; background: #220D44; color: #fff; border: none; border-radius: 5px;"
>
  click
</button>
  • css , script 내부로 분리 : 그래도 코드 더러움
<style>...</style>

<button typr="button" id="target"> GOOD click </button>

<script>
  document.getElementById('target').onclick = function(){
    document.body.style.background="#C6ABFF";
  }
</script> 
  • css, script 외부파일로 모두 분리 : 깔끔!!
<link rel="stylesheet" type="text/css" href="css/marge-style.css">
<button typr="button" id="target"> GOOD click </button>
<script src="js/marge-app.js"></script>
  • marge-app.js 코드
//marge-app.js

//문서 객체를 찾아 변수에 할당
var body = document.body;
var button = document.getElementById('target');

// 수행할 일(기능==function)을 참조하는 변수 선언
var btnClick =  function(){ 
  body.style.background="#C6ABFF";
}

// 기능이 참조된 변수를 실행
button.onclick = btnClick;



Learn later,,,,

  • 바디요소 접근
    • document.body;
  • 아이디 접근
    • document.getElementById('아이디명');



'Javascript' 카테고리의 다른 글

[자바스크립트] 변수 - variables  (0) 2017.03.01

+ Recent posts