자바스크립트의 문장 Statement (1) 개발자로서의 Berry


  프로그램은 문장의 집합입니다. 프로그래밍 언어에서 문장(statement)이라는 것은 곧 연산의 집합입니다. 컴퓨터에서 연산은 작고 작은 명령의 조각이 한데 뭉친 데 불과하죠. 작은 명령(instruction)이 모여 연산(operation)이 되고 이들을 문장(statement)이라 부른다는 것입니다. 하지만 웹 개발자 그 누구도 bit의 깜빡임이나 호출스택의 추적에는 관심이 없습니다. 오직 눈 앞에 끝내주는 화면이 나타나기를 바랄 뿐입니다. 때문에 우리의 관심은 오직 문장입니다. 문장을 알면 자바스크립트를 작성할 수 있기 때문에 우리는 문장에 관심이 있습니다. 자바스크립트의 문장은 C언어계열과 유사하게 세미콜론(;) 을 통해 문장을 마칩니다. 경우에 따라 세미콜론이 없는 문장도 있지요.



표현문 expression statement

  자바스크립트를 만져주다 보면 가장 많이 접하는 문장이 있습니다. 그것은 바로 표현문입니다. 아주 간단한 할당문assignment statement, 호출function call statement문이 바로 이 표현문에 해당되거든요. 바로 아래와 같은 문장들이지요.

i = i + 1; //세미콜론으로  끝나는 군요.
alert("Hello World!"); //역시 세미콜론으로 끝납니다.

  자바스크립트는 원칙상 세미콜론을 문장의 끝에 명시하여야 하지만 실수로 빼먹더라도 컴파일러가 붙여줍니다. 버그를 키우고 싶다면 손가락의 수고를 더는 것도 나쁘지 않겠는데요? 덩치가 커지면 커다란 똥덩어리를 낳겠죠


복합문 block statement


  흔히 블록이라 불리는 이 복합문은 표현문의 집합입니다. 이 블록은 하나의 문장처럼 사용되기 때문에 이 또한 문장입니다. 표현식은 연산에 가까우니까요. 블록은 표현문과 달리 세미콜론으로 끝나지 않습니다. 바로 아래와 같은 것이 복합문이죠.


var statement = "block!!";
alert (statement);
}


  자바스크립트의 블록은 여타 언어와 달리 그 자체만으로는 큰 의미가 없습니다. 자바스크립트의 블록은 고유 범위를 갖지 않기 때문입니다. 

(1) C 언어에서 블록의 적용
{
int i=0;

int i=1;
printf("%d", i); // 1출력
}
printf("%d", i); // 0출력
}

위와 같은 C문장에서는 안쪽 블록의 i변수나 바깥쪽 블록에서의 i 변수가 서로 다른 변수범위(scope)를 가지기 때문에 서로 다른 값을 유지하게 됩니다.


(2) 자바스크립트에서 블록의 적용
{
var i=0;

var i=1;
alert(i); // 1출력
}
alert(i); // 1출력
}

위와 같은 자바스크립트 문장에서는 안쪽 i 변수나 바깥쪽 i 변수나 똑같이 최상위 블록(가장 바깥 블록)의 변수로 선언되며 따라서 서로 다른 변수영역을 가지지 않아 값이 덮어씌워지게 되는 것입니다. 즉 둘다 같은 변수이지요. 

그래서 자바스크립트에서는 단순 블록을 사용할 일이 거의 없습니다. 



if, else, else if

  if문은 어느 프로그래밍 언어에나 빠지지 않고 있습니다. 또한 별다른 차이도 없구요. 자바스크립트의 if문은 C, C++, JAVA의 스타일을 따릅니다.

