반응형

함수는 왜 사용할까?

1. 재사용성

구구단 프로그램을 구성해야 한다고 하자.

이런 경우 필요한 단수가 나올때마다 반복문의 변수값을 바꿔줘가면서 for문이 점점 늘어날 것이다.

하지만 매개변수 값에 따라 구구단을 출력하는 기능을 가진 함수를 정의하였다면, 우린 원하는 구구단의 값만 넣어주고

함수만 호출하면 언제든이 원하는 구구단을 소스도 지저분하지 않게 구성할 수 있을것이다.

이렇게 같은 소스를 사용하지 않게 되면, 용량도 자연스레 줄어들 것이다.

2. 가독성

함수의 기능을 정의하고 함수의 명을 잘 지어놨다면 해당 함수명만으로도 이 함수가 어떤 기능을 할지 어떻게 동작할지 유추할 수 있고,

또한 해당 기능이 필요할땐 선언한 함수를 호출함으로써 불필요한 소스는 줄어들고 체계적이며 가독성이 소스를 구성할 수 있다.

3. 모듈화

라이브러리 파일을 만들거나 대규모의 프로젝트를 구성하게 될 때 필요한 기능을 정의하고 기능을 팀별로 구성하여, 서로에게 영향을 미치지 않도록 구조별로 구성하여 작성이 가능해지고 유지보수나 버그가 발생시 해당 함수를 수정함으로써 보다 편리해진다.

 


 

자바스크립트의 함수 선언

- 선언 함수

//선언 함수
function 함수명(매개변수, 매개변수 ...){
  //기능 정의
  return 반환 할 데이터;
}

가장 일반적으로 보던 형태 일 것이다.

- 익명 함수

// 익명 함수
var 함수명 = function(매개변수, 매개변수 ...){
  //기능 정의
  return 반환 할 데이터;
}

 

- 기명 함수

// 기명 함수
var 함수명1 = function 함수명2(매개변수, 매개변수 ...){
  return 반환 할 데이터;
}

호출 시에는 함수명2로 호출이 아닌 함수명1로 호출 한다.

MDN 측의 글을 보면 함수내에서 자신을 참조하는데 사용하거나 디버거 모드에서 함수 식별하는데 사용 할수 있다고 합니다.

var factorial = function fac(n) { 
  return n<2 ? 1 : n*fac(n-1) 
};

console.log(factorial(3));

factorial 문제를 통한 사용 예시(재귀함수를 통해 구현 하였다.)

 

- 화살표 함수

// 화살표 함수
var 함수명 = (매개변수, 매개변수 ...)=>{
  //기능 정의
  return 반환 할 데이터;
}

 

- 즉시 실행 함수

// 즉시 실행 함수
(function 함수명(매개변수, 매개변수 ...){
  //기능 정의
})()

 

함수는 여러개의 매개변수는 받을 수 있지만 return값인 반환 값은 한개만 가능하다.

반응형
반응형

달팽이 배열은 배열에 데이터를 달팽이 껍질형태로 차례대로 채워나가는 것을 말한다.

 

달팽이 배열

 

채우는 동작 원리)

- 4 x 4 배열 생성

1. 생성 방식은 첫 행인 0행부터 마지막 열인 3열까지 차례대로 숫자를 찍는다.

(작업이 끝나면 첫행을 1행으로 증가시킨다.)

  0열 1열 2열 3열
0행 1 2 3 4
1행        
2행        
3행        

 

2. 증가된 첫행인 1행부터 마지막 행 3행까지 마지막 열인 3열에 숫자를 넣는다.

(마지막 열인 3열을 하나 감소시킨다.)

  0열 1열 2열 3열
0행 1 2 3 4
1행       5
2행       6
3행       7

 

 

3. 마지막 열이 2열으로 바뀌었고(마지막 열이 2번에서 동작 후 감소됨) 부터 첫 열까지 차례대로 마지막 행 3행에 찍는다. (마지막 행인 3행을 감소시킨다.)

  0열 1열 2열 3열
0행 1 2 3 4
1행       5
2행       6
3행 10 9 8 7

 

