생활코딩 JavaScript 정리

Updated:

Intro

  • Opentutorials(생활코딩)에서 Javascript 강의를 보며 정리해보았습니다.


Javascript

  • JavaScript는 웹 페이지를 동적으로, 프로그래밍적으로 제어하기 위해서 고안된 언어이다.
  • ECMA Script
    • 표준화 기구인 Ecma International에 의해서 관리되는 ‘자바스크립트 표준안’이다.


숫자와 문자

  • 데이터: 정보이고, 프로그래밍에서 그 정보가 무엇이냐에 따라 type이 있다.

  • html을 누르고 tab키를 누르면 html의 샘플이 만들어짐

  • 정수

    • alert(1); //alert사이에 어떤 값을 주면, 괄호 안에 들어가있는 값이 표시된다.
      
    • 1은 숫자라는 데이터 형식이며, 정수이다.

    • 정수는 0 을 기준으로 해서 1, 2, 3, 4, 그리고 0을 포함해서, -1, -2, -3과 같은 숫자이다.
  • 실수

    • alert(1.1);
      alert(1.111);
      alert(1.1+1.1); //2.2
      alert(2*8) //16
      alert(6/2); 
      1 + 1 //2
      10 * 2 //20
      1 // 1
          
      
    • 1.1은 실수이다.
    • 0과 1.0 그리고 2.0 등 그 사이에 수 많은 숫자가 존재한며, 실수는 ‘소숫점’으로 존재한다.
  • 정수와 실수를 포괄적으로 Number라고 부른다.

  • /: slash라 부른다

수의 연산

  • Math
    • Math.pow(a, b) :a^b를 말한다.
      • Math.pow(3,2): 3의 2승을 말하며, 9가 출력된다.
    • Math.round(a, b): 반올림
      • Math.round(10.6): 11
    • Math.floor(a): 내림
      • Math.floor(10.2): 10
    • Math.sqrt(a): 제곱근
      • Math.sqrt(9): 3
    • Math.random(): 0과 1.0사이의 random한 숫자 출력
      • 0~100 의 숫자를 얻고 싶다면, 100*Math.random()
      • 0~100 의 정수를 얻고 싶다면, Math.round(100*Math.random());

