Home > JavaScripFile
TITLE    자바스크립트 완벽가이드 6장 문장
작성자 김대근 날짜 2013.01.24 조회수 0

6. 문장

□문장

- 완결된 명령.

- 문장들 사이의 구분은 세미콜론으로 이루어진다.

□표현문(expression statements)

■ 특징

- 부수 효과가 있는 표현식.

■ 할당문

- 할당이 일어난 표현식.

s = “Hello” + name;

i *= 3;

count++;

delete o.x;

■ 함수 호출

- 함수 호출은 표현식이기도 하지만 동시에 문장이기도 하다.

alert(“Welcome, “ + name);

window.close();

Math.cos(x);

cx = Math.cos(x);

□복합문

■ 특징

- 표현식이 다른 표현식을 포함.

- 각각의 복합문은 하나의 하위문(substatement)을 포함할 수 있다.

- 다수의 문장을 큰 문장 블록으로 합친다.

{

x = Math.PI;

cx = Math.cos(x);

alert( “cos(“ + x + “) = “ + cx);

}

- 문장 블록을 사용하면 문법에 명시된 하나의 하위문 안에 많은 문장을 넣을 수 있다.

■ 실행 방법

- 자바스크립트 인터프리터가 해당 복합문을 구성하는 문장들을 쓰인 순서대로 하나씩 차례로 실행.

■ 실행이 중단되는 경우

- 복합문 안에 break, continue, return, throw 같은 문장을 만나 실행 중단.

- 복합문 안에서 에러 발생.

- 복합문에서 호출한 함수가 그 안에서 발생한 에러를 처리하지 않거나 직접 예외를 발생시키는 경우.

if

■ 특징

- 조건부로 문장을 실행할 수 있는 기능을 제공하는 제어문.

if

if (표현식)

문장

- ‘표현식을 평가한 값이 true이거나 true로 변환할 수 있으면 문장을 수행.

- ‘표현식을 평가한 값이 false이거나 false로 변환할 수 있으면 문장을 수행하지 않는다.

if( username == null ) // username null 이거나 undefined 일 경우

username = “John Doe”;

if( !username) username = “Johe Doe”; // username null, undefined, 0, “”, NaN일 경우

if( (address == null) || (address == “”) )

{

address = “undefined”;

alert(“Please specify a mailing address”);

}

else

- 표현식이 false일 때 실행되는 문장.

if(표현식)

문장1

else

문장2

- ‘표현식을 평가한 값이 true이거나 true로 변환될 수 있을 경우 문장1’ 수행.

- ‘표현식을 평가한 값이 false이거나 false로 변환될 수 있을 경우 문장2’ 수행.

if( username != null )

alert(“Hello“ + username + “\nWelcome to my blog.”);

else

alert(“Welcome!\n What is your name?”);

- else절은 가장 가까운 if문에 속하므로 중첩된 if문을 사용할 경우 주의해야 한다.

var i = j = 1;

var k = 2;

if( i == j )

if( j == k )

document.write(“i equals k”);

else

document.write(“i doesn’t equal j”); // 두번째 if 문에 속하는 else.

/*

모호함을 없애기 위해 {} 사용.

if( i == j )

{

if( j == k )

document.write(“i equals k”);

}

else

{

document.write(“i doesn’t equal”);

}

*/

else if

- 여러 개 중 하나의 코드를 실행할 때 사용.

if( n == 1 )

// 코드 블록 #1 수행.

else if( n == 2 )

// 코드 블록 #2 수행.

else if( n == 3 )

// 코드 블록 #3 수행.

else

// 모든 테스트가 false이면 코드 블록 #4 수행.

switch

■ 특징

- 모든 분기가 단 하나의 변수 값에 의해 결정될 경우 if문보다 효율적으로 사용.

switch(표현식)

{

문장

}

- 코드 블록의 여러 위치에 case, default 레이블을 붙인다.

■ 실행

- switch 문이 실행되면 표현식의 값을 계산하고 이 값에 대응하는 case 레이블을 찾을 때 해당 case 레이블 직후에

나오는 문장 수행.