4. 마지막 행인 2행부터 첫 행인 1행까지 숫자를 채운다.3번에서 마지막행이 3행에서 감소하여 2행이 됨, 1번에서 첫행이 증가하여 첫행은 1행이 됨 (첫열을 증가시킨다. 1열 증가시킨다.)

  0열 1열 2열 3열
0행 1 2 3 4
1행 12     5
2행 11     6
3행 10 9 8 7

 

5. 1번에서 했던 동작을 다시 반복한다.

  0열 1열 2열 3열
0행 1 2 3 4
1행 12 13 14 5
2행 11     6
3행 10 9 8 7

 

6. 2번에서 했던 동작을 반복한다.

  0열 1열 2열 3열
0행 1 2 3 4
1행 12 13 14 5
2행 11   15 6
3행 10 9 8 7

 

7. 3번에서 했던 동작을 반복한다.

  0열 1열 2열 3열
0행 1 2 3 4
1행 12 13 14 5
2행 11 16 15 6
3행 10 9 8 7

 

8. 4번에서 했던 동작을 반복한다.

for문 종료조건으로 인해 만족되지 않아 실행되지 않는다.

index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Snail Array</title>
    <style media="screen">
      body{
        background: #fff;
      }
      td{
        width: 50px;
        height: 50px;
        background: #fff;
        color: #fff;
        text-align: center;
      }
    </style>
    <script type="text/javascript" src="js-snail.js"></script>
  </head>
  <body>
    <table id="snail">

    </table>
  </body>
</html>

 

js-snail.js

window.onload=function(){
  (function(){
    var rows = prompt("행의 개수를 입력하세요");
    var cols = prompt("열의 개수를 입력하세요");

    var drawArr = createSnailArray(rows, cols);
    drawAnimate(drawArr);
  })();

}

/* 달팽이 배열을 만드는 함수
 * @param rows : 생성할 2차원 배열의 행 개수
 * @param cols : 생성할 2차원 배열의 열 개수
 */
function createSnailArray(rows, cols){
  // 애니메이션 효과용 1차원 배열 선언 및 초기화
  var drawArr = new Array();

  // 달팽이 형태로 데이터를 삽입할 2차원 배열 선언 및 초기화
  var arr = new Array();
  for(i=0; i<rows; i++){
    arr[i] = new Array();
  }

  var num = 1; //삽입할 데이터  1, 2, 3, 4, 5 ...

  var row_min = 0;       //행 최소값
  var col_min = 0;       //열 최소값
  var row_max = rows-1;  //행 최대값
  var col_max = cols-1;  //열 최대값

  var cycle = 0;         //그리면서 for문을 돌릴 바퀴 수
  if(rows >= cols){
    cycle = cols/2;
  }else{
    cycle = rows/2;
  }

  for(i=0; i<cycle; i++){

    //상단 출력
    for(j=col_min; j<=col_max; j++){
      arr[row_min][j] = num++;
      drawArr.push("td"+row_min+j);
    }
    row_min++;
    if(cols*rows +1 == num)  //사이즈가 안맞는 경우 강제 종료
      break;


    //우측 출력
    for(j=row_min; j<=row_max; j++){
      arr[j][col_max] = num++;
      drawArr.push("td"+j+col_max);
    }
    col_max--;
    if(cols*rows +1 == num)  //사이즈가 안맞는 경우 강제 종료
      break;

    //하단 출력
    for(j=col_max; j>=col_min; j--){
      arr[row_max][j] = num++;
      drawArr.push("td"+row_max+j);
    }
    row_max--;
    if(cols*rows +1 == num)  //사이즈가 안맞는 경우 강제 종료
      break;

    //좌측 출력
    for(j=row_max; j>=row_min; j--){
      arr[j][col_min] = num++;
      drawArr.push("td"+j+col_min);
    }
    col_min++;
    if(cols*rows +1 == num)  //사이즈가 안맞는 경우 강제 종료
      break;

  }
  var snail = document.getElementById("snail");
  appendTag(snail, arr);

  return drawArr; //애니메이션을 차례대로 그릴 ID값이 담긴 1차원 배열 반환
}

