[JS]Unix TimeStamp to DATE Time

[JS]Unix TimeStamp to DATE Time


그냥  공부용도로 만든것이다.  더 좋은 함수들이 많다…

Time Stamp

타임 스템프는 date = new Date()에서 .getTime()메소드를 사용하여 가져왔다.

초(sec)

초는 .getTime()으로 가져온 (1/1000)초를 1초로 바꾸기 위해 .getTime() * 1000으로 계산 하였다.

분(min)

초를 기반으로 sec / 60을 하여 분을 구하고, 나머지를 sec 변수에 다시 넣어 주었다.

시(hour)

이 역시 분을 기반으로 min / 60으로 시를 구하고, 나머지를 min 변수에 다시 넣어 주었다.

일(day)

여기까지는 지금까지와 마찬가지로, 
hour / 24로 일을 구하고 나머지를 day 변수에 다시 넣어 주었다.


문제가 생기기 시작하는 월, 년, 요일

매달 같은 일 수가 다른 ‘월’과 4년에 한번씩 윤년이 있는 ‘년’ 그리고 어떻게 찾아야 할지 막막한 ‘요일’
해당 문제들에 대해 해결한 과정을 순서대로 써보겠다.

윤년을 구하는 함수(is_leap)를 만들자.

윤년은
– 4로 나누어 떨어지는 년도는 윤년이다.(year % 4 == 0)
– 하지만 100으로 나누어 떨어지는 년도는 윤년이 아니다. (year % 100 != 0)
– 하지만 400으로 나누어 떨어지는 년도는 무조건 윤년이다. (year % 400 == 0)

((_year % 4) == 0) && ((_year %100) != 0) || ((_year % 400) == 0)

이를 조건으로 윤년임을 확인하는 함수를 만들 수 있다.

function is_leap(_year){
    if(_year){ // 0은 윤년이 아니다.
        if(((_year % 4) == 0) && ((_year %100) != 0) || ((_year % 400) == 0))        
            return true
        return false
    }
}

이는 정말 유용하게 사용된다.

‘년’을 먼저 구하고 ‘월’을 구하자.

먼저 코드를 보자.