- 대응되는 case 레이블이 없을 경우 default 레이블 직후에 나오는 문장 수행.

- case문을 판별하는 데에는 동등 연산자(==)가 아닌 일치 연산자(===)가 사용된다.

- default 레이블이 없을 경우 모든 코드 블록을 건너뛴다.

switch(n)

{

case 1 : // n == 1일 경우 #1 수행 후 멈춤.

// 코드 블록 #1 실행.

break;

case 2 : // n == 2일 경우 #2 수행 후 멈춤.

// 코드 블록 #2 실행.

break;

case 3 : // n == 3일 경우 #3 수행 후 #4 수행. (break문이 없기 때문)

// 코드 블록 #3 실행.

default : // 아무 case 에도 해당되지 않을 경우 #4 수행.

// 코드 블록 #4 실행.

break;

}

- case문은 실행하려는 코드가 수행되는 지점을 지정만 한다.

(중지할 경우 break, return문 사용.)

function convert(x)

{

switch( typeof x )

{

case ‘number’ : // 숫자 타입일 경우16진수로 변환하여 반환.

return x.toString(16);

case ‘string’ : // 문자열일 경우 큰따옴표로 묶어서 반환.

return ‘”’ + x ‘”’;

case ‘boolean’ : // 대문자 TRUE 혹은 FALSE로 반환.

return x.toString().toUpperCase();

default : // 그 이외의 경우 통상적인 방법으로 반환.

return x.toString();

}

}

while

- 반복적인 행동을 수행.

while(표현식)

문장

- ‘표현식을 평가한 값이 true일 경우while 루프의 몸체을 형성하는 문장이 실행된 후 표현식을 평가한 값이 false

될 때까지 반복 수행.

- ‘표현식을 평가한 값이 false일 경우 프로그램의 다음 문장을 수행.

- while(true)구문을 사용하여 무한 루프를 만들 수 있다.

var count = 0;

while( count < 10 ) // count값이 10보다 작을 때 까지 수행.

{

document.write(count + “<br/>”);

count++;

}

do/while

- while문과 비슷하지만 루프가 최소한 한 번 이상 수행되어야 할 경우에 사용.

do

문장

while(표현식);

- do 키워드 다음에 오는 문장을 수행 후 while 키워드의표현식을 평가한 값이true일 경우 do 키워드의 문장을 수행.

- while 키워드의 표현식을 평가한 값이 false일 경우 프로그램 다음 문장을 수행.

function printArray(a)

{

if( a.length == 0 )

document.write(“Empty Array”);

else

{

var i = 0;

do {

document.write(a[i] + “<br/>”);

} while(++I < a.length);

}

}

for

- while문보다 좀 더 편리한 루프.

- 초기화, 테스트, 갱신에 대한 부분이 루프 문법 내부에 명시적으로 나타나 있다.

for(초기화 ; 테스트 ; 증가)

문장

- 초기화 : 루프가 시작하기 전에 카운터 변수 초기화.

- 테스트 : 매회 반복이 일어나기 직전에 평가되어 루프의 몸체를 실행할지 여부를 제어.

- 증가 : 루프 몸체 끝에서 테스트 부분을 수행하기 직전에 카운터 변수를 증가하거나 갱신.

for( var cnt =0; cnt<10 ; cnt++)

document.writeln(cnt);

for( i=0, j=10 ; i< 10 ; i++, j-- )

sum += i * j;

for/in

- 객체의 모든 프로퍼티에 대한 루프.

for(변수 in 객체)

문장

- 변수 : 변수 이름, 변수/배열 객체/객체 프로퍼티를 선언하는 var.

- 객체 : 객체 이름 또는 객체로 평가될 수 있는 표현식.

- for/in 루프의 몸체는 객체의 각 프로퍼티마다 한 번씩 실행.

몸체가 실행되기 전에 객체에 속한 프로퍼티들 중 하나의 이름이 변수에 문자열 형태로 할당.

for( var prop in my_obj ) // my_obj 객체의 이름 & 값 출력.

document.writeln(“name : “ + prop + “; value : “ + my_obj[prop]);