/* HTML 태그 target을 지정하여 생성하는 함수
 * @param target : 생성, 접근할 요소 dom형태로 전달
 * @param data   : 생성할 데이터 배열 전달
 */
function appendTag(target, data){
  var tag = "";

  for(i=0; i<data.length; i++){
    tag += "<tr>"
    for(j=0; j<data[i].length; j++){
      tag += "<td id='td"+i+j+"'>"+data[i][j]+"</td>"
    }
    tag += "</tr>"
  }

  target.innerHTML = tag;
}

/* 0.3초마다 배열에서 ID값을 하나씩 접근하여 색상 처리
 * @param arr : 아이디값이 담긴 배열
 */
function drawAnimate(arr){

  for(i=0; i<arr.length; i++){    
    (function(x){
      setTimeout(()=>{
        document.getElementById(arr[x]).style.background = "#FAAC58";
      }, 300*x)
    })(i);
  }
}

 

prompt 창으로 열과 행의 입력을 받은 후, 빙글 빙글 돌아가면서 달팽이 형태로 배열을 채우고 출력하는 소스이다.

열과 행이 1개차이까진 문제가 없지만 2개이상 차이가 나면 계속해서 도는 문제가 있어

이너 for문안에서 종료조건을 마지막 데이터값으로 체크하여 break 처리를 하였다.

더 좋은 로직이 있다면 코멘트 부탁드립니다.

생성할 행 입력

 

생성할 열 입력

 

7 X 5 배열 생성 결과

반응형
반응형

알고리즘 문제를 풀이해 보겠다.

1 ~ 입력받은 숫자까지 데이터를 배열에 담을 때, 홀짝별로 정렬되어 들어가는 배열을 만들 것이다.

조건이 배열을 한개만 사용해야 한다는 부분이 신기하여 작성하여 보았다.

1. 입력받은 숫자까지 배열에 담는다. ex) 6을 입력시 1, 2, 3, 4, 5, 6

2. 배열에 어떻게 넣든 상관은 없지만 나중에 호출시

홀수부터 시작이면 1, 3, 5, 2, 4, 6 으로 출력된다.

짝수부터 시작이면 2, 4, 6, 1, 3, 5 으로 출력시킨다.

3. 배열은 한 개만 선언하여 사용한다. 2개이상 사용금지!

 

재미있는 조건의 문제같아서 풀이해보았다. 더 신박한 풀이 방식이 있다면 피드백 부탁드립니다.

index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>홀짝</title>
    <script type="text/javascript" src="js-sipping.js"></script>
    <style media="screen">
      .inputData{
        width: 80px;
        height: 30px;
      }
      .button{
        width: 60px;
        height: 30px;
      }
    </style>
  </head>
  <body>
    <input type="number" id="inputData" class="inputData">
    <button type="button" class="button" name="button" onclick="sipping()">실행</button>
    <div id="outPut">

    </div>
  </body>
</html>

 

js-sipping.js

function sipping(){
  var num = document.getElementById("inputData").value;
  num = parseInt(num);
  if(num > 1){

    var arr = new Array();
    var half;
    var idx = 0;
    var orderBy = confirm("홀수 부터 정렬할까요?");

    if(orderBy){
      half = Math.ceil(num/2);
    }else{
      half = Math.floor(num/2);
    }

    for(i=1; i<num+1; i++){
      if(orderBy){

        if(i%2 == 0){
          arr[half] = i;
          half++;
        }else{
          arr[idx] = i;
          idx++;
        }
      }else{

        if(i%2 == 0){
          arr[idx] = i;
          idx++;
        }else{
          arr[half] = i;
          half++;
        }
      }
    }

  }else{

    alert("2이상부터 동작합니다.")
    return;
  }

  document.getElementById("outPut").innerHTML = arr;
}

 

작성 한 코드는 2이상부터 동작하도록 설정하였다.

짝부터 정렬한다고 가정하고