function calc_year(day_){
    leap_stamp_cnt = 477    // Number of leap years by 1970
    year_= Math.floor(day_ / 365) + 1970; day_ = day_ % 365
    leap_now_cnt = Math.floor((year_ - 1) / 4) - Math.floor((year_ - 1) / 100) + Math.floor((year_ - 1) / 400)

    return {
        day_: day_ - (leap_now_cnt - leap_stamp_cnt),   // remove day of leap year
        year_: year_
}

원리는 간단하다.
1970부터 2017(현재)까지의 윤년의 수를 구해 남은 day 변수에서 빼주는 방식이다,

 L은 1년부터 Y년 까지 윤년의 개수이다.

해당 방식에 좀 더 나은 코드가 있을 거라고 생각되어 1에 1970을 넣었지만, 1에 1970을 넣으니 12가 아닌 11이 나온다.

‘월’을 구하자.

1월 1일 부터 남은 ‘일’수를 더 해 월을 구하자.

function calc_month(day_,year_){
    month_ = 1
    while(month_ <= 7 && ((day_ >= 31 && month_ & 1) || (day_ >= 30 && !(month_ & 1))) ) {
        if(month_ == 2){
            day_ -= 28
            if(is_leap(year_)){
                day_--
            }
            month_++
        } else if(month_ & 1){
            day_ -= 31
            month_++
        } else {
            day_ -= 30
            month_++
        }
    }
    while(month_ <= 12 && ((day_ >= 30 && month_ & 1) || (day_ >= 31 && !(month_ & 1))) ){
        if(month_ & 0){
            day_ -= 31
            month_++
        } else {
            day_ -= 30
            month_++
        }
    }
    
    return {
        day_: day_ + 1,
        month_: month_
    }
}

원리는 7월까지는 홀수 달이 31이고 2월만 28일이고 윤년에 따라 변하니 구분해주었고,
8월 부터는 짝수달이 31일인점을 이용하였다. return의 +1은 1월 1일 부터 시작하니 1을 더해주 었다.

이도 좀 더 나은 방법이 있을 것이라고 생각된다.

자, 년 월 일 시 분 초 모두 구했다. 이를 가지고 요일을 찾아보자

요일을 찾는 방법이 제일 골치 아팟다. 하지만 zeller’s congruence 을 사용한다면 생각만큼 어렵지는 않다.
zeller’s congruence에 대한 자세한 내용은 링크에서 볼 알아 볼 수 있다.

function calc_weekday (day_,month_,year_){
    /* Using zeller's congruence */
    k = year_ % 100
    j = year_ / 100
    return Math.floor((day_ + Math.floor(13 * (month_ + 1) / 5) + k + Math.floor(k / 4) + 5 * j + Math.floor(j / 4) ) % 7)
}

0이면 토요일 6이면 금요일이니 이를 이용하여 요일을 표현 할 수 있다.

github 에 모든 소스코드를 올려 놓았다.

 

AJAX를 통해 보는 동기 방식과 비동기 방식의 이해

AJAX를 통해 보는 동기 방식과 비동기 방식의 이해


이전 글 에선 비동기 방식에 대한 자세한 설명을 하지 않았다.
이해가 힘들기도 하고 단지 AJAX가 어떻게 동작하는 지에 대한 간단한 개념 만을 설명 했기 때문이다.
이번 글에선 비동기 방식에 대해서 좀 더 자세히 알아보자. 

AJXA예제 설명

이해를 쉽게 하기 위해 w3schoos.com에 있는 AJAX 예제를 사용하겠다.
이 예제에 대한 코드 설명을 하면,

<!DOCTYPE html>
<html>
<body>

<div id="demo">
<h1>The XMLHttpRequest Object</h1>
<button type="button" onclick="loadDoc()">Change Content</button>
</div>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML =
      this.responseText;
    }
  };
  xhttp.open("GET", "ajax_info.txt", true);
  xhttp.send();
}
</script>

</body>
</html>

Change Content 버튼을 누르면
loadDoc함수가 작동하는 코드이다.

loadDoc함수는 xhttp에 XMLHttpRequest()함수를 넣고
xhttp.onreadystatechange를 통해 xhttp의 readyState를 계속 감시한다.

readyState는

  • 0 (uninitialized)
  • 1 (loading)
  • 2 (loaded)
  • 3 (interactive)
  • 4 (complete)

로 구성 되어 있으며 onreadystatechange는 readyState가 4가 될 때까지 지속적으로 function(){ … }를 실행 시킨다.

 

동기 방식

쉽게 이야기하면, 하나의 함수가 끝나고 반환 값을 받은 뒤 다음 함수를 실행하는 것.
아래 코드는 w3school.com에 있는 AJAX 예제를 살짝 수정 한 것 이다.

<!DOCTYPE html>
<html>
<body>

<div id="demo">
<h1>The XMLHttpRequest Object</h1>
<button type="button" onclick="loadDoc()">Change Content</button>
</div>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    console.log('> '+xhttp.readyState);      // xhttp.readyState 표시
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML =
      this.responseText;
    }
  };
  xhttp.open("GET", "ajax_info.txt", FALSE); // 동기 방식 사용
  xhttp.send();
}
</script>

</body>
</html>

14번째 줄에서 xhttp의 readyState를 콘솔창에 표시해주는 코드와
20번째 줄에 open 함수에서 동기 방식을 사용하기 위해 false로 설정 해주었다.

이렇게 코드를 변경한 뒤 F12를 눌러 console창을 띄우고 “Change Content” 버튼을 누르면
 > 1
 > 4
이렇게 뜰 것이다. xhttp의 readyState가 1(Loading) 이후 바로 4(Complete)가 되었다.
send후 응답 결과를 받은 후 function(){ … }가 실행 됨을 알 수 있다.

즉, 동기 방식은 코드에 쓰여진 대로 “실행하고 마치고 실행하고 마치고”를 반복한다.


비동기 방식