- 객체 프로퍼티들이 변수에 할당되는 순서는 정해져 있지 않다.

(자바스크립트 구현이나 버전에 따라 순서가 달라질 수 있다.)

- 몇몇 프로퍼티들은 열거 불가로 지정되어 있어 for/in문으로 열거되지 않는다.

(열거 불가 프로퍼티 : 내장 프로퍼티, 내장 메서드)

- 상속된 사용자 정의 프로퍼티는 열거 가능.

- for/in 루프의 변수에 임의의 표현식 사용 가능.

var o = { x : 1, y : 2, z : 3};

var a = new Array();

var i = 0;

for( a[i++] in o ); // 루프 몸체는 비어 있다.

document.writeln(a); // x,y,z 출력.

- 배열 인덱스도 하나씩 열거 가능.

var a = new Array(1,2,3);

for( i in a)

document.writeln(i);

□레이블

- 어떤 문장에라도 그 앞에 식별자 이름과 콜론을 삽입함으로써 레이블을 붙일 수 있다.

식별자: 문장

- switch문에서 사용되는 case default: 레이블은 특별한 레이블 문이다.

- 레이블 이름은 변수나 함수 이름과는 별개로 취급되기 때문에 변수나 함수 이름과 같아도 충돌되지는 않는다.

- 어떤 문장에 레이블을 붙이면 프로그램의 다른 곳에서 그 문장을 참조할 수 있는 이름이 생긴다.

testLabel : {

var testfunc = function()

{

document.writeln('label test');

}

}

testfunc(); // label test 출력

testLabel:testfunc(); // label test 출력

- 어떤 문장에라도 레이블을 붙일 수 있지만 보통 루프문에 사용된다.

break

■ 문법

break;

■ 특징

- break 문을 감싸고 있던 가장 안쪽의 루프나switch문에서 즉시 빠져 나온다.

- 루프나 switch문 내부에서만 적법하다.

for( i=0 ; i<a.length ; i++ )

{

if( a[i] == target )

break;

}

■ 레이블과 함께 사용

- break 키워드 뒤에 레이블 이름이 따라올 수도 있다.

break 레이블 이름;

- 레이블 이름에는 콜론 없이 오직 식별자만 쓴다.

- 레이블은 문장들의 블록을 지칭하는 이름이어야 한다.

- 해당 레이블 이름이 붙은 문장을 종료.

* 레이블이 붙은 문장

- 어떤 형태로든 다른 문장들을 둘러싸고 있는 문장.

- 레이블이 붙은 문장은 굳이 루프나 switch문이 아니어도 상관 없으며, 레이블과 함께 쓰인 break문이 루프나 switch

에 포함되지 않아도 상관없다.

- break키워드와 레이블 이름 사이에선 줄바꿈이 허용되지 않는다.

outputloop:

for( var i=0 ; i<10 ; i++ )

{

innerloop:

for( var j=0 ; j<10 ; j++)

{

if( j > 3 ) break; // 가장 안쪽 루프를 중단.

if( i == 2 ) break innerloop; // 가장 안쪽 루프를 중단.

if( i == 4 ) break outputloop; // 바깥쪽 루프를 중단.

document.writeln(“i = “ + i + “, j = “ + j);

}

}

document.writeln(“Final i = ” + i + “, j = “ + j);

continue

■ 문법

continue;

■ 특징

- break문과 유사하지만 루프를 빠져 나오지 않고 새로운 반복을 수행한다.

- while, do/while, for, for/in 루프의 몸체 내부에서 사용.(이 외의 영역에서 사용할 경우 문법 에러 발생.)

■ 레이블과 함께 사용

- continue 키워드 뒤에 레이블 이름이 따라올 수 있다.

continue 레이블 이름;

- continue 키워드와 레이블 이름 사이에 줄바꿈을 허용하지 않는다.

■ 루프문에서의 실행

- while : 루프의 시작 부분에 지정된 표현식을 다시 테스트. 결과가 true이면 루프 몸체 처음부터 다시 실행.