0번인덱스부터 차례대로 짝수값만 %연산자를 통해 집어넣고

배열길이의 절반위치부터 차례대로 홀수값만 입력하여 완성시키는 코드이다.

홀부터 정렬할경우엔 반대로 동작

입력값이 2, 4, 6 등의 짝수 값을 입력시엔 반값이 정확하므로 문제가 없지만

입력값이 3, 5, 7 등의 홀수 값을 입력하면 반값이 소숫점으로 나오므로 정렬순에 따라 올림 또는 버림이 필요했다.


 

ex) 7이 입력된 경우 부터 정렬하면 홀수의 시작 위치가 3이다.(길이의 반 값(3.5)을 내림을 해야함)

숫자 2 4 6 1 3 5 7
배열[인덱스] 0 1 2 3 4 5 6
숫자 2 4 6 1 3 5 7
배열[인덱스] 0 1 2 3 4 5 6

 

ex) 7이 입력된 경우 부터 정렬하면 짝수의 시작 위치가 4이다.(길이의 반 값(3.5)을 올림을 해야함)

숫자 1 3 5 7 2 4 6
배열[인덱스] 0 1 2 3 4 5 6

 

반응형
반응형

2차원 배열에 색상을 저장하고, 배열 데이터를 활용하여 태그로 파싱 후

태그를 클릭하면 해당 태그의 ID 값을 가져와서 body 태그의 배경색을 바꾸는 프로그램을 구성해보겠다.

색상 배열 데이터는 네이버 색상표를 검색시 나오는 데이터를 옮겼다.

팔레트 선택 예제

 

Pallet

 

See the Pen Pallet by myhappyman (@myhappyman) on CodePen.

반응형
반응형

배열에 예제문제 풀이를 준비하던 도중 문제가 발생하였다......

문제는 아래와 같다.

var numberArr = [["1", "2"],
                 ["3", "4"]];

function shiftTable(){
  var copyArr = numberArr;  //문제가 되는 부분

  for(i=0; i<numberArr.length; i++){

    for(j=0; j<numberArr[i].length; j++){
        if(i==0 && j==0){
          copyArr[i][j+1] = numberArr[i][j];
        }else if(i==0 && j==1){
          copyArr[i+1][j] = numberArr[i][j];
        }else if(i==1 && j==0){
          copyArr[i-1][j] = numberArr[i][j];
        }else if(i==1 && j==1){
          copyArr[i][j-1] = numberArr[i][j];
        }
    }
  }
}

 

 

함수 shiftTable 내부에 첫줄

var copyArr = numberArr;

형태로 배열을 복사하게 되면 어떻게 될까?

배열 데이터를 출력해보면 정상적으로 복사가 된 것 같지만 사실 이것은 주소값이 복사 된 것이다.

먼저 선언한 numberArr라는 배열의 주소값을 copyArr이라는 변수가 참조하기 시작한다.

그럼 어찌되었든 간에 값을 똑같이 복사 했을텐데 뭐가 문제냐라고 의문이 생길 수 있겠지만

반복문 구간에서 문제점을 볼 수 있다.

 

1 2
3 4

 

간단하게 4칸짜리 테이블의 데이터가 빙글 빙글 돌아가는걸 표현하기 위해 인덱스가 증가함에 따라

하드코딩으로 해당 위치값을 옮기는 걸 표현한 소스인데

최초 반복문 동작하면 i=0; j=0; 값의 상태에서 처음 if 조건을 만족하고

copyArr[i][j+1] = numberArr[i][j]; 문장이 실행이 된다. (numberArr[i][j] 의 값은 현재 "1")

여기서 서로 같은 주소값을 바라보고 있다보니

copyArr 값이 [["1", "1"], ["3", "4"]] 으로 바뀌고 동일한 주소값을 바라보는 numberArr도 동일하게 값이 바뀌어 버린다.

그럼 자바스크립트에서 배열을 복사 할 때, 우린 무엇을 사용해야 할까?

검색을 해보니 slice() 메소드를 활용하면 된다고 나와있어서 사용해보았지만 결과는 동일하게 서로의 값을 참조하고