쉽게 이야기하면 함수를 실행 시켜 놓고 다음 함수로 넘어가는 방식이다.

<!DOCTYPE html>
<html>
<body>

<div id="demo">
<h1>The XMLHttpRequest Object</h1>
<button type="button" onclick="loadDoc()">Change Content</button>
</div>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    console.log('> '+xhttp.readyState);      // xhttp.readyState 표시
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML =
      this.responseText;
    }
  };
  xhttp.open("GET", "ajax_info.txt", TRUE); // 비동기 방식 사용
  xhttp.send();
}
</script>

</body>
</html>

14번째 줄에서 xhttp의 readyState를 콘솔창에 표시해주는 코드와
20번째 줄에 open 함수에서 비동기 방식을 사용하기 위해 true로 설정 해주었다.

이렇게 코드를 변경한 뒤 F12를 눌러 console창을 띄우고 “Change Content” 버튼을 누르면
 > 1
 > 2
 > 3

 > 4
이렇게 뜰 것이다. xhttp의 readyState의 모든 상태가 표시 되었다.는 것을 알 수 있다.
send후 응답 결과를 받지 않고 계속해서 function(){ … }를 실행 하고 있음을 알 수 있다.

즉, 비동기 방식은 “실행하고 마치기”전에 다른 함수를 “실행”한다.

그래서 이걸 어따 씀?

가장 직관적으로 격을 수 있는 경우가 있다.

거의 모든 html 구성을 JS로 만들고, 외부의 값들을 불러와 만들 때
일일히 외부의 값이 오기까지 기다리면 웹페이지의 로딩 속도가 굉장히 느려진다.
그럴 때 일단 모든 부분들을 표시해 놓고 비동기 방식으로 외부 값이 오면 그때 그때 그 값을 페이지에 넣는 방식을 사용하면 웹페이지의 로딩이 빨라지게 된다.

참고
https://www.w3schools.com/js/js_ajax_http.asp
https://developer.mozilla.org/ko/docs/AJAX/Getting_Started

쉽게 이해 하는 AJAX (비동기 자바스크립트)

AJAX (Asynchronous JavaScript And XML)


AJAX는 비동기 자바스크립트 XML이라는 건데, 이게 이해하기가 참 애매했다. 

일단 기본적인 AJAX코드를 가지고 어떤 역할을 하는지 알아보자.

아직 JS에 익숙하지 않으며,
JS는 필요할 때만 공부 하다 보니
잘못 설명 된 부분이 있을 수 있습니다.
이점을 유의 바랍니다.

Basic AJAX Code

도메인 :  “http://localhost/”
AJAX 실행 위치: “/ajax-test/index.php”

<?php
echo $_GET['TXT'];
?>

위와 같은 환경일 때, 아래의 코드를 보자.

var xhttpReq = new XMLHttpRequest();
xhttpReq.open('GET', '?TXT=Hello', false);
xhttpReq.send(null);
console.log(xhttpReq.responseText);

해당 코드는 http://localhost/ajax-test/index.php?echo=Hello를 요청하고 그 결과를 콘솔 창에 출력 해주는 코드이다.

이 코드를 분석해보자.
제일 첫 번째 줄에서 
var xhttpReq = new XMLHttpRequest();
이 XMLHttpRequest를 xhttpReq에 넣는 부분이다. 단순히 XMLHttpRequest 사용을 준비하는 정도로 봐도 무방하다.

두 번째 코드를 보면
xhttpReq.open('GET', '?TXT=Hello', false);
‘GET’ 방식으로 ‘?TXT=Hello’요청해 응답을 받겠다는 뜻이다.

세 번째 줄에선
xhttpReq.send(null);
send()함수를 통해 요청을 전송하는 것이다.
만약, POST로 데이터를 보내고 싶다면 send("TXT=Hello") 이런 식으로 넣어 주면 된다.

그리고 마지막 줄에선
console.log(xhttpReq.responseText);
send로 보낸 요정의 결과를 Text로 출력해준다.

console
> Hello