문자의 표현

  • 숫자와 문자: 가장 많이 사용하는 데이터 형식

  • JavaScript에서 문자를 표현하기 위해서는 ‘ ‘(작은따옴표) 혹은 “ “(큰따옴표)를 사용한다.

  • 예시

    • alert('coding everybody');
      alert("coding everybody");
      alert("coding everybody'); → 에러! 
      
      • 마지막 줄에서 에러가 나는 이유는 작은 따옴표는 작은 따옴표끼리, 큰 따옴표는 큰 따옴표끼리 사용해야하기 때문이다.
    • 문자열에 작은 따옴표를 쓰고 싶다면?

      • alert("egoing's coding everybody");
              
        //하단은 문제될 경우
        alert('egoing's coding everybody'); 
        //egoing만 문자이고 그 뒤는 문자로 인식하지 않기 때문에 에러 발생
        //해결 방법
        alert('egoing\'s coding everybody');
        
      • \ (역슬래시)
        • 이스케이프라고 한다.
        • 역슬래시 바로 뒤에 있는 문자 하나는 정보로 해석한다라는 약속이 되어있다.
  • 숫자가 문자가 되는 경우?

    • 숫자에 따옴표가 붙어있는 경우로, 문자열이라고 부른다!

    • 예시) “1”, ‘1’ → 문자열이다.

    • typeof 1 //"number"
      typeof "1" //"string"
      
    • 문자열: 문자들의 모임, 문자들의 집합, 영어로는 string

문자에 대한 표현

  • 여러줄로 표시하고 싶다면?

    • 줄바꿈: \n (역슬래시 + n)

    • alert("coding \n everybody")
      //위 결과 출력
      //coding
      //everybody
          
      alert("coding" "everybody") //codingeverybody
      alert("coding"+" "+"everybody") //coding everybody
      
  • 숫자인 문자열을 더한다면?

    • "1"+"1"
      //"11"
      
  • 길이 출력

    • "coding.everybody".length //16
      "code".length //4
      
  • indexOf

    • 문자열 내에서 특정한 문자열의 index값을 리턴한다.

    • strinValue.indexOf(searchValue[,fromIndex])
      //[ ] 대괄호로 되어있는 것은 사용하지 않아도 된다는 뜻이다.
      
    • "code".indexOf("o") //1
      "code".indexOf("d") //2
      "code".indexOf("e") //3
      


변수

  • 영어로는 variable이라고 하며 컨테이너로 문자나 숫자와 같은 값을 유지할 필요가 있을 때 사용한다.

변수의 선언

  • 변수는 var 키워드를 사용한다. 즉, 변수를 선언하겠다는 것을 의미한다.

  • var a = 1;
    alert(a); //1
    a = 10
    alert(a); //10
    var a = 2;
    
    • a는 값을 담는 그릇이고, 어떠한 값도 담을 수 있기 때문에 그 그릇이 계속 바뀐다.
  • var a = 1;
    var b = 2;
    alert(a+b); //3
    a = 2;
    alert(a+b); //4
    
  • 변수에는 꼭 숫자만 올 수 있는 것이 아니다

    • var first = 'coding';
      alert(first+' everybody')//first everybody
      first = '코딩' 
      alert(first + ' everybody') //코딩 everybody
      
    • var a = 'coding', b = 'everybody'
      alert(a+b) //codingeverybody
      

변수가 없다면/ 변수의 효용

  • 변수는 왜 쓰는가?

  • 변수는 코드의 재활용성을 높여준다.

  • 예를들어서 100에 10을 더하고, 10을 나눈 후에 다시 10을 빼고 거기에 10을 곱해야 한다고 치자. 그리고 각 단계마다 그 결과를 출력해야 한다면 코드는 아래와 같을 것이다. 예를 들어서 100에 10을 더하고, 10을 나눈 후에 다시 10을 빼고 거기에 10을 곱해야 한다고 치자. 그리고 각 단계마다 그 결과를 출력해야 한다면 코드는 아래와 같을 것이다.

    • alert(100+10);
      alert((100+10)/10);
      alert(((100+10)/10)-10);
      alert((((100+10)/10)-10)*10);
      
      • 100을 100으로 수정한다고 하면, 위의 코드를 모두 수정해야 한다.
  • 변수를 적용해본다면?

    • a = 100; //변할 수 있는 영역
      //하단은 변하지 않는 영역
      a = a + 10;
      alert(a);
      a = a / 10;
      alert(a);
      a = a - 10;
      alert(a);
      a = a * 10;      
      alert(a);
      
  • 변수의 효용은 중요하다!


주석

  • 한국어로는 주석, comment
  • 주석은 문법적으로 해석되지 않는다. 그렇기 때문에 적합한 형태의 설명을 부가할 수 있다.
    • 미래에 봤을 때 자신이 작성한 코드를 이해할 수 있고,
    • 타인이 봤을 때 자신이 작성한 코드의 취지를 설명해야 되는 경우에 주석 사용
    • 어떤 코드를 일시적으로 동작하지 않게 할 때 사용한다.
  • //
    • 줄바꿈 하기 전까지 주석 (한 줄)
  • /* */
    • 여러줄을 주석처리할 수 있다.


줄바꿈과 여백

  • var a = 1;
    alert(a);
    
  • ; = 세미콜론

    • 명령이 끝났다는 것을 명시적으로 표시할 때 사용
    • 세미콜론을 삭제해도 명령은 잘 동작한다! (줄바꿈이 되어있기 때문에, 명령이 끝났다고 인식)

    • 반드시 필요한 경우: 2줄에 있는 것을 1줄로 바꾸고 싶다.

      • var a = 1; alert(a);
        
  • 여백

    • 여백은 tab키를 누르거나 4번 스페이스를 누른다.


비교

연산자란

  • 어떤 작업을 컴퓨터에게 지시하기 위한 기호
  • 예시
    • a = 1
      • a 는 변수
      • 1은 값 혹은 상수 (바뀌지 않는 값)
      • =은 대입 연산자 (좌항에 있는 값을 우항에 대입한다)
    • 컴퓨터에게 a라는 변수에 1이라고 하는 값을 대입해라 라고 연산자를 통해 하는 것
  • 상수: 변수에 대항되는 개념

비교 연산자

  • 좌항이 있고, 우항이 있을 때, 주어진 값들이 같은지, 큰지, 작은지를 구분하는 것을 의미한다.
  • 비교 연산자를 통해 만들어진 결과 (boolean)
    • true
    • false

== 와 ===

  • == (equal operator)

    • 동등연산자로 좌항과 우항을 비교해서 서로 값이 같다면 true, 다르다면 false가 된다.
    • ’=’가 두 개인 것을 주의해야 한다.
    • '='가 하나인 것은 대입 연산자로, 좌항의 값을 우항의 변수에 대입할 때 우항의 변수에 대입할 때 사용하는 것으로 의미가 완전히 다르다.

    • 코드

      • alert(1==2); //false
        alert(2==2); //true
        alert("one" == "one"); //true
        alert("one"=="two") //false
        
  • === (strict equal operator)

    • 일치 연산자좌항과 우항이 "정확"하게 같을 때 true, 다르면 false가 된다.

    • 코드

      • alert(1==="1") //false
        alert(1=="1") //true
        
    • 데이터 형이 같은 경우에만 같다고 판단

===를 사용하자!

  • 코드

    • alert(null == undefined);       //true
      alert(null === undefined);      //false
      alert(true == 1);               //true
      alert(true === 1);              //false
      alert(true == '1');             //true
      alert(true === '1');            //false
           
      alert(0 === -0);                //true
      alert(NaN === NaN);             //false
      
  • 코드

    • var a; 
      alert(a); //undefined
          
      var a = null;
      alert(a); //null
      
    • null과 undefined의 차이점을 구분하자.
      • null값이 없다는 것이고 프로그래머가 의도적으로 부여한 값이며, undefined는 그냥 값이 없고, 프로그래머가 의도하지 않은 상황이다.
      • null: 값이 없다
      • undefined: 값이 정의되지 않았다.
  • alert(undefined == null) //true
    alert(undefined === null) //false
    
  • 데이터 형식

    • Boolean
      • true/ false
    • Number
      • -1 0 1 2 3
    • String
      • “a”, “b”, “c”
    • undefined
    • null
  • 코드

    • alert(null == undefined);       //true
      alert(null === undefined);      //false
          
      alert(true)   					//true
          
      alert(true == 1) 				//true
      alert(true == 2) 				//false
      alert(true == 3) 				//false
          
      alert(true === 1);              //false
      alert(true == '1');             //true
      alert(true === '1');            //false
           
      alert(0 === -0);                //true
      alert(NaN === NaN);             //false
      
      • Javascript에서 동등연산자(==)는 숫자 1을 true라고 생각하고, 2부터는 false라고 생각한다.
      • NaN === NaN: NaN이라는 것은 수학에서 0/0일 때, 성립하지 않는 경우를 말하기 때문에 NaN은 계산할수 없음이라는 결과에 불과하기 때문에, 둘다 NaN일지라도 false가 된다.


부정과 부등호

  • ! 느낌표는 부정을 의미한다.

!=

  • 코드

    • alert(1!=2);            //true
      alert(1!=1);            //false
      alert("one"!="two");    //true
      alert("one"!="one");    //false
      


!==

  • 정확하게 같지 않다는 의미이다.


>

  • 좌항이 우항보다 크다면 참, 그렇지 않다면 거짓임을 알려주는 연산자다.

  • 코드

    • alert(10>20);   //false
      alert(10>1);    //true
      alert(10>10);   //false
      


>=

  • 좌항이 우항보다 크거나 같다.

  • 코드

    • alert(10>=20);      //false
      alert(10>=1);       //true
      alert(10>=10);      //true
      


조건문

조건문이란

  • 조건문 (Conditional statement)

    • 조건문이란 주어진 조건에 따라서 애플리케이션을 다르게 동작하는 것이다.
  • if로 시작

  • 코드

    • if(true){
          alert('result : true');
      }
      
      • if 뒤에 따라오는 괄호 안에 true가 오게 되면, 중괄호 안쪽에 있는 부분이 실행된다.
    • if(false){
          alert('result : true');
      }
      
      • if 뒤에 false가 오게 되면, 중괄호 안쪽 부분은 실행되지 않는다.
  • 예시

    • if(true){
          alert(1);
          alert(2);
          alert(3);
          alert(4);
      }
      alert(5);
      /*
      출력
      1
      2
      3
      4
      5
      */
      
    • if(false){
          alert(1);
          alert(2);
          alert(3);
          alert(4);
      }
      alert(5);
      //5
      

else, else if

else

  • if문의 조건이 true라면 if의 중괄호 구간이 실행되고, false라면 else이후의 중괄호 구간이 실행된다

  • 예시

    • if(false){
          alert(1);
      } else {
          alert(2);
      }
      

else if

  • 조금 더 다양한 케이스의 조건을 검사할 수 있는 기회를 제공한다.

  • else if의 특징은 if나 else와는 다르게 여러개가 올 수 있으며, else if의 모든 조건이 false라며 else가 실행된다.

  • else는 생략 가능하다

  • 예시

    • if(false){
          alert(1);
      } else if(true){
          alert(2);
      } else if(true){
          alert(3);
      } else {
          alert(4);
      }
      //2
      
    • if(false){
          alert(1);
      } else if(false){
          alert(2);
      } else if(true){
          alert(3);
      } else {
          alert(4);
      }
      //3
      
    • if(false){
          alert(1);
      } else if(false){
          alert(2);
      } else if(false){
          alert(3);
      } else {
          alert(4);
      }
      //4
      


조건문의 응용

변수와 비교 연산자

  • 변수와 비교연산자 그리고 조건문을 결합해본다.

  • 예시

    • a = 1;
      if (a === 1){
          alert(1);
      }
      //1
      
  • prompt

    • 사용자로부터 정보를 받을 수 있게끔 한다.

    • 예시

      • prompt('당신의 나이는?');
        
  • 조합하기

    • alert(prompt('당신의 나이는?'));
      //20이라고 하면 숫자 20에 대한 alert의 결과가 나타난다.
          
      alert(prompt('당신의 나이는?')*2);
      //40
      
    • <!DOCTYPE html>
      <html>
      <head>
          <meta charset="utf-8"/>
      </head>
      <body>
          <script>
              var id = prompt('아이디를 입력해주세요.')
              if(id=='egoing'){
                  alert('아이디가 일치 합니다.')
              } else {
                  alert('아이디가 일치하지 않습니다.')
              }
          </script>
      </body>
      </html>
      


조건문의 중첩

  • <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
    </head>
    <body>
        <script>
            var id = prompt('아이디를 입력해주세요.');
            if(id=='egoing'){
                var password = prompt('비밀번호를 입력해주세요.');
                if(password==='111111'){
                    alert('로그인 하셨습니다.' + id +' 님 반갑습니다.');
                } else {
                    alert('비밀번호가 일치하지 않습니다.');
                }
            } else {
                alert('아이디가 일치하지 않습니다.');
            }
        </script>
    </body>
    </html>
    


논리연산자

&& (and, 그리고)

  • 좌항과 우항이 모두 참일때, 참이된다.

  • AND라는 뜻을 가진 논란 연산자

  • 코드

    • if(true && true){
          alert(1); //1
      }
      if(true && false){
          alert(2);
      }
      if(false && true){
          alert(3);
      }
      if(false && false){
          alert(4);
      }
      
  • 활용 사례

    • <!DOCTYPE html>
      <html>
      <head>
          <meta charset="utf-8"/>
      </head>
      <body>
          <script>
              id = prompt('아이디를 입력해주세요.');
              password = prompt('비밀번호를 입력해주세요.');
              if(id=='egoing' && password=='111111'){
                  alert('인증 했습니다.');
              } else {
                  alert('인증에 실패 했습니다.');
              }
          </script>
      </body>
      </html>
      
      • 중첩된 if문을 하나 줄였다.


|| (Or, 또는)

  • or연산자

  • 좌우항 중에 하나라도 true라면 true가 되는 논리 연산자이다.

  • 코드

    • if(true || true){
          alert(1); //1
      }
      if(true || false){
          alert(2); //2
      }
      if(false || true){
          alert(3); //3
      }
      if(false || false){
          alert(4);
      }
      
  • 활용 예제

    • id = prompt('아이디를 입력해주세요.');
      if(id==='egoing' || id==='k8805' || id==='sorialgi'){
          alert('인증 했습니다.');
      } else {
          alert('인증에 실패 했습니다.');
      }
      
      • id 값이 세 값 중 하나라면, 인증이 된다.
  •   , && 조합 예제
    • id = prompt('아이디를 입력해주세요.');
      password = prompt('비밀번호를 입력해주세요.');
      if((id==='egoing' || id==='k8805' || id==='sorialgi') && password==='111111'){
          alert('인증 했습니다.');
      } else {
          alert('인증에 실패 했습니다.');
      }
      


! (not)

  • 부정의 의미로, Boolean의 값을 역전시킨다.

  • true → false, false → true

  • not 연산자라 부른다

  • 코드

    • if(!true && !true){
          alert(1);
      }
      if(!false && !true){
          alert(2);
      }
      if(!true && !false){
          alert(3);
      }
      if(!false && !false){
          alert(4); //4
      }
      


Boolean의 대체제

  • 조건문에 사용될 수 있는 데이터 형이 꼭 boolean만 되는 것이 아니다.

  • 관습적인 이유로 0은 false, false 0이 아닌 값은 true로 간주된다.

    • if(0){
          alert(1)
      }
      if(1){
          alert(2)
      }
      


기타 false로 간주되는 데이터 형

  • if(''){
        alert('\'\'빈 문자열') //실행되지 않음
    }
    if(!''){
        alert('!\'\' 빈 문자열') // !\\빈 문자열 
    }
    if(!undefined){
        alert('!undefined');//!undefined
    }
    var a;
    if(!a){
        alert('!a 값이 할당되지 않은 변수'); //!a 값이 할당되지 않은 변수 
    }
    if(!null){
        alert('!null'); //!null
    }
    if(!NaN){
        alert('!NaN'); //!NaN
    }
    
    • javascript에서는 null, NaN, undefined 모두 false로 간주


반복문

반복문

  • 반복문 (loop iterate)
    • 컴퓨터는 반복적인 작업을 대행하기 위해서 만들어진 기계다.
    • 반복문은 컴퓨터에게 반복적인 작업을 지시하는 방법이다.


반복문의 문법

while

  • 형식

    • while (조건){
          반복해서 실행할 코드
      }
      
  • 무한 반복/무한 루프을 발생시키는 예시

    • 저장되지 않은 작업이 있다면 모두 정리한 후에 이 명령을 실행하기! 웹브라우저는 무한반복을 허용하지 않기 때문에 어느 정도 시간이 흐르면 스크립트를 종료할 것인지 물어볼 것이다.

    • 반복이 끝나지 않고 컴퓨터에게 무리를 주는 상황

    • while(true){
          document.write('coding everybody <br />');
      }
      
  • 아무런 결과도 출력하지 않는 예시

    • 무한 루프를 막기 위해서는 어느 순간 while 문에서 false가 되어야 한다.

    • while(false){
          document.write('coding everybody <br />');
      }
      
  • 반복 조건 주기

    • var i = 0;
      while(i<10){
          document.write("Coding everybody <br /")
          i++;
      }
      //i가 9일때 마지막으로 실행되고, i가 10이 되면서 실행이 멈추게 된다.
      


for

  • 반복 조건이 있

  • 형식

    • for(초기화; 반복조건; 반복이  때마다 실행되는 코드){
          반복해서 실행될 코드
      }
      
    • 반복이 될 때마다 실행되는 코드 뒤에는 ‘;’ (세미콜론)이 있으면 안된다.
  • 예시

    • for(var i = 0; i < 10; i++){
          document.write('coding everybody'+i+'<br />');
      }
      
      • var i = 0 : 초기화
      • i < 10: 조건
  • i++

    • 1씩 증가
  • ++i vs i ++

    • ++i: i의 값이 0일때, alert(++i);는 1이다. 그 이후 한 번 더 실행하면 2, 3, …
      • 사용할 때, i의 값을 증가시키고 사용
    • i++: i의 값이 0 일때, alert(i++);는 0이다. 그 이후 한 번 더 실행하면 1, 2,…
      • 기존의 값을 사용하고, i의 값을 증가시킨다 .


반복문의 효용

  • 반복문이 없다면?

    • coding everybody를 10번 반복해서 출력하고 싶다고 한다면..

      • document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        document.write('coding everybody');
        
      • 하나하나 코드를 다 써야 한다.
    • while문을 사용한다면?

      • var i = 0;
        while(i < 10){
            document.write('coding everybody <br />');
            i++;
        }
        
    • 반복문 없이 1부터 10까지 출력하고 싶다면? 행마다 숫자를 바꿔야 한다.

      • document.write('coding everybody 1<br />')
        document.write('coding everybody 2<br />')
        //중략
        document.write('coding everybody 9<br />')
        document.write('coding everybody 10<br />')
        
    • 반복문을 사용한다면?

      • var i = 0;
        while(i < 10){
            document.write('coding everybody '+i+'<br />');
            i++;
        }
        
    • 2의 배수를 원한다면?

      • var i = 0;
        while(i < 10){
            document.write('coding everybody '+(i*2)+'<br />');
            i++;
        }
        


반복문의 제어 (break, continue)

break

  • 반복 작업을 중간에 중단시키고 싶다면 break를 사용한다.

  • 예시

    • for(var i = 0; i < 10; i++){
          if(i === 5) {
              break;
          }
          document.write('coding everybody'+i+'<br />');
      }
          
      /*
      결과
      coding everybody 0
      coding everybody 1
      coding everybody 2
      coding everybody 3
      coding everybody 4
          
      */
      
      • i == 5일 때 for문이 종료되면서 i가 4까지의 문구가 출력된다.


continue

  • 실행을 즉시 중단하면서 반복은 지속되게 하려면 continue를 사용해야 한다.

  • 예제

    • for(var i = 0; i < 10; i++){
          if(i === 5) {
              continue;
          }
          document.write('coding everybody'+i+'<br />');
      }
          
      /*
      결과
      coding everybody 0
      coding everybody 1
      coding everybody 2
      coding everybody 3
      coding everybody 4
      coding everybody 6
      coding everybody 7
      coding everybody 8
      coding everybody 9
          
      */
      
      • 5가 되었을 때 실행이 중단되고 다시 반복문이 지속됐기 때문에 i가 5일때는 출력이 되지 않았다.


반복문의 중첩

  • 반복문 안에 다시 반복문이 나타날 수 있다.

  • 예시 (0부터 99까지 출력)

    • // 0부터 9까지 변수 i에 순차적으로 값을 할당        
      for(var i = 0; i < 10; i++){
          // 0부터 9까지의 변수를 j의 값에 순차적으로 할당
          for(var j = 0; j < 10; j++){    
              // i와 j의 값을 더한 후에 출력
              // String은 숫자인 i와 j의 데이터 타입을 문자로 형태를 변환하는 명령이다. 
              // String()을 제거하고 실행해보면 의미가 좀 더 분명하게 드러날 것이다.
              document.write(String(i)+String(j)+'<br />');
          }
      }
      
      • String(i), String(j)는 숫자를 문자로 형변환 한 것이다.


함수

함수란

함수

하나의 로직을 재실행 할 수 있도록 하는 것으로 코드의 재사용성을 높인다.


함수의 형식

  • function 함수명( [인자...[,인자]] ){
       코드
       return 반환값
    }
    


함수의 정의와 호출

  • 함수는 function 뒤에 함수의 이름이 오고, 소괄호가 따라온다.

  • 소괄호에 인자라는 값이 차례대로 들어오는데, 이 값은 함수를 호출할 때 함수의 로직으로 전달될 변수이다.

  • 인자는 생략할 수 있으며, 함수를 호출했을 때 실행하게 될 부분이 중괄호 안쪽에 온다.

  • 코드 (0부터 9까지 출력)

    • function numbering(){
          i = 0;
          while(i < 10){
              document.write(i);
              i += 1;
          }   
      }
      numbering(); //함수 호출
          
      //결과: 0123456789
      


함수의 효용

  • 함수가 없다면?

    • 0 부터 9까지 출력하는 코드를 5번 하라고 하면 이걸 반복으로 작성해야함.

      • var i = 0;
        while(i < 10){
            document.write(i);
            i += 1;
        }
               
        var i = 0;
        while(i < 10){
            document.write(i);
            i += 1;
        }
               
        var i = 0;
        while(i < 10){
            document.write(i);
            i += 1;
        }
               
        var i = 0;
        while(i < 10){
            document.write(i);
            i += 1;
        }
               
        var i = 0;
        while(i < 10){
            document.write(i);
            i += 1;
        }
        
    • 이런 상황을 막기 위해 함수를 사용한다.

      • function numbering(){
            var i = 0;
            while(i < 10){
                document.write(i);
                i += 1;
            }   
        }
               
        numbering();
        numbering();
        numbering();
        numbering();
        numbering();
        
  • 함수의 장점

    • 재사용성!: 이 함수를 여러곳에서 사용하고 있는데, 만약 함수를 수정해야 한다면, 그 함수의 내용을 수정, 변경, 개선만 하면 모든 곳에서 변경된 함수를 사용할 수 있다.
    • 유지보수에 용이하다. (Easy maintenance)
    • 가독성


함수의 입력과 출력

  • 입력된 값을 출력하는 것이 함수의 기본적인 역할이다.
  • 함수라는 상자 안에다가 값을 주고, 그 값에 따라 가공된 값이 나온다.

함수의 출력

return
  • return이 나오면 수행하는 기능

    • 함수를 종료시킨다
    • return 값을 함수 바깥쪽으로 뱉어낸다.
  • 코드

    • function get_member1(){
          return 'egoing';
      }
           
      function get_member2(){
          return 'k8805';
      }
           
      alert(get_member1()); //egoing
      alert(get_member2()); //k8805
      
    • function get_member(){
          return 'egoing';
          return 'k8805';
          return 'sorialgi';
      }
      alert(get_member()); //egoing
      
      • egoing만 출력된다.
      • return이라고 쓰여있기 때문에 거기서 함수가 종료된다.

함수의 입력

인자란?
  • 함수의 괄호 안에 인자가 들어간다. 즉, 함수로 유입되는 입력 값을 의미한다.

  • 어떤 값을 인자로 전달하느냐에 따라 함수가 반환하는 값이나 메소드의 동작방법을 다르게 할 수 있다.

  • 코드

    • function get_argument(arg){
          return arg * 1000;
      }
           
      alert(get_argument(1)); //1000
      alert(get_argument(2)); //2000
      
      • arg가 인자이다.
매개변수
  • 위의 예제에서 arg가 매개변수 (parameter)이다.
복수의 인자
  • 여러개의 입력 값을 받고 싶은 경우

  • 예시

    • function get_arguments(arg1, arg2){ //매개변수가 2개
          return arg1 + arg2
      }
           
      //인자도 2개 
      alert(get_arguments(10, 20)); //30
      alert(get_arguments(20, 30)); //50
      


다양한 정의 방법

  • 생성자를 이용한 함수 정의 (함수 표현식)

    • var numbering = function (){
          i = 0;
          while(i < 10){
              document.write(i);
              i += 1;
          }   
      }
      numbering();
      
      • 함수의 정의 부분이 좌항에 있는 numbering이라는 변수에 대입된 것이다.
      • numbering이라는 변수가 함수를 갖게된 것이다!
    • 함수 선언문

      • function numbering(){
            var i = 0;
            while(i < 10){
                document.write(i);
                i += 1;
            }   
        }
        
    • 익명함수

      •  (function (){
             i = 0;
             while (i<10){
                 document.write(i);
                 i += 1;
             }
         }) ;
        


배열

배열의 문법

배열

  • 배열(array)이란 연관된 데이터를 모아서 통으로 관리하기 위해서 사용하는 데이터 타입이다.
  • 변수가 하나의 데이터를 저장하기 위한 것이라면, 배열은 여러 개의 데이터를 하나의 변수에 저장하기 위한 것이다.

배열의 생성

  • 대괄호([])는 배열을 만드는 기호다. 대괄호 안에 데이터를 콤마(,)로 구분해서 나열하면 배열이 된다.

  • 변수에 회원정보를 담아보기!

    • var member = ['egoing', 'k8805', 'sorialgi']
      
  • 각각의 데이터를 원소(Element)이라고 부른다.

    • var member = ['egoing', 'k8805', 'sorialgi']
      alert(member[0]); //egoing
      alert(member[1]); //k8805
      alert(member[2]); //sorialgi
      
    • 0, 1, 2는 색인 (index)라고 부른다.

배열의 효용

배열이 없다면?

  • 예시

    • function get_member1(){
          return 'egoing';
      }
      document.write(get_member1());
           
      function get_member2(){
          return 'k8805';
      }
      document.write(get_member2());
           
           
      function get_member3(){
          return 'sorialgi'
      }
      document.write(get_member3());
      
  • 하나의 함수는 하나의 값만을 반환할 수 있기 때문에 위와 같이 각각의 회원정보를 반환하는 함수를 만들어야 한다.

  • 그러나 배열을 이용한다면?

    • function get_members(){
          return ['egoing', 'k8805', 'sorialgi'];
      }
      var members = get_members();
      document.write(members[0]);
      document.write(members[1]);
      document.write(members[2]);
      

배열과 반복문의 조우

배열의 사용

  • 배열의 진가는 반복문과 결합했을 때, 나타난다. 반복문으로 리스트에 담긴 정보를 하나씩 꺼내서 처리할 수 있기 때문이다.

  • 예제

    • function get_members(){
          return ['egoing', 'k8805', 'sorialgi'];
      }
      members = get_members();
      // members.length는 배열에 담긴 값의 숫자를 알려준다. 
      for(i = 0; i < members.length; i++){
          // members[i].toUpperCase()는 members[i]에 담긴 문자를 대문자로 변환해준다.
          document.write(members[i].toUpperCase());   
          document.write('<br />');
      }
          
      /* 결과
      egoing
      k8805
      sorialgi
      */
      
    • var a = "egoing"
      a.toUpperCase(); //EGOING
          
      var a = ['egoing', 'k8805', 'sorialgi'];
      alert(a.length); //3 
      
      • a.length: a라고 하는 배열의 값이 몇개인가?

데이터의 추가

배열의 제어

  • 배열은 복수의 데이터를 효율적으로 관리, 전달하기 위한 목적으로 고안된 데이터 타입이다.
  • 따라서, 데이터의 추가/수정/삭제와 같은 일을 편리하게 할 수 있도록 돕는 다양한 기능을 가지고 있다.
배열의 크기
  • 배열의 크기를 알아내는 것은 변수.length를 사용하면 된다.

  • var arr = [1,2,3,4,5];
    alert(arr.length); //5
    
배열의 추가
  • 배열에 어떤 데이터를 추가한다

  • push는 인자로 전달된 값을 배열에 추가하는 명령이다.

    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li.push('f');
        alert(li); //['a', 'b', 'c', 'd', 'e', 'f']
        
  • Concat

    • 복수의 원소를 배열에 추가하는 방법이다.

    • concat은 인자로 전달된 값을 추가하는 명령어다.

    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li = li.concat(['f', 'g']);
        alert(li); ////['a', 'b', 'c', 'd', 'e', 'f', 'g']
        
  • unshift

    • 배열의 시작점에 원소를 추가하는 방법

    • unshift는 인자로 전달한 값을 배열의 첫 번째 원소로 추가하고 배열의 기존 값들의 색인을 1씩 증가시킨다

    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li.unshift('z');
        alert(li); //['z', 'a', 'b', 'c', 'd', 'e']
        
  • splice

    • 특정 인덱스에 원소를 추가하고 싶을 때나 배열의 특정 구간을 추출할 때 사용

    • splice는 첫 번째 인자에 해당하는 원소부터 두 번째 인자에 해당하는 원소의 숫자만큼의 값을 배열로부터 제거한 후에 리턴한다.

    • splice(index, howmany, element1, … ,elementN);

      • index: 배열에 추가할 특정 배열의 위치를 가르키는 index
      • howmany: index에서부터 제거될 원소들의 수 혹은 index부터 index + howmany에 해당하는 원소들은 삭제된다.
        • 이 값이 0 이면 어떠한 원소도 삭제되지 않는다.
      • element1 … elementN: index와 index+howmany 사이에 추가된 값
    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li.splice(2, 0, 'B');
        alert(li); //['a', 'b', 'B', 'c', 'd', 'e']
        
      • var a = ["a", "b", "c"]
        a.splice(1, 1, 'x', 'y');
        alert(a) //["a", "x", "y", "C"]
        


제거
  • shift

    • 배열의 첫번째 원소를 제거하는 방법이다.

    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li.shift();
        alert(li); // ['b', 'c', 'd', 'e']
        
  • pop

    • 배열 끝점의 원소를 배열에서 제거한다.

    • 예시

      • var li = ['a', 'b', 'c', 'd', 'e'];
        li.pop();
        alert(li); //['a', 'b', 'c', 'd']
        


정렬
  • sort

    • array.sort(sortfunc)

    • 예시

      • var li = ['c', 'e', 'a', 'b', 'd'];
        li.sort();
        alert(li); //['a', 'b', 'c', 'd', 'e'];
        
    • 역순 정렬 예시

      • var li = ['c', 'e', 'a', 'b', 'd'];
        li.reverse();
        alert(li); //['e','d','c','b','a']
        
    • 다양한 방법으로 정렬하기 예시

      • var numbers = [9,8,7,6,5,4,3,2,1];
        alert(numbers.sort()); // array, [1,2,3,4,5,6,7,8,9]
        alert(numbers); // array, [1,2,3,4,5,6,7,8,9], 원본을 변경한다. 
        alert(numbers.sort() === numbers); // boolean, true, 원본과 반환값이 같다.
               
        var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
        //array, [1,10,2,20,3,4,5,6,7,8,9], 암시적으로 원소를 문자로 형변환 하기 때문에 10이 1뒤에 온다.
        alert(numbers.sort()); 
        
      • function sortNumber(a,b){
            // 비교 대상인 a와 b가 인자로 전달된다.
            //alert('a :'+a+', b:'+b);
            // a에서 b를 뺀 결과가 음수면 a가 b보다 작고, 0이면 같다.
            // sort메소드는 return 값이 음수,양수,0인지에 따라서 순서를 정한다.
            return a-b;
        }
        var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
        alert(numbers.sort(sortNumber)); // array, [1,2,3,4,5,6,7,8,9,10,20]
        
      • function sortNumber(a,b){
            // 위의 예제와 비교해서 a와 b의 순서를 바꾸면 정렬순서가 반대가 된다.
            return b-a;
        }
        var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
        alert(numbers.sort(sortNumber)); // array, [20,10,9,8,7,6,5,4,3,2,1]
        


객체

객체 (Object)

  • 데이터가 추가되면 배열 전체에서 중복되지 않는 인덱스가 자동으로 만들어져서 추가된 데이터에 대한 식별자가 된다.
  • 이 인덱스를 이용해서 데이터를 가져오게 되는 것이다.
  • 만약 인덱스로 문자를 사용하고 싶다면 객체 (dictionary)를 사용해야 한다.
  • 다른 언어에서는 연관 배열(associative array) 또는 맵 (map), 딕셔너리(dictionary) 라는 데이터 타입이 객체에 해당한다.

배열과 객체의 차이

  • 객체: index의 값으로 숫자를 쓰는 것이 아니라, 문자열도 쓸 수 있다.

객체의 생성

  • 중괄호로 시작해 중괄호로 끝난다.

  • 객체 리터럴을 사용해 객체를 만드는 방법

    • var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
      
  • 배열 요소를 할당해 객체를 만드는 다른 방법

    • var grades = {}; //먼저 비어있는 객체를 만든다.
      //egoing은 key가 되고, 10은 value가 된다.
      grades['egoing'] = 10;
      grades['k8805'] = 6;
      grades['sorialgi'] = 80;
      
  • 객체를 만드는 다른 방법: 생성자 new 사용 (미리 정의되어 제공하는 객체 생성)

    • var grades = new Object();
      grades['egoing'] = 10;
      grades['k8805'] = 6;
      grades['sorialgi'] = 80;
      

객체 속성 접근 방법

  • key값을 사용한다.

  • 예시

    • var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
      alert(grades['sorialgi']);//80
      alert(grades['k88'+'05']); //6
      alert(grades.k8805) //6
      alert(grades.'k88'+'05') //syntax error
      

객체와 반복문의 조우

  • 객체에 저장된 데이터를 기준으로 반복 작업을 하는 방법이다.

    • var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
      for(key in grades) {
          document.write("key : "+key+" value : "+grades[key]+"<br />");
      }
      /* 결과
      key :   egoing value : 10
      key :   k8805 value : 6
      key :   sorialgi value : 80
          
      */
      
  • 예시

    • var arr=['a','b','c']
      for (var i = 0; i<arr.length; i++){
          console.log(arr[i])
      }
      
배열 vs 객체
  • 배열은 저장된 데이터들이 순서를 가지고 있다.
    • 먼저 들어간 것과 나중에 들어간 것이 내부적으로 기록되고 있기 때문에, 추가된 순서에 따라 꺼낼때 그 요소가 나와진다.
  • 객체는 순서들을 가지고 있지 않다.
    • key와 value로 접근한다.
    • 객체에는 객체를 담을수도 있고, 함수도 담을 수 있다.


객체지향 프로그래밍

  • 코드

    • var grades = {
          'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80}
      }
      alert(grades['list']['egoing']) //10
      
    • var grades = {
          'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80},
          'show' : function(){
              alert('Hello World');
              }
          }
      };
      grades['show'](); //함수를 호출하는 것이기 때문에 grades['show']뒤에 ()가 붙는 것
      //Hello World
      
  • ‘show’: function{}: 객체 메소드라고 한다

  • this 키워드

    • 약속되어 있는 변수로, 함수가 속해있는 객체를 가리키는 변수를 말한다.

    • 예시

      • var grades = {
            'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80},
            'show' : function(){
                console.log(this.list);
            }
        };
        grades['show'](); //Object (egoing:10, k8805: 6, sorialgi: 80)
        
      • var grades = {
            'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80},
            'show' : function(){
                for(var name in this.list){
                    document.write(name+':'+this.list[name]+"<br />");
                }
            }
        };
        grades.show();
        
  • 하나의 객체가 있고, 그 객체 안에 어떠한 데이터가 있고, 그리고 그 데이터를 사용하는 함수가 있다.

  • 그리고 그 함수를 사용할 때는 그 객체의 이름과 함수를 사용하여 소속되어 있는 함수를 처리할 수 있다.

  • 객체지향프로그래밍

    • 서로 연관되어있는 데이터와 어떠한 처리 (함수)를 하나의 그릇 안에 모아서 그룹핑 해서 모아놓은 것이 객체지향프로그래밍이라고 한다.
      • grades안에 list와 show가 있다.