if (sex == "M") { // 조건문이 참일 경우
alert("남자");
else if (sex == "W") { //조건문이 거짓일 때 새로운 조건문 판정
alert("여자");
} else { // 조건문이 모두 거짓
alert("정신병자");



 if문은 if 단독으로 사용할 수 있으며 else, else if는 생략할 수 있습니다. 또한 블록을 이용하지 않을 수 도 있는데 블록을 이용하지 않을 경우 다음에 오는 단일 문장만 실행됩니다.

if (sex == "M"

alert("남자"); // end of if



switch

  switch문은 여타 언어와 비슷하게 작동하지만 약간의 차이점이 있습니다. switch문은 조건에 따라 case로 분기되며 아무것에도 해당되지 않으면 default로 분기됩니다. default는 생략이 가능하고 break문을 만나면 스위치는 종료합니다.

switch (sex) {
case 'M' :
alert("남자");
break;
case 'W' :
alert("여자");
break;
default :
alert("정신병장");
break;
}

자바스크립트의 데이터 타입(http://thinkberry.co.kr/456) 을 보신분이라면 자바스크립트의 스위치문이 여타 언어의 스위치문과 다름을 아실 것입니다. C와 같은 언어에서는 switch문의 case에 올 수 있는 비교 값은 정수 리터럴입니다. 그러나 자바스크립트에는 모든 문자를 문자열로 취급함을 기억하신다면 위의 예에서의 특수함을 이해하실 겁니다. 즉, 자바스크립트의 switch문에는 case에 올 수 있는 비교 값으로 정수뿐만이 아닌, 숫자, 문자열, 불린과 같은 타입은 물론이며 표현식도 올 수 있습니다.

case 60*60*24 :
case Math.PI :
case list[0] :
case ++count :

 


while, do while

  while과 do while은 프로그래밍 언어의 대표적인 반복문 입니다. 자바스크립트의 while과 do while 또한 여타 언어와 다르지 않습니다. while과 do while의 차이는 먼저 조건을 비교하고 반복을 시작하느냐, 일단 시작하고 나중에 조건을 비교하느냐의 차이입니다.

(1) while문
var sum = 100;
while ( sum < 100 ) {
sum = sum + 1;
}

(2) do while문
var sum = 100;
do {
sum = sum + 1;
} while ( sum < 100 );


while문에서는 조건문이 위에 있기 때문에 우선 조건이 맞는지 판별한 후 while문 안에 진입하게 됩니다. 그러나 do while의 경우 조건문이 아래에 있으며 do while문안의 블록을 우선 실행한 후 조건을 비교하게 됩니다. 따라서 (1)의 경우 sum의 값은 100이며 (2)의 경우 sum의 값은 101이 되죠. 직관적이지 않나요?



for, for in

  for문은 편리한 반복문을 위해 만들어졌습니다. 만약 반복할 횟수를 안다면 주저 않고 for문을 쓰시면 됩니다. 배열의 순회 이제는 for in의 시대이죠. 배열의 원소의 갯수를 우리가 생각할 필요가있을까요? 자바스크립트의 for문은 여타 언어와 동일하며, for in문은 PHP의 foreach, 자바의 foreach와 유사합니다. 궂이 말하자면 자바의 foreach와 더 유사하죠. 괜히 이름만 비슷한게 아닌 듯 합니다.

  먼저 for 문을 보도록 하지요.

for (i=1; i<=10; ++i) {
sum = sum + i;
}

 for문의 괄호 내에서는 3가지의 일이 일어납니다. 첫번째는 초기화입니다. 이 곳에서는 변수의 초기 값을 할당합니다. 위에서는 i의 값이 1로 초기화 되고 있네요. 두번째는 조건문입니다. 조건문의 결과가 참이라면 for의 블록안의 코드가 실행됩니다. 세번째는 증감문입니다. 블록안의 코드가 모두 실행되고 난 뒤 증감문이 자동적으로 실행됩니다.


다음은 for in 문입니다.

for ( element in list ) { 
sum = sum + element;
}
 

for in문은 주로 배열이나 객체를 읽을 때 사용됩니다. in 뒤에 따라오는 변수에서 하나의 요소를 선택하여 in 앞에 변수에 할당합니다. 즉 위의 코드에서는 list의 요소를 하나 꺼내어 element에 할당하며 모든 요소를 꺼낸 뒤에는 for in문이 종료되는 것입니다. 자바스크립트에서는 배열을 연관배열과 같이 사용할 수 있으므로 for in문이 유용하게 사용될 수 있습니다. 또한 객체에도 마찬가지로 적용할 수 있어서 모든 프로퍼티의 값을 읽을 때에도 유용합니다.




label, break, continue

  자바스크립트는 고 수준의 언어이기 때문에 label이 있습니다. C언어에서 다중 반복문을 실행 중에 가장 바깥으로 빠져나가고 싶을때 여간 골머리가 아픈 것이 아닙니다. 지금은 21세기, goto를 쓸 수는 없지 않겠어요? 프로그래밍의 대가크누스가 과거에 goto는 반드시 필요하다고 주장했던 이유도 이러한데에 있었을 겁니다. 하지만 자바스크립트에는 label이 있습니다. 그 전에 break와 continue를 알아보도록 하지요. break와 continue, 바로 이들이 label의 탄생동기입니다.


반복문을 실행중에  빠져나오고 싶을 때 사용하는 문장이 있습니다. 바로 break 인데요. 반복문에서 break를 만나면 조건여부에 관계없이 반복문을 탈출합니다.

f
or (i=0; i<10; ++i) { 
if (i==5) break; // i의 값이 5가 되면 반복문 종료
}



반복문을 실행중에 이후 나머지 문장을 실행하지 않고 처음으로 돌아가고 싶을 때가 있습니다. 그 때 사용하는 것이 continue입니다. continue는 반복문을 탈출하는 것이 아니라 호출된 지점에서 중지하고 다시 조건문을 비교하러 갑니다.

for (i=0; i<10; ++i) { 
if (i%2 == 0) continue; // i의 값이 2로 나누어 나머지가 0일 경우 바로 조건문으로 건너 뜀.

document.write ("홀수입니다");
}



label은 반복문에 이름을 지어주는 것과 같습니다. 반복문 앞에 적당한 이름과 콜론(:)을 붙임으로서 label이 형성됩니다. label은 분기를 할 위치를 정하여 break문이나 continue문을 내가 원하는 반복문에 적용할 수 있도록 합니다.

outter : // outter라는 label 지정 아래의 for문은 outter 라는 이름을 가진다.
for (i=0; i<10; ++i) { 
inner : // inner라는 label 지정 아래의 for문은 inner 라는 이름을 가진다.
for (j=0; j<10; ++i) { 
if (j == 5) break outter; // j의 값이 5가 되면 바깥 for문 종료

}
}


  레이블이 지정된 반복문에는 break나 continue문 뒤에 레이블의 이름을 적음으로서 자신의 반복문이 아니라 더욱 바깥쪽에 있는 반복문을 제어할 수 있게 됩니다. break는 해당 레이블명의 반복문을 종료하게 되며, continue문은 해당 레이블명의 반복문으로 건너뛰게 됩니다.





THinkBerry의 생각열매를 함께 나눠요. ThinkBerry.co.kr
TAG

Leave Comments


profileThinkberry에 오신것을 환영해요~ 

Recent Trackback

오늘:
4,113
어제:
3,552
전체:
76,325