그냥 보면 비동기라는 점을 느끼지 못할 만큼 다를 게 없다.

맞다. 없다.
두 번째 줄을 다시 한번 보자. 
xhttpReq.open('GET', '?TXT=Hello', false);
open 함수의 false는 비동기적으로 처리하지 않겠다는 것을 의미한다.(동기적 처리)
반대로 true일 경우 비동기적으로 처리하겠다는 의미다.

현재는 FALSE를 사용했으니 동기적으로 처리 되었다.
즉, 서버로부터 응답을 받은 후 나머지 스크립트를 실행 시켰다는 것이다.
하지만, TRUE로 설정해 비동기방식을 선택하여 실행하면,
서버로부터 응답을 받지 않더라도 나머지 스크립트를 실행 한다.

테스트를 해보면,
동기화 방식(false)을 설정하고 실행하면, Hello가 뜨는 걸 볼 수 있지만,
비동기화 방식(true)를 설정하고 실행하면, 아무것도 뜨지 않는다.
    즉, 서버로부터 응답을 받지 않아도 실행 시켰다는 것이다.

참고 사이트
https://developer.mozilla.org/ko/docs/AJAX/Getting_Started

JavaScript_05_fin

콜백

처리의 위임

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

예시) 객체에 속한 메소드(함수)를 이용해 이해해보자.

  1. var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];  
    alert (numbers.sort()); // [1, 10, 2, 20, 3, 4, 5, 6, 7, 8, 9]

     

결과를 보면 3보다 10이 먼저 나오는 등의 이상한 결과를 볼 수 있다.
이건 내장 함수인 sort 때문인데 sort의 정의를 보면

  1. sort(sortfunc)  

     

인자명

데이터형

필수/옵션

설명

sortfunc

function

옵션

원소들 간에 무엇이 우선인지를 판단한다

이와 같이 sort는 배열의 방식을 자신이 정할 수 있다.
정하지 않으면 기본 적인 동작을 하기 때문에 10이 3보다 먼저 나오는 것이다.

자세한 예를 들진 않고 결과만 설명하면 sort는 인자로 음수를 받게 되면 앞에 들어오는 수가 뒤에 오는 수 보다 작다고 인식한다.

Sort의 동작 방식과 콜백(처리 위임)을 사용하면 원하는 순서대로 나열 할 수 있다.

  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)); // [20,10,9,8,7,6,5,4,3,2,1]

     

비동기 처리

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

해당 실습은 서버 환경에서만 동작하므로 영상을 참,

 

 

클로저

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

내부, 외부 함수

  1. function outter(){// 외부 함수의 시작
    var title = 'coding everybody';    
    function inner(){// 내부 함수의 시작
    alert(title);  
    }                 // 내부 함수의 끝  
    inner();  
    }   // 외부 함수의 끝
    outter(); //coding everybody

     

위 예제를 보면 3. ~ 5. 까지가 내부 함수 이고 그것을 감싸고 있는 1. ~ 7. 까지가 외부 함수이다.

여기서 주목 하고 싶은 것은 외부 함수의 지역 변수인 title을 내부 함수에서 부를 수 있다는 것이다.

클로저의 특징

  1. function outter(){  
    var title = 'coding everybody';    
    return function(){          
    alert(title);  
    }  
    }  
    inner = outter();  
    inner();    // coding everybody

     

위 예제를 보면 7. 에서 outter()함수를 호출하고 return값으로 함수를 반환하고 inner라는 변수의 저장한다.
이후 8. 에서 inner()함수를 호출하면 “coding everybody” 라는 함수가 표현 된다.

여기서 눈여겨봐야 하는 것은 분명히 2. 에 있는 변수 title는 return을 했기에 4. 에서 호출하는alert(title); 를 실행 시킬 수 없어야 하지만 호출이 가능하다는 것이 클로저의 특징이다.

Ex) 클로저를 이용한 좀 더 실용적인 예제

  1. 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
    set_title('공각기동대 ');  
    alert(ghost.get_title());    // 공각기동대
    alert(matrix.get_title());   // Matrix
    ~ 10. 까지는 get title와 set title 라는 함수를 가진 객체를 return하고 있다.

     