유효범위

  • 유효범위: 변수의 수명을 의미한다

  • 범위: 함수 안쪽에 정의된 변수 (지역변수 local variable) → 함수 바깥쪽에 정의된 변수 (전역변수global variable)

  • 예제

    • var vscope = 'global';
      function fscope(){
          alert(vscope);
      }
      fscope(); //global 출력
      
      • fscope이라는 함수는 함수 바깥쪽에 있는 변수 vscope 에 접근 가능


    • var vscope = 'global';
      function fscope(){
          var vscope = 'local'; //함수 안에서만 접근 가능
          alert(vscope);
      }
      fscope(); //local 출력
      
      • 함수 내에서 정의된 변수를 정의한다.


    • var vscope = 'global';
      function fscope(){
          alert(vscope);
      }
      function fscope2(){
          alert(vscope);
      }
      fscope(); //global
      fscope2(); //global
      

    • var vscope = 'global';
      function fscope(){
          var vscope = 'local';
          var lv = 'local variables';
          alert(lv); //local variables
      }
      fscope();
      alert(lv); //undefined
      
      • lv는 지역변수이고, 함수 내에서만 접근 가능하기 때문에, 바깥쪽에서 lv 라고 하면, undefined라고 실행


    • var vscope = 'global';
      function fscope(){
          var vscope = 'local';
      }
      fscope();
      alert(vscope); //global
      
      • global인 이유는 var이라는 키워드를 사용해서 local변수를 만드는 것이다.


    • var vscope = 'global';
      function fscope(){
          vscope = 'local';
      }
      fscope();
      alert(vscope); //local
      
      • local인 이유는, 전역변수인 vscope을 변경하게 된 것이기 때문이다.


    • var vscope = 'global';
      function fscope(){
          var vscope = 'local';
          alert('함수안 '+vscope); //local
      }
      fscope();
      alert('함수밖 '+vscope); //global
      