독립적인 배열로 동작하지 않는다.

(확인 결과 1차원배열은 독립적으로 동작하지만 2차원배열은 독립적으로 동작하지 않는 점을 확인했다.)

독립적인 배열의 값만 복사하기

방법) JSON.parse(JSON.stringify(배열)) 활용하기

var numberArr = [["1", "2"],
                 ["3", "4"]];

var copyArr = JSON.parse(JSON.stringify(numberArr));
copyArr[0][1] = numberArr[0][0];
console.log(copyArr) // ["1", "1"], ["3", "4"];
console.log(numberArr) // ["1", "2"], ["3", "4"];

 

JSON 데이터를 파싱할 때 사용하는 메소드인데 배열을 복사 할 때도 사용할 수 있다.

이 방식을 이용하여 독립적인 값을 가지는 배열을 복사 할 수 있다.

반응형
반응형

7개의 정수 데이터를 받아와 합산 값을 구해야 하는 프로그램이 있다고 할 때 우린 어떻게 해야할까?

변수 7개를 선언하고 각 변수에 값을 저장한 후 다 더해주면 될 것이다.

var num1 = 14;
var num2 = 33;
var num3 = 17;
var num4 = 12;
var num5 = 19;
var num6 = 24;
var num7 = 31;
alert(num1 + num2 + num3 + num4 + num5 + num6 + num7);

 

간단할 수 있지만 7개의 변수를 이름이 겹치지 않게 다 선언하고 또 호출하여 더하는 번거로움이 있다.

지금은 7개지만 100개를 받거나 1000개를 받아야 한다면????

이럴 때 배열을 사용하면 좋을 것이다.

자바스크립트의 배열 형태로 변경해보자.

var res = 0;
var arr = [14, 33, 7, 12, 19, 24, 31];
for(i=0; i<arr.length; i++){
  res += arr[i];
}
alert(res);

arr이라는 변수에 배열 데이터를 담아 저장하고

for을 활용하여 배열의 첫번째 데이터인 0번 인덱스부터 마지막 인덱스 6번까지 더해주면 똑같은 결과를 얻는다.

관련 데이터를 한 배열에 담아 값을 추가하거나 삭제 시킬 수 잇고 훨씬 깔끔하게 데이터를 처리 할 수 있다.

 


자바스크립트에서 배열 선언 방법

방법 1)

var fruits =  new Array();
fruits[0] = "포도";
fruits[1] = "멜론";
fruits[2] = "망고";
fruits[3] = "사과";
//fruits > [포도, 멜론, 망고, 사과]

방법 2)

var fruits = ["포도", "멜론", "망고", "사과"];
//fruits > [포도, 멜론, 망고, 사과]

방법 3)

var fruits = new Array("포도", "멜론", "망고", "사과");
//fruits > [포도, 멜론, 망고, 사과]

 


배열 호출

선언을 하였으니 하나씩 호출하는 방법도 알아보자.

배열명의 해당 위치 인덱스를 찍으면 해당 데이터를 호출 할 수 있다.

var fruits = ["포도", "멜론", "망고", "사과"];

fruits[0] // "포도"

fruits[1] // "멜론"

fruits[2] // "망고"

fruits[3] // "사과"

이와 같은 특성을 활용하여 for문을 통해 0번째 인덱스부터 배열의 길이까지 찍으면 하나씩 데이터를 얻을 수 있다.

var fruits = ["포도", "멜론", "망고", "사과"];
var str = "";
for(i=0; i<fruits.length; i++){
   console.log(fruits[i]);
   str += fruits[i];
}
console.log(str); // 포도멜론망고사과

 


 

배열 제어

기존 배열에서 데이터 추가 하기 - push(데이터)

var fruits = ["포도", "멜론", "망고", "사과"];
fruits.push("체리");
console.log(fruits); //["포도", "멜론", "망고", "사과", "체리"]

추가 후 마지막에 체리 데이터가 추가 된 걸 볼 수 있다.

기존 배열에서 데이터 삭제 하기 - pop()