get title는 외부 함수가 받은 title라는 인자를 반환 하는 역할을 하고 (2. ~ 5.)
set title는 set title가 받은 _title를 외부 함수의 저장된 title에 넣는 역할을 한다. (6. ~ 8.)

  1. 에선 변수 ghost 에 “Ghost in the shell”라는 title을 가진 객체를 담고,
    12. 에선 변수 matrix에 “Matrix”라는 title을 가진 객체를 담는다.
  2. ~ 15. 19. ~ 20. 에서 처럼 이후 내장 함수인 get_title를 통해 저장된 title을 볼 수 있으며
  3. 에서처럼 내장 함수인 set_title를 통해 저장된 title을 변경 할 수 있다.

또한 여기서 만들어진 외부 함수의 title은 private변수가 되어 set_title이나 get_title으로만 변경/접근이 가능하다.

클로저의 응용

배열 arr[0 ~ 4] 까지에 0 ~ 4를 넣는 예제를 한번 만들어 보자.

  1. var arr = []  
    for(var i = 0; i < 5; i++){  
    arr[i] = function(){  
    return i;  
    }  
    }  
    for(varindex in arr) {  
    log(arr[index]());  
    }    // 5, 5, 5, 5, 5

     

얼핏 보면 2. 에서 for문을 돌면서i를 return 하여 arr[i]에 넣는 것처럼 보이지만 실행 결과는 5, 5, 5, 5, 5가 나오게 된다. 왜냐하면 4. 에서의 i값은 우리가 정의한 3. ~ 5. 함수의 외부 변수의 값이 아니기 때문이다.

그러므로 3. ~ 5.에게 외부 함수를 만들어 외부 변수를 참조하게 하면 제일 처음 원하는 결과를 얻을 수 있게 된다.

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

     

3. ~ 7. 외부 함수는 (i)를 인자로 받고 외부 변수 (id)에 값 넣어 5. 에서 그 값을 return한다.
그렇게 되면 arr[i] 값에는 우리가 원하는 0 ~ 4까지의 값이 들어가게 된다.

 

 

arguments (객체)

아래 예제를 보자

  1. function sum(){ // 전달되는 인자가 없다.  
    var i, _sum = 0;      
    for(i = 0; i < arguments.length; i++){ 
    write(i+' : '+arguments[i]+'<br />');  
    _sum += arguments[i];  
    }     
    return _sum;  
    }  
    write('result : '+ sum(1,2,3,4)); // 전달되는 인자가 있다.  

     

1. 을 보면 sum이라는 함수의 인자가 없어도 9. 에서처럼 인자를 전달 할 수 있다.

이게 가능한 이유는arguments라는 함수 안에서 사용할 수 있도록 전달 받은 인자들을 자동으로 배열에 넣어주는 기능을 가진 약속된 이름의 배열이 있기 때문이다.

매개변수의

  1. function one(arg1){  
    log(  
    'one.length', one.length,  
    'arguments', arguments.length  
    );  
    }  
    one('val1', 'val2');  // one.length 1 arguments 2 
    functiontwo(arg1, arg2){  
    log(  
    'two.length', two.length,  
    'arguments', arguments.length  
    );  
    }  
    two('val1');  // two.length 2 arguments 1

     

7. 에서 one을 호출 할 때 2개의 인자를 보내고있고 one에서 지정된 매개 변수는 1개 이다.
이때 one.length와 결과와 arguments.length의 결과가 다른데 그 이유는 arguments는 매개 변수의 개수가 아닌 전달 받은 인자의 수만큼의 length를 가지고 있기 때문이다.

이를 이용해서 func.length값과 arguments.length 값을 비교해 정해진 매개변수만큼 인자가 왔는지 확인이 가능하다.

 

JavaScript_04

객체

객체란, 데이터가 추가되면 배열 전체에서 중복되지 않는 인덱스가 자동으로 만들어져서 추가된 데이터에 대한 식별자가 된다. 이 인덱스를 이용한 데이터를 가져오게 되는 이 객체이다.