유효범위의 필요성

  • 예시

    • function a (){
          var i = 0;
      }
      for(var i = 0; i < 5; i++){
          a();
          document.write(i);
      }
      //1234
      


    • function a (){
          i = 0;
      }
      for(var i = 0; i < 5; i++){
          a();
          document.write(i);
      }
      //무한 반복!!
      
      • for문에 var i의 i는 전역변수가 된것이고, function a에서 i에 var을 없앴기 때문에 전역변수를 0으로 만들어주는 것과 같다. i를 지속적으로 0으로 만들어줬기 때문에 무한반복이 발생한다.


전역변수의 사용

  • 불가피하게 전역변수를 사용해야 하는 경우는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용한다.

  • 코드

    • MYAPP = {}
      MYAPP.calculator = {
          'left' : null,
          'right' : null
      }
      MYAPP.coordinate = {
          'left' : null,
          'right' : null
      }
           
      MYAPP.calculator.left = 10;
      MYAPP.calculator.right = 20;
      function sum(){
          return MYAPP.calculator.left + MYAPP.calculator.right;
      }
      document.write(sum()); //30
      
      • MYAPP이라는 변수를 만들었고, 객체이다. 그리고 전역변수이다.
      • Calculator속성의 값으로 다시 객체가 온다. (left, right로)
      • calculator와 coordinate의 속성 안에 left와 right는 스펠링이 같지만 다른 것이다.


    • (function(){
          var MYAPP = {}
          MYAPP.calculator = {
              'left' : null,
              'right' : null
          }
          MYAPP.coordinate = {
              'left' : null,
              'right' : null
          }
          MYAPP.calculator.left = 10;
          MYAPP.calculator.right = 20;
          function sum(){
              return MYAPP.calculator.left + MYAPP.calculator.right;
          }
          document.write(sum());
      }())
      
      • MYAPP은 함수 안의 지역변수가 되었다.
      • 익명함수
        • 전역변수가 전혀 존재하지 않는 코드이다.