var fruits = ["포도", "멜론", "망고", "사과"];
fruits.pop();
console.log(fruits); //["포도", "멜론", "망고"]

 

삭제 후 마지막에 사과 데이터가 삭제 된 걸 볼 수 있다.

그럼 특정 위치에 추가하거나 삭제 하는 방법도 알아보자.

특정 인덱스 값 삭제하기 - splice

var fruits = ["포도", "멜론", "망고", "사과"];
var idx = fruits.indexOf("망고");
var removeItem = fruits.splice(idx, 1);
console.log("removeItem > "+removeItem); //망고
console.log(fruits); //["포도", "멜론", "사과"]

 

망고 텍스트를 indexOf를 통하여 인덱스 값을 얻은 후,

splice(시작 위치, 삭제 개수) 를 통하여 데이터를 삭제 할 수 있다.

삭제 개수를 늘리면 연달아 삭제도 가능하다.

한번에 2개 데이터 삭제하기

var fruits = ["포도", "멜론", "망고", "사과"];
var idx = fruits.indexOf("망고");
var removeItem = fruits.splice(idx, 2);
console.log("removeItem > "+removeItem); //망고,사과
console.log(fruits); //["포도", "멜론"]

 

특정 위치에 데이터 추가하기

var fruits = ["포도", "멜론", "망고", "사과"];
var idx = fruits.indexOf("망고");
fruits.splice(idx, 0, "파인애플");
console.log(fruits); //["포도", "멜론", "파인애플", "망고", "사과"

망고가 기존에 3번째 즉 fruits[2] 위치였고 해당 위치에 파인애플이 들어온 걸 볼 수 있다.

자바스크립트에서는 배열을 splice(시작 위치, 삭제 개수, 추가할 데이터)를 활용하여 자유롭게 제어 할 수 있다.

반응형
반응형

인터넷을 하다보면 여러 광고 사이트 또는 화장품, 쇼핑몰 등에서 흔하게 이미지가 하나하나 넘어가면서

상품이나 기술등을 나열한 모습들을 볼 수 있다.

- 좌, 우버튼에 따른 이동

- 하단부 버튼에 따른 매칭 이미지 변경

- 일정시간마다 다음 이미지로 변경

3가지 기능이 동작하는 슬라이드쇼를 만들어 보자.

적용모습

슬라이드쇼

 

 

See the Pen slideShow by myhappyman (@myhappyman) on CodePen.

반응형
반응형

반복문이란?

반복적인 작업이 발생할 경우 사용 할 수 있는 문법이다.

예를들어 div태그를 천개를 생성해야 할 경우 하나하나 생성하여 천개를 만드는 것 보다는

반복문을 통하여 프로그래밍적으로 처리하는 것이 더 효율적이고 시간적으로도 생산적 일 것이다.

좀 더 단적인 예를 들어

업무 지시로 천개의 div 태그를 생성할 일이 있어서 만들었는데

알고보니 2천개가 필요했다면 간단하게 반복문 수정을 통해 변경이 가능 할 것이다.

그럼 반복문 사용법을 알아보자.

 

for 문법

for(초기값; 종료조건; 증감식){
   // 반복문 동작...
}

 

ex) 2단 구구단

<!DOCTYPE html>
<html>
<head>
  <title>2단</title>
</head>
<body>

<script>
  for(i=1; i<10; i++){
    console.log(i+" * 2 = "+i*2);
  }
</script>

</body>
</html>

2단 출력

 

2단을 찍어봤으니 9단까지도 찍어보면 좋을 것 같다.

ex) 구구단 gugudan.html

<!DOCTYPE html>
<html>
<head>
  <script src="gugudan.js" type="text/javascript" charset="utf-8"></script>
  <style>
    .gugudan{
      width: 100%;
      position: absolute;
    }
    .gugudan div{
      width: 10%;
      float: left;
      margin: 15px;
      border: 1px solid black;
    }
    .gugudan div div{
      width: 100px;
      position: relative;
      text-align: center;
      border: none;
    }
  </style>