생성 방법

객체의 선언

var object = {'one': 1, 'two':2, 'three': '3'}
// Object {one: 1, two: 2, three: "3"}  

객체의 호출

var object = {'one': 1, 'two':2, 'three': '3'}  // 객체 선언
for(key in object){  
    document.write(key + " "+ object +"</br>")  
}  
/*
one [object Object]
two [object Object]
three [object Object]
*/

 

객체와 함수

객체는 배열과는 달리 객체 안에 함수를 넣을 수 있다.

var object = {   
    'number' : {'one': 1, 'two':2, 'three': '3'},  
    'show' : function() {   
               document.write('obj func')  
     }  
} // 객체 선언
object.show() // obj func

 

모듈

  • 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용 할 수 있다.
  • 코드를 개선하면 이를 사용하고 있는 모든 애플리케이션의 동작이 개선된다.
  • 코드 수정 시 필요한 로직을 빠르게 찾을 수 있다.
  • 필요한 로직만을 로드해서 메모리의 낭비를 줄일 수 있다.
  • 한번 다운로드된 모듈은 웹브라우저에 의해서 저장 되기에 동일한 로직을 로드 할 때 시간과 네트워크 트래픽을 절약할 수 있다. (브라우저에만 해당)

사용 방법

먼저 필요한 기능을 입력 할 JS 파일을 생성한다.

var print  
print = function(){  
    document.write("print 함수가 호출 되었습니다.");  
}  

임의의 파일명 “printf_func.js”으로 저장한다.

기능을 사용할 파일에서 head에서 JS파일을 호출한다.
만약 메인 파일과 동일한 위치에 있을 경우는 src = “” 안에 파일명만 적어주면 된다.

<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="utf-8"/>  
    <script src="print_func.js"></script>  
</head>  
<body>  
<script type="text/javascript">  
    print(); // print함수가 호출 되었습니다.
</script>  
</body>  
</html>  

 

라이브러리

라이브러리란 모듈과 비슷한 개념으로 자주 사용되는 로직을 재사용하기 편리하도록 잘 정리한 일련의 코드들의 집합을 의미한다.

사용 방법

모듈과 같이 유명한 jquery등의 라이브러리를 다운 받아 head에 추가하여 사용한다.

<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="utf-8"/>  
    <script src="jquery.js"></script>  
</head>  
<body>  
<script type="text/javascript">  
    $(/*commend*/) //jquery와 같은 경우에는 $표시를 이용해 라이브러리 안에 함수를 호출 한다.  
</script>  
</body>  
</html>  

 

JavaScript_03

 

조건문과 반복문

조건문

비교 연산자 등을 사용해서 True와 False 값을 이용, 조건문의 코드가 실행 여부를 결정 할 수 있다.

var i = 5;  
if ( i == 1){  
    document.write("i is 1");  
}  
else if ( i == 5){  
    document.write("i is 5");  
}  
else {  
    document.write("i isn't 1 and 5");  
}  
// i is 5

반복문

반복문 또한 비교 연산자 등을 사용해서 True와 False 값을 이용, 반복문의 코드가 실행 여부를 결정 할 수 있으며, False 값이 나올 때까지 코드를 반복해서 실행한다.

var i = 0;  
while(i < 10){  
    document.write(i);  
i++; // 조건문 확인 후 i 증가  
++i; // i 증가 후 조건문 확인
}  
/*
i++ 일 경우
..789 
++i 일 경우
..8910
*/

 

함수

함수란

같은 코드가 지속적으로 사용될 경우 필요할 때에 코드를 함수명으로 불러올 수 있는 기능이다.

함수의 선언 방법

  • function “함수명”으로 불러오는 방법
function print(){  
    document.write("print text");  
}  
print();  
// print text
  • 변수에 함수를 넣는 방법
varprint  
print=function(){  
    document.write("print");  
}  
print();  
// print text

선언 방식에만 차이가 있을 뿐 이후 사용방법등은 같다.

 

배열

배열의 선언