유효범위의 대상 (함수)

  • 자바스크립트는 함수에 대한 유효범위만을 제공한다.

  • 많은 언어들이 블록({})에 대한 유효범위를 제공하는 것과 다른 점이다.

  • 코드

    • for(var i = 0; i < 1; i++){
          var name = 'coding everybody';
      }
      alert(name); //coding everybody
      
      • for문의 중괄호 안에서 선언되어도 이 중괄호 안에서만 허용되는 변수가 아니고, 바깥에서도 허용이 가능하다. 지역변수로서의 의미를 갖지 않는다.


정적 유효 범위

  • 자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다.

  • 이러한 유효범위의 방식을 정적 유효범위 (static scoping) 혹은 레시컬 (lexical scoping)이라고 한다.

  • 코드

    • var i = 5;
           
      function a(){
          var i = 10;
          b();
      }
           
      function b(){
          document.write(i); //i의 전역변수가 사용된다
      }
           
      a(); //5
      
      • 정적 유효범위/어휘적 유효범위: 사용될 때가 아니고 정의될 때의 전역변수가 사용된다.


값으로서의 함수와 콜백

함수의 용도 1

  • JavaScript에서는 함수도 객체이다.

  • 다른 언어와 다른 점: 함수가 값이 될 수 있다는 점이다.

  • 예제 (아래는 함수이다)

    • function a(){}
      
    • var a = function() {}
      
      • 위와 같다.
      • 함수가 값이기 때문에 이렇게 선언할 수 있는 것이다.