- do/while : 일단 루프의 끝부분까지 건너뛴다. 그리고 루프 조건을 다시 테스트하여 결과가 true이면 루프 몸체 처음

부터 다시 실행.

- for : 증가 표현식을 평가한 후 테스트 표현식을 테스트하여 다음 반복을 수행하지 여부를 판단.

- for/in : 다음 차례의 프로퍼티 이름을 루프 시작에서 지정된 변수에 할당한 후 루프를 다시 수행.

var

■ 정의

- 명시적으로 하나 또는 그 이상의 변수를 선언.

■ 문법

var 이름_1 [ = _1 ] [ ,…, 이름_n [ = _n] ]

■ 특징

- 선언될 변수들이 쉼표로 구분.

- 변수 선언 시 초기값을 지정할 수도 있다.

var i;

var j = 0;

var p, q;

var greeting = “hello” + name;

var x = 2.34, y = Math.cos(0.75), r, theta;

- var문에 의해 생성되는 프로퍼티는 delete 연산자로 삭제될 수 없다.

- 초기값을 지정하지 않으면 초기값은undefined.

- for, for/in 의 일부로 등장할 수 있다.

for( var i=0 ; i<10 ; i++ )

document.writeln(i);

for( var i=0, j=10 ; i<10 ; i++, j--)

document.writeln(i*j);

for( var i in o )

document.writeln(i);

function

■ 정의

- 자바스크립트 함수를 정의.

■ 문법

function 함수 이름([전달인자1 [전달인자2 […, 전달인자n]]])

{

문장

}

□ 함수 이름

- 정의할 함수 이름.

- 식별자여야 한다.

□ 전달인자

- 쉼표로 구분.

- 함수 내부에서 값들을 참조.

□ 함수 내부

- 임의의 문장들로 구성.

- 함수가 정의될 때 실행되는 것이 아닌, 함수 호출로 컴파일되고 실행될 수 있는 형태의 새로운 함수 객체와 연결

되었을 때 실행.

■ 함수 정의

function welcome()

{

alert(“welcome to my blog!”);

}

function print(msg)

{

document.writeln(msg);

}

function hypotenuse(x, y)

{

return Math.sqrt(x*x + y*y);

}

function factorial(n)

{

if( n <= 1 )

return 1;

return n * factorial(n -1);

}

- 자바스크립트의 최상위 단계 코드에 정의하는 것이 보통.

- 다른 함수 정의 속에 중첩시킬 수 있다.

- if, while 기타 문장 속에서는 함수 정의가 위치할 수 없다.

■ 특징

- 함수 정의는 프로그램의 정적인 구조를 나타낸다.

- 자바스크립트 코드가 실행되기 이전의 파싱(parsing)또는 컴파일 단계에서 정의된다.

- 자바스크립트 파서(parser)가 함수 정의를 만나면 함수의 몸체를 이루는 문장들을 파싱하고 저장. (실행하지 않는다.)

- 함수 정의가 실행 시간이 아닌 코드를 파싱할 때 일어난다.

alert(f(4)); // 16. f()가 정의되기 이전에 f()를 호출.

var f = 0; // 프로퍼티 f를 덮어씀.

function f(x)

{

return x * x;

}

alert(f); // 0. 변수f 가 함수 f()를 덮어써버렸다.

return

■ 정의

- 함수에서 반환되는 값을 지정.

■ 문법

return 표현식;

■ 특징

- 함수 몸체 내부에서만 나타날 수 있다. (다른 곳에서 사용될 경우 문법 에러 발생.)

- ‘표현식이 평가되어 그 결과가 함수의 값으로서 반환.

- 함수 몸체에 남은 문장이 있더라도 return 문이 실행되는 시점에서 함수의 실행은 종료.

- 어떤 값을 반환하는데 사용 가능.

function square(x)

{

return x*x;

}

- 값을 반환하지 않고 함수의 실행을 종료할 목적으로 표현식없이 return문만 사용 가능.

function display_object(obj)

{

if( obj == null )

return;

}

throw

■ 정의

- 예외를 발생시키다(throw). 에러나 예외 상황을 알린다.

* 예외