var member = ['1', '2', '3'] // member > ["1", "2", "3"]  
member[0] // "1"
member[1] // "2"
member[2] // "3"

반복 문과 배열

var member = ['1', '2', '3']  
for(var i = 0; i < 3; i++){  
    document.write(member[i]);  
}  
// 123

 

배열 수정

  • Push > 배열의 제일 앞에 입력한 값을 집어 넣는다.
var member = ['1', '2', '3']  
member.push('0') // ["0", "1", "2", "3"]
  • unshift > 배열의 제일 뒤에 입력한 값을 집어 넣는다.
var member = ['1', '2', '3']  
member.unshift('0') // ["1", "2", "3", "0"]
  • splice(index,howmany,’element#1’…. ’element#n’)
var member = ['1', '2', '3']  
member.splice(1, 0, '0') // []
// member >> ["1", "0", "2", "3"]

index 배열에 추가할 특정 배열의 위치
howmany : 인덱스를 포함하여 원소를 몇 개나 삭제할 것인지, 0이면 삭제하지 않음
’element#n’ : 넣을 원소

 

배열의 정렬

arr.sort() > 작은 것부터 큰 순으로 정렬

var member = ['2', '3', '1']  
member.sort() // ["1", "2", "3"]  

arr.reverse() > 큰 것부터 작은 순으로 정렬

var member = ['2', '3', '1']  
member.reverse() // ["3", "2", "1"]

arr.shift() > 제일 앞에 있는 원소가 출력되고 배열에서 지워 짐

var member = ['1', '2', '3']
member.shift() // "1"
// member >> ["2", "3"]

arr.pop() > 제일 뒤에 있는 원소가 출력되고 배열에서 지워 짐

var member = ['1', '2', '3']  
member.shift() // "3"
// member >> ["1", "2"]

 

JavaScript_02

여러가지 연산자

연산자

  • +, -, *, /를 사용하여 기본적인 사칙 연산을 수행 할 수 있다.

Console를 이용한 예제

1+1 // 2  
1-1 // 0  
2*3  // 6  
3/4  // 0.75  

 

  • ==, ===, >, <, >=, <=등의 비교 연산을 통하여 true 혹은 false의 값을 얻어 낼 수 있다.
1==1  // true  
1>=2  // false  
1<3 // true  

 

  • “ === “은 “ == “과는 다른 기능을 한다. 예를 들어
    1 == “1”의 경우 True를 반환 하는 반면에
    1 ===”1”의 경우는 False를 반환한다.
1=="1" //true  
1==="1" //false  

 

 

Math 함수

일반적인 사칙연산으로 할 수 없는 계산을 할 수 있는 함수이다.

  • pow(a, b): a의 b제곱의 값을 알려준다.
Math.pow(3,2) // 9  

 

  • round(Decimal): 소수 부분을 반올림 해준다.
Math.round(10.3) // 10 
Math.round(10.6) // 11

 

  • ceil(Decimal): 소수 부분을 올림 해준다.
Math.ceil(10.3) // 11  

 

  • floor(Decimal): 소수 부분을 버림 해준다.
Math.floor(10.6)// 10

 

  • random(): 임의의 소수를 출력해준다.
Math.random() // 0.07498681149445474  

 


 

문자열과 연산자

원하는 문자열을 표시하고 싶다면, 로 묶어 문자열로 표시한다.

  • 을 문자열로 표시하고 싶다면, “ “ 사이에
alert(" Hello'world!' "); // Hello'world!' 

 

  • ‘ ‘ 사이에 는 문자로 인식하게 된다.
alert(' Hello"world!" ');  // Hello"world!"

 

  • \ 를 이용하여 아래와 같이 입력하면 ‘ ‘ 안에 ‘표시를 넣을 수 있다.
alert(' Hello\'world!\' ');   // Hello'world!'

 

  • 두 개 이상의 문자열을 “+” 연산자로 연결이 가능하다.
alert("Hello"+"World");//&nbsp;HelloWorld

 

그리고 숫자나 변수 또한 위치기 가능하다.

alert("Hello"+123+"World");// Hello123World

다만 변수에 경우에는 변수에 저장된 값이 있어야 한다.

 

+ α  변수 이야기

C 언어와는 달리 문자형에 따라 변수를 선언해 줄 필요 없다.

var i = 100  

             var를 빼도 무리는 없으나 입력하는 것을 추천한다.

JavaScript_01

오리엔테이션


 

JavaScript란? Java와 JavaScript의 차이는 햄과 햄스터의 차이

자바스크립트(JavaScript)는 객체 기반의 스크립트 프로그래밍 언어이다.

이 언어는 웹 브라우저 내에서 주로 사용하며, 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다.
또한 Node.js와 같은 런타임 환경과 같이 서버 사이드 네트워크 프로그래밍에도 사용되고 있다.

JavaScript의 프로그래밍 툴은 어떤 것이 있을까?

  1. 텍스트(txt)파일로 작성한 뒤 확장자를 html로 변경해 웹 브라우저로 실행 시켜도 상관이 없다.
  2. Chrome 기준 F12를 누른뒤 “Console” 탭에 들어가 JavaScript를 Python처럼 코드를 작성과 동시에 실행 할 수 있다.
  3. 본 강의에서 사용되는 도구인 Sublime Text를 사용하여 코딩 할 수 있다.

그 외에도 Vim, Atom, VS code, Brackets등등.. 어마어마한 종류의 에디터들이 있습니다.

 

JavaScript의 실행과 실습


 

Sublime Text 홈페이지[링크]에 들어가 Sublime Text 3를 다운받아 설치한다.

01
Sublime Text Editor를 처음 킨 화면

 

현재 상태에서도 JavaScript를 작성할 수 있지만
편한 작업 환경을 위해 몇가지 더 작업 해보자.

02
File > New File or Ctrl+N

먼저 JavaScript를 작성할 새 파일을 생성한다.

그러면 Untitled 라는 문서가 생긴다.

03
File > Save or Ctrl+S

다음으로는 적당한 위치에 적당한 이름으로 파일을 저장한다.

04

다만, 반드시 .html 파일로 저장 되어야한다! 

JavaScript를 작성할 준비가 완료 되었다.

자동완성 기능

05

위 이미지 처럼 “html”을 입력한 뒤 Tab을 눌르게 되면,

06

이 처럼 html의 가장 기본적으로 입력해야 하는 것들이 자동으로 입력된다.

실습

예전 XSS 강의 중에서 ” <script> alert(1) </script> “로 XSS의 존재 여부를 판단한 적이 있다.

이번 실습에서 사용할 함수가 바로 ” alert” 함수이다.

07
alert 함수

위 html과 마찬가지로 script를 입력한 후 Tab을 누르면 자동으로
” <script type=”text/javascript”></script> “
입력 되는데 ” <script ~ >   </script> ” 사이에 사용할 함수를 입력하면 된다.

위와 같이 입력했다면, 아까 파일을 저장한 위치로 가서
방금 작성한 html파일을 실행 시켜보자.

08

브라우저가 실행되고 위와 같은 경고창이 나온다면 잘 작동 한다는 것이다.

 

Console를 이용한 JavaScript작성

09
Chrome기준 단축키 F12로도 작동
10
Console 탭에 들어온 모습

브라우저 상에서 콘솔 창을 실행 하게 된다면 위와 같이 표시된다.

아까와 같이 Hello Wordl!를 띄워보자.

11

콘솔 창에 alert(‘Hello World!’)를 치고 엔터를 누르게 되면

12

따로 파일을 실해하는 과정 없이 바로 창이 뜨는 것을 볼 수 있다.

이 처럼 간단한 JavaScript코드는 콘솔창을 이용하고, 복잡한 코드는 파일로 직접 코딩할 수 있다.

 

다음 글에서는…


 

숫자와 문자의 표현과 수의 연산, 그
리고 문자에 대한 명령어 + α 에 대해서 알아보도록 하겠다.

생활 코딩에서 제공해 주는 무료 인강을 보고 공부했습니다.