메소드

  • 메소드: 객체의 속성 값으로 담겨진 함수

  • 예시

    • a = {
          b:function(){
          }
      };
      
      • 객체 안에 정의된 함수는 메소드이다.
      • b: key, function(): value
      • key가 어떠한 값을 저장하는데, 그말은 key가 변수와 같은 역할을 하는 것이고, 즉 속성, property이다.

함수는 다른 함수의 인자로 전달 될 수도 있다.

  • 예제

    • function cal(func, num){
          return func(num)
      }
      function increase(num){
          return num+1
      }
      function decrease(num){
          return num-1
      }
      alert(cal(increase, 1));
      alert(cal(decrease, 1));
      
      • increase와 decrease 함수가 cal 함수의 인자로 전달되고 있다.


함수의 용도 2

  • 함수는 함수의 리턴 값으로도 사용될 수 있다.

  • 예시

    • function cal(mode){
          var funcs = {
              'plus' : function(left, right){return left + right},
              'minus' : function(left, right){return left - right}
          }
          return funcs[mode];
      }
      alert(cal('plus')(2,1)); //3
      alert(cal('minus')(2,1)); //1
      
  • 함수는 배열의 값으로도 사용될 수 있다.

  • 예시

    • var process = [
          function(input){ return input + 10;},
          function(input){ return input * input;},
          function(input){ return input / 2;}
      ];
      var input = 1;
      for(var i = 0; i < process.length; i++){
          input = process[i](input);
      }
      alert(input);
      
      • i의 값이 0일 때, process안의 첫번째 원소 (function)인 return input + 10에 들어가 input이 1이 되어서 return 값이 11이 됨
      • i의 값이 1일 때, process안의 두번째 원소 (function)인 return input * input에 들어가 input이 11이 되어서 return 값이 121이 됨
      • i의 값이 2일 때, process안의 세번째 원소 (function)인 return input / 2에 들어가 input이 121이 되어서 return 값이 60.5가 됨
  • first-class citizen: 변수, 함수의 매개변수, 리턴값 용도로 사용할 수 있는 데이터를, 프로그래밍에서는 first class citizen/object 라고 한다.