- 예외적인 상황이나 에러가 발생했음을 가리키는 신호.

■ 예외 발생

- 런타임 에러가 일어날 때 마다 에외를 발생시킨다.

- 프로그램에서 throw문을 사용하여 명시적으로 예외를 발생시킨다.

■ 문법

throw 표현식;

■ 특징

- ‘표현식의 결과값은 무엇이든 될 수 있다.

- 대부분 그 타입은 Error 객체 또는 Error의 하위 클래스 중 하나의 인스턴스이다.

- 에러 메시지를 담고 있는 문자열이나 어떤 에러 코드를 나타내는 숫자 값도 유용하다.

function factorial(x)

{

if( x < 0 )

throw new Error(‘x must not be negative’); // 예외를 발생시킨다.

for( var f=1 ; x > 1 ; f*=x, x-- )

…. // 문장 내용

return f;

}

■ 예외처리

- 예외가 발생하면 자바스크립트 인터프리터는 정상적인 프로그램 실행을 즉시 중단하고 가장 가까운 예외 처리기로

넘어간다.

* 예외 처리기

- try/catch/finally 문 중에서 catch절을 사용하여 작성.

- 해당 코드 블록에 예외 처리기가 없을 경우, 인터프리터는 예외 처리기를 찾을 때까지 상위 단계를 감싸고 있는

예외 처리기가 있는지 확인하여 과정을 반복한다.

- 자바스크립트의 언어적인 구조를 따라서, 즉 호출 스택(call stack)을 따라서 예외가 전파되어 간다.

- 아무런 예외처리기를 찾을 수 없을 경우 해당 예외를 에러로 취급하여 사용자에게 보고 한다.

try/catch/finally

■ 정의

- 자바스크립트 예외 처리 기법.

■ 특징

- try절은 그저 처리할 예외가 발생할지도 모를 코드 블록을 정의하는 역할.

- catch절은 try 블록 내부에서 예외가 발생할 경우 호출되는 문장 블록.

- finally 블록은 try 블록에서 일어난 일에 관계없이 항상 실행이 보장되어야 할 뒷정리용 코드가 포함된다.

- catch finally 블록은 생략할 수 있지만 try블록은 catch finally블록 중 하나 이상의 블록과 함께 사용되어야만 한다.

- 해당 절에 단 하나의 문장만 존재하더라도 {} 로 감싸야 한다.

- catch 절에 사용되는 식별자는 예외객체나 값이 할당된다.

■ 문법

try

{

// 정상일 경우 해당 코드블록 수행.

}

catch(e)

{

/*

try 블록에서 예외가 발생할 경우에만 싫행.

지역변수 e를 사용하여 Error 객체 또는 앞에서 던진 다른 값을 참조할 수 있다.

예외를 처리할 수도, 예외를 무시할 수도,

throw를 사용해서 예외를 다시 발생시킬 수도 있다.

*/

}

finally

{

/*

try 블록에서 일어난 일에 관계없이 무조건 실행될 코드가 위치.

try 블록이 어떻게든 종료되면 실행.

try 블록이 종료되는 상황

1) 정상적으로 블록 끝에 도달.

2) break, contiune, return문에 의해

3) 예외가 발생했지만 앞의 catch절에서 처리했을 때

4) 예외가 발생했고 그것이 잡히지 않은 채 퍼져나갈 때

*/

}

■ 예제

- try/catch문에 대한 예제

try

{

var n = prompt(“Please enter a positive integer”, “”);

var f = factorial(n);

alert(n + “!=” + f);

} catch(ex) { // 사용자 입력이 유효하지 않을 경우 수행.

alert(ex);

}

- try/finally문에 대한 예제

var a = new Array(1,3,5,7,9,’sting’,11,13);

var i = 0, total = 0;

while( i < a.length )

{

try

{

if( (typeof a[i] != ‘number’) || isNaN(a[i]) )

continue;

total += a[i];

}

finally

{

i++; // continue를 사용했지만 무조건 i를 증가 시킨다.

}

}

document.writeln(“i = “ + i); // 8

document.writeln(“total = “ + total); // 49