</head>
<body >
  <div id="gugudan" class="gugudan">

  </div>

</body>
</html>

 

gugudan.js

window.onload = function () {
  var htmlStr = "";
  var dan = 2;
  var value;

  for(dan; dan<10; dan++){

    htmlStr += "<div id='dan-"+dan+"'><div> " + dan + "단 </div>";
    for(j=1; j<10; j++){
      value = dan * j;
      htmlStr += "<div>" + dan + " * " + j + " = " + value + "</div>";
    }
    htmlStr += "</div>";
  }

  var gugudan = document.getElementById("gugudan");
  gugudan.innerHTML = htmlStr;
};

 


 

for문으로 반복문이 구현이 되었다면 while문으로도 구현이 가능하다.

while 문법

초기값;
while(종료조건){
    //반복문 동작...
    증감식;
}

 

for문에서는 "( )" 내에서 초기, 종료, 증감값을 정의하여 사용하지만, while문은 종료조건밖에 없기때문에

별도의 변수를 선언하여 초기값을 정하고 종료조건과 증감식을 처리해야 동일하게 동작 시킬 수 있다.

ex) 2단 구구단

<!DOCTYPE html>
<html>
<head>
  <title>구구단</title>
</head>
<body>

<script>
  var i = 1;
  while(i<10){
    console.log(i+" * 2 = "+i*2);
    i++;
  }
</script>

</body>
</html>

 

for문에서 동작시킨 결과와 동일하게 동작하는 것을 볼 수 있다.

 

ex) 구구단 gugudan.html

<html>
<head>
  <script src="gugudan.js" type="text/javascript" charset="utf-8"></script>
  <style>
    .gugudan{
      width: 100%;
      position: absolute;
    }
    .gugudan div{
      width: 10%;
      float: left;
      margin: 15px;
      border: 1px solid black;
    }
    .gugudan div div{
      width: 100%;
      position: relative;
      text-align: center;
      border: none;
      margin: 0 auto;
      margin-top: 15px;
      margin-bottom: 15px;
    }
  </style>
</head>
<body >
  <div id="gugudan" class="gugudan">

  </div>

</body>
</html>

 

gugudan.js

window.onload = function () {
  var htmlStr = "";
  var dan = 2;
  var value;
  while(dan < 10){

    htmlStr += "<div id='dan-"+dan+"'><div> " + dan + "단 </div>";

    var j=1;
    while(j < 10){
      value = dan * j;
      htmlStr += "<div>" + dan + " * " + j + " = " + value + "</div>";
      j++;
    }
    htmlStr += "</div>";
    dan++;
  }

  var gugudan = document.getElementById("gugudan");
  gugudan.innerHTML = htmlStr;
};

 

구구단 출력

 


간단하게 for, while문에 대하여 알아보았다.

do ~ while문도 존재하는데 while문과의 차이점은 무었일까?

do while 문법

초기값;
do{
    //반복문 동작...
    증감식;
}while(종료조건)

 

설명보다도 소스 결과로 바로 확인을 해보자.

<!DOCTYPE html>
<html>
<head>
  <title>do while</title>
</head>
<body>
<script>
  var i = 1;
  while(i<1){

    console.log("while문입니다.")
    i++;
  }

  /////////////////////////////////////

  i = 1;
  do{
    console.log("do while문입니다.")
    i++;
  }while(i<1)


</script>
</body>
</html>

 

결과값

 

while문의 log값은 찍히지 않고 do while문의 log값은 한번 찍힌걸 볼 수 있다.

반복문은 처음 종료조건을 만족하는지 확인하고 동작을 한다.

위 소스의 while문 변수 i는 1이고 종료조건은 1보다 작을때까지 동작하므로바로 종료하지만

do while문은 종료조건을 먼저 보는게 아니라 do문구를 먼저 동작하고 종료조건을 확인 하기 때문에

로그값이 찍힌걸 볼 수 있다.

이러한 특징을 활용하여 반복문이지만 조건에 따라 무조건 한번은 동작해야되는 로직이 필요할 경우 do while문을 활용하면 좋다.

반응형