콜백

  • 콜백: 어떠한 함수가 수신하는 인자가 함수인 경우를 콜백이라 한다.

처리의 위임

  • 값으로 사용될 수 있는 특성을 이용하면 함수의 인자로 전달할 수 있다.

  • 값으로 전달된 함수는 호출될 수 있기 때문에 이를 이용하면 함수의 동작을 완전히 바꿀 수 있다.

  • 인자로 전달된 함수 sortNumber의 구현에 따라서 sort의 동작방법이 완전히 바뀌게 된다.

  • sort의 문제점

    • var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
      console.log(numbers.sort());
      //[1, 10, 2, 20, 3, 4, 5, 6, 7, 8, 9]
      
      • 원하는 대로 정렬이 되지 않는다.
  • sort는 인자로 function을 받을 수 있다.

    • var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
      var sortfunc = function(a, b){
          console.log(a, b)
      }
      console.log(numbers.sort(sortfunc));
      /*
      10 20
      9 10
      8 9
      7 8
      6 7
      5 6
      4 5
      3 4
      2 3
      1 2
      (11) [20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
      */
      
      • sort라는 값을 호출될 때 계속 값들을 비교하면서, 작은 것들을 앞으로 보내면서 값을 전달.
    • var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
      var sortfunc = function(a, b){
          console.log(a, b)
          if(a>b){
              return 1;
          }else if (a<b){
              return -1;
          } else{
              return 0;
          }
      }
      console.log(numbers.sort(sortfunc));
      /*
      10 20
      9 10
      8 9
      7 8
      6 7
      5 6
      4 5
      3 4
      2 3
      1 2
      (11) [20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
      */
      
    • function sortNumber(a,b){
          // 위의 예제와 비교해서 a와 b의 순서를 바꾸면 정렬순서가 반대가 된다.
          return b-a;
      }
      var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
      alert(numbers.sort(sortNumber)); //numbers는 배열 객체 sort는 메소드
      // array,  [20,10,9,8,7,6,5,4,3,2,1]
      
    • var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
      var sortfunc = function(a, b){
          return b-a;
      }
      console.log(numbers.sort(sortfunc)); //sortfunc가 콜백함수를 말한다.
      
      • 콜백함수라는 것은 콜백함수를 수신 받는 메소드 sort가 콜백함수의 내용을 인자로 전달받아, 내부적으로 호출하는 것을 통해서, sort라는 함수가 동작하는 기본적인 동작법을 변경할 수 있게 된 것이다.