with

■ 정의

- 유효 범위 체인을 임시로 변경하려 할 때 사용.

■ 문법

with (객체)

문장

- 유효 범위 체인의 첫 머리에 객체를 추가.

- 문장을 실행한 다음 유효 범위 체인을 원래의 상태로 되돌려 놓는다.

■ 특징

- 타이핑을 줄일 수 있다.

frames[1].document.forms[0].address.value;

// 아래와 같이 사용할 수 있다.

with(frames[1].document.forms[0])

{

// 폼 엘리먼트에 직접 접근할 수 있다.

name.value = “”;

address.value = “”;

email.value = “”;

}

- with에 의해 추가된 객체는 일시적으로 유효 범위 체인의 일부가 된다.

- with를 사용하는 자바스크립트 코드는 최적화하기가 어렵다.

- with문을 사용하지 않고 작성한 동등한 코드에 비해 느리게 실행될 수 있다.

- with문 내부에서 함수 정의나 변수 초기화를 했다면 비직관적이고 예기치 않은 작동을 불러일으킬 수 있다.

□빈 문장

■ 문법

;

■ 특징

- 빈 문장을 실행하면 아무런 효과도 볼 수 없고 아무것도 실행되지 않는다.

- 몸체가 없는 루프를 생성하려 할 때 유용하게 사용할 수 있다.

for( i=0 ; i<a.length ; a[i++]=0 ); // 배열 a 초기화.

if( ( a == 0 ) || ( b == 0 ) ); // 아무것도 실행되지 않는다.

o = null // 무조건 수행.

- 의도적으로 빈 문장을 사용했을 경우 주석으로 명시.

□자바스크립트 문장 요약

■ 자바스크립트 문장 문법

문장

문법

용도

break

break;

break 레이블;

가장 안쪽의 루프, switch, 또는 레이블로 명명된 문장에서 빠져나온다.

case

case 표현식:

switch문 내부의 문장에 레이블을 붙인다.

continue

continue;

continue 레이블;

가장 안쪽의 루프, 또는 레이블로 명명된 루프를 재시작한다.

default

default:

switch문에서 디폴트 문장에 레이블을 붙인다.

do/while

do

문장

while(표현식);

while루프를 만드는 다른 방법.

무조건 한 번은 수행 한다.

empty

;

아무 일도 하지 않는다.

for

for(초기화; 테스트; 증가)

문장

편리하게 쓸 수 있는 루프.

for/in

for(변수 in 객체)

문장

객체에 속한 프로퍼티들에 대해 루프를 돈다.

function

function 함수이름

([전달인자1 […, 전달인자n]])

{

문장

}

함수를 선언한다.

if/else

if(표현식)

문장1

[else 문장2]

조건부 코드 실행.

label

식별자: 문장

문장식별자라는 이름을 붙인다.

return

return [표현식];

함수를 반환.

또는 함수를 표현식의 값으로 반환.

switch

switch(표현식) {

문장

}

case 또는 default:로 레이블이 붙은 문장들로 다중 분기.

throw

throw 표현식;

예외를 발생시킨다.

try

try {

문장

} catch(식별자) {

문장

} finally {

문장

}

예외를 잡아낸다.

var

var 이름_1 [ = _1]

[ ,…, 이름_n [ = _n]];

변수 선언과 초기화.

while

while(표현식)

문장

기본적인 루프 생성문.

with

with(객체)

문장

유효 범위 체인의 확장.

[출처] 6장. 문장|작성자 외계인셩

list
NO TITLE NAME DATE
6 자바스크립트 완벽가이드 7장 객체와배열 강춘희 2013.01.25
5 자바스크립트 완벽가이드 6장 문장 김대근 2013.01.24
4 자바스크립트 완벽가이드 5장표현식과 연산자 김원석 2013.01.24
3 자바스크립트 완벽가이드 4장 변수 김세라 2013.01.11
2 [자바스크립트 완벽가이드] 3장. 데이터 타입과 값 이승제 2012.12.27
1 과제를 올려주세요 관리자 2012.12.10
 1 
1