비동기콜백

  • 콜백은 비동기처리에서도 유용하게 사용된다.

  • 시간이 오래걸리는 작업이 있을 때 이 작업이 완료된 후에 처리해야 할 일을 콜백으로 지정하면 해당 작업이 끝났을 때 미리 등록한 작업을 실행하도록 할 수 있다.

  • ajax: asynchronous (비동기) javascript and XML

  • 다음 코드는 일반적인 환경에서는 작동하지 않고 서버 환경에서만 동작한다.

    • datasource.json.js

      • {"title":"JavaScript","author":"egoing"}
        
    • demo1.html

      • <!DOCTYPE html>
        <html>
        <head>
        <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
        </head>
        <body>
        <script type="text/javascript">
            $.get('./datasource.json.js', function(result){
                console.log(result);
            }, 'json');
        </script>
        </body>
        </html>
        
        • $는 jquery의 특수한 객체

클로저

  • 클로저(closure)는 내부함수와 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다.

외부함수와 내부함수

내부함수

  • function outer(){ //외부함수이다.
        //inner는 outer함수 안에서만 사용된다
        function inner(){ //var inner= function{} 내부함수이다.
            var title = 'coding everybody'; 
            alert(title);
        }
        inner();
    }
    outer();
    
    • 함수 inner를 내부 함수라고 한다.


  • function outer(){
        var title = 'coding everybody';  
        function inner(){        
            alert(title);
        }
        inner();
    }
    outer();
    
    • 내부함수에서 외부함수에 있는 지역변수인 title에 접근할 수 있다. 이를 클로저라 한다.


클로저란?

  • 내부함수와 밀접한 관계를 가지고 있다.

  • 내부함수는 외부함수의 지역변수에 접근할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근할 수 있다.

  • 예제

    • function outer(){
          var title = 'coding everybody';  
          return function(){        
              alert(title);
          }
      }
      inner = outer();
      inner();
      
      • return했음에도, 외부함수는 죽었는데 inner를 통해 호출이 되어도 외부함수에 있는 변수에 접근이 가능하다.


Private Variable

  • software가 커지는 과정에서, 어떤 정보가 있을 때 아무나 사용하는 것을 방지하는 것이다.

  • 예제

    • function factory_movie(title){
          return {
              get_title : function (){
                  return title;
              },
              set_title : function(_title){
                  title = _title
              }
          }
      }
      ghost = factory_movie('Ghost in the shell');
      matrix = factory_movie('Matrix');
           
      alert(ghost.get_title()); //Ghost in the shell
      alert(matrix.get_title()); //Matrix
          
           
      ghost.set_title('공각기동대');
           
      alert(ghost.get_title()); //공각기동대
      alert(matrix.get_title());//Matrix
      
  1. 클로저는 객체의 메소드에서도 사용할 수 있다. 위의 예제는 함수의 리턴값으로 객체를 반환하고 있다. 이 객체는 메소드 get_title과 set_title을 가지고 있다. 이 메소드들은 외부함수인 factory_movie의 인자값으로 전달된 지역변수 title을 사용하고 있다.

  2. 동일한 외부함수 안에서 만들어진 내부함수나 메소드는 외부함수의 지역변수를 공유한다. 17행에서 실행된 set_title은 외부함수 factory_movie의 지역변수 title의 값을 ‘공각기동대’로 변경했다. 19행에서 ghost.get_title();의 값이 ‘공각기동대’인 것은 set_title와 get_title 함수가 title의 값을 공유하고 있다는 의미다.

  3. 그런데 똑같은 외부함수 factory_movie를 공유하고 있는 ghost와 matrix의 get_title의 결과는 서로 각각 다르다. 그것은 외부함수가 실행될 때마다 새로운 지역변수를 포함하는 클로저가 생성되기 때문에 ghost와 matrix는 서로 완전히 독립된 객체가 된다.

  4. factory_movie의 지역변수 title은 2행에서 정의된 객체의 메소드에서만 접근 할 수 있는 값이다. 이 말은 title의 값을 읽고 수정 할 수 있는 것은 factory_movie 메소드를 통해서 만들어진 객체 뿐이라는 의미다. JavaScript는 기본적으로 Private한 속성을 지원하지 않는데, 클로저의 이러한 특성을 이용해서 Private한 속성을 사용할 수 있게된다.

  • 예제 (타이틀을 숫자로 넣을 때 문자열을 넣어야 한다고 경고창 띄워주기)

    • function factory_movie(title){
          return {
              get_title : function (){
                  return title;
              },
              set_title : function(_title){
                  if(typeof _title==='String'){
                      title = _title
                  }else{
                      alert('제목은 문자열이어야 합니다.')
                  }
                      
              }
          }
      }
      ghost = factory_movie('Ghost in the shell');
      matrix = factory_movie('Matrix');
           
      alert(ghost.get_title()); //Ghost in the shell
      alert(matrix.get_title()); //Matrix
          
           
      ghost.set_title('공각기동대');
      matrix.set_title(1);
      alert(ghost.get_title()); //공각기동대
      alert(matrix.get_title());//Matrix
      


클로저의 응용

  • 코드

    • var arr = []
      for(var i = 0; i < 5; i++){
          arr[i] = function(){
              return i;
          }
      }
      for(var index in arr) {
          console.log(arr[index]());
      }
      /*
      5
      5
      5
      5
      5
      */
      
      • 함수가 함수 외부의 컨텍스트에 접근할 수 있을 것으로 기대하겠지만 그렇지 않다.
  • 위의 코드는 이렇게 변경해야 한다.

    • var arr = []
      for(var i = 0; i < 5; i++){
          arr[i] = function(id) {
              return function(){
                  return id;
              }
          }(i);
      }
      for(var index in arr) {
          console.log(arr[index]());
      }
      /*
      0
      1
      2
      3
      4
      */
      

데이터 타입

원시 데이터 타입 (기본 데이터타입)

  • 원시 데이터 타입이란?
  • 카테고리
    • 숫자
    • 문자열
    • Boolean
    • null
    • undefined

객체 데이터 타입 (참조 데이터 타입)

래퍼객체 (wrapper object)

  • 원시 데이터 타입을 객체처럼 다룰 수 있도록 하기 위한 객체
  • 숫자: Number
  • 문자열: String
  • 불리언: Boolean
  • null : 래퍼 객체 존재하지 않음
  • undefined: 래퍼 객체 존재하지 않음

Leave a comment