본문 바로가기
Javascript

자바스크립트(javascript) 기본 문법

by 램쥐뱅 2016. 7. 21.

1. 원시 타입



숫자


자바스크립트에서 숫자는 정수(123), 실수(12.3), 8진수(0337). 16진수(0X00 또는 0x00)등 다양한 형식으로 표현할수 있지만

모든 숫자는 실수(floating-point value) 값으로 해석된다.


표현 가능한 범위의 수는 최대 ±1.79e+308 에서 최소 ±5e-324 이다.


정수표현 : var n1 = 255;

실수표현 : var n2 = 255.0;

8진수표현 : var n3 = 0377;

16진수 표현 : var n4 = 0xff;

프로그램에 나오는 숫자 리터럴의 표현 방식은 다르지만 변수 nj1,n2,n3,n4 모두 내부적으로는 실수 255를 값으로 갖는다.

리터럴 표현을 만나면 자바스크립트 해석기는 우선 실제 값으로 계산한 다음 변수에 저장한다.


n1,n2,n3,n4의 타입 즉, typeof 연산자의 값은 모두 "number"로 나온다.

typeof n1, typeof n2, typeof n3, typeof n4 -> "number"



자바스크립트의 숫자 타입에는 InfinityNaN이라는 특수한 값이 있다.



Infinity


자바스크립트에는 최대 숫자를 벗어나는 숫자를 표현하기 위해 Infinity라고 하는 값이 정의되어 있다.

실제로 Infinity의 타입의 "number"로 나온다.


typeof Infinity -> "number"


숫자를 0으로 나누는 경우에도 Infinity를 반환한다.


var v = 1/0;

v -> Infinity


자바스크립트에서 지원하는 최솟값을 벗어나는 숫자를 표현하고 싶다면 -Infinity를 사용하면 된다.


var v = -Infinity;

v -> -Infinity

typeof v -> "number"


마찬가지로 자바스크립트는 -Infinity도 "number" 숫자로 인식한다는 것을 알수 있다.


Infinity와의 어떠한 산술 연산도 결과값으로 Infinity가 반환된다.


Infinity * 3 -> Infinity
Infinity - 9999999 -> Infinity



NaN


또한 자바스크립트에는 NaN(Not A Number)라는 특수한 값도 있다. 이 또한 숫자값이다.


typeof NaN -> "number"

var a = NaN;

a -> NaN


숫자가 아닌 값이 산술 연산의 피연산자로 사용되면 연산 결과로 NaN이 반환된다.


var a = 10*"f";

a -> NaN


NaN은 비교 연산에서 이상하게 작동한다.

어떤 숫자와도 비교 연산을 할 수 없을 뿐더러 심지어 자신과도 비교 연산이 되지 않는다.

NaN == NaN -> false


때문에 자바스크립트에서는 어떤 값이 NaN인지 확인할 때 쓰는 isNaN()이라는 함수를 제공한다.

숫자값이 NaN인지 확인하려면 이 함수를 사용해야 한다.


isFinite()라는 함수도 있는데, 이함수는 인자가 NaN, Infinity, -Infinity 이면 false를 반환한다. (표현 가능한 자리의 수인경우는 true)


var v = NaN;

isNaN(v) -> true

isFinite(v) -> false

v = 1;

isFinite(v) -> true



Math


자바스크립트에서는 단순한 산술 연산 외에도 복잡한 수학 연산을 위한 연산자를 하나의 Math 객체에 구현해 놓고 있다.

Math객체에 정의된 연산자에는 다음과 같이 접근 할 수 있다.


var sinx = Math.sin(x);

var pi = Math.PI;    //원주율값

var abs = Math.abs(-7.25); //절댓값 반환

var ceil = Math.ceil(1.4);  //근접한 정수로 올림한 값 반환.


이외에도 여러가지 속성과 메서드가 포함되어있다.



Number


자바스크립트에서는 Number 라는 객체를 제공하는데, Number 은 원시 타입의 숫자를 객체로 만들기위한 래퍼다.

Number 객체를 이용하면 Object에서 정의한 멤버(속성, 메서드)를 사용할수 있고, 거기에 더해 Number에서 추가로 정의한 멤버를 사용할 수 있다.


var o = new Number(15);


var decimal = o.toString() // toString([radix]) 15을 10진수로 출력 -> 15

var binary = o.toString(2) // 2진수로 출력 -> 1111

var octal = o.toString(8); // 8진수로 출력 -> 17

var hex = o.toString(16); // 16진수로 출력 -> f


var primitiveNum = o.valueOf(); // Number 객체가 래핑하고 있는 숫자 반환 -> 115


var min = Number.MIN_VALUE; // 0에 가까운 최솟값(양수)

var max = Number.MAX_VALUE; // 최댓값(양수)

var v1 = Number.NEGATIVE_INFINITY; // -Infinity

var v2 = Number.POSITIVE_INFINITY; // Infinity


Number은 숫자 객체를 생성하는 데 사용되기도 하지만 값을 숫자로 변환하는 데도 사용할 수 있다.


var v1 = new String("9");

Number(v) -> 9


var v2 = "9";

Number(v2) -> 9


var v3 = "구";

Number(v) -> NaN // 숫자가 아닌 값이 인자로 전달되면 반환값은 NaN이 된다



문자열


문자열 객체를 표현하기 위해 String이라는 타입을 자바스크립트에서 제공하고 있지만, 실제로 코드를 작성할 때는 리터럴 표현을 주로 사용한다.


var s = "hello world";

var o = new String("hello world");


new String()으로 반환된 값은 문자열이 아니라 객체다.

new 없이 String()만 사용되면 toString()처럼 값을 문자열로 변환하는 데도 사용될 수 있다.


var v1 = new Date();

String(v1); -> "Thu Jul 21 2016 23:07:18 GMT+0900 (대한민국 표준시)"

var v2 = 1234;

String(v2); -> "1234"


자바스크립트는 문자열을 유니코드 문자로 인식하고, single quotation mark(') 또는 duble quotation mark(")로 둘러싸서 표현한다.

(')로 감싸면 문자열 중간에 (")를 포함시킬수 있고, (")로 감싸면 (')를 포함시킬수 있다.


"3.14"

"name='dalbong2'"

'I\'m happy'

'이 문자열은 \n두 줄로 나타난다'


위와 같이 이스케이프 문자(escape character)를 포함시켜 작성될수 있다.


이스케이프 문자는 모니터, 프린터 같은 주변 기기를 제어하는데 사용하거나, 인용 부호(',") 안에서 표현 될 수 없는 특수한 문자를 표현하는 목적으로 사용될 수 있다.


자바스크립트에서는 문자열을 조작할 수 있게 substring(), toLowerCase(), toUppercase(), replace(), concat() 등 여러 API를 제공한다.



불린


불린(boolean) 값은 참과 거짓 밖에없다.

프로그램에서 표현하려면 true, false를 사용하면 된다. true, false는 불린 리터럴 이다.


Boolean이라는 객체 생성자를 제공하고 있지만 거의 사용되지 않는다.


var b = false; // 거짓값을 리터럴로 표현

var b = new Boolean(); // 거짓값을 갖는 불린 객체


자바스크립트 해석기가 코드를 분석하다가 참과 거짓을 판단해야 하는 코드를 만나면 반드시 true/false 만을 근거로 하지 않는다.

비교문의 평가 결과를 근거로 하기도하고, 다른 결과값을 근거로 불린 값을 평가하기도 한다.

불린 값을 평가하는 규칙은 다음과 같다.


비교결과가 0, null, ""(빈문자열), false, undefined, NaN 이외의 값으로 평가되면 항상 "참"으로 해석된다.



undefined


변수를 선언하면 먼저 undefined 값으로 초기화가 된다.


var v = 1;


위 코드에서 변수 v는 먼저 undefined로 정의되고 코드를 실행하는 런타임 단계에서 다시 1로 초기화 된다.

아직 값을 할당하지 않은 상태에서 해당 변수를 사용하려고 하면 undefined가 반환된다.


undefined는 "값이 할당되지 않음"을 나타내는 특별한 값이다.


함수를 호출할 때 매개변수에 값을 전달하지 않으면 해당 매개변수는 undefined가 된 상태에서 호출된다.

값이 할당되지 않은 변수, 할당되지 않음  함수 매개변수, 그리고 할당되지 않은 객체의 멤버는 undefined로 초기화 된다.


v1; -> ReferenceError: v1 is not defined


var v2;

v2; -> undefined


var obj = {};

obj.p; -> undefined


v1은 아예 정의되지 않은 변수의 값을 출력하려 하고있다. 이런경우에는 에러가 발생한다.

v2는 변수 선언은 했지만 다른 값이 아직 할당되지 않았으므로 자바스크립트에서 자동으로 할당한 undefined가 출력된다.

세번째 예는 객체를 생성해서 속성 p를 추가하는 코드다. 속성 p에는 아직 값을 할당하지 않아 자동으로 할당된 undefined가 출력된다.


만약 undefined가 다른 값으로 변환되어야 한다면 상황에 따라 달라질수 있다.


 변환 타입 

 반환값

 불린

 false 

 숫자

 NaN

 문자열

 "undefined" 


아래와 같은 코드에서는 if 문에서 undefined가 불린값으로 변환된다.


var v1;

if(v1) {

//실행 코드

}


v1값은 undefined이고 불린값을 요구하는 if문의 조건식에서 undefined는 false로 판정된다.



null


null은 객체가 없음을 나타내는 특별한 값이다.

변수를 선언하면 값이 정해지지 않음을 표현하기 위해 자동으로 undefined가 할당되고 이 값을 변경하려면 코드에서 수동으로 값을 할당해야 한다. 즉, null은 코드를 통해 명시적으로 할당하는 값으로서 undefined와는 구분되는 값이다.



null과 undefined 비교


undefined 값은 사실 루트 객체(global object)에 undefined라는 속성으로 정의되어 있다.

이 속성값을 통해 undefined값에 접근하는 것이다. 자바스크립트 객체의 속성이나 메서드는 제거할 수 있다.

누군가가 루트 객체의 속성인 undefined를 제거하거나 다른 값을 할당해 놓으면 문제가 발생할 수 있다.


그러나 null은 자바스크립트의 키워드로 정의되어 있다.

undefined의 이러한 불완전성 탓에 변수를 선언하면 우선 null로 초기화하게 하는 것이 안전한 코딩 습관이다.


null 과 undefined 를 비교 연산(==)하면 같단는 결과가 나온다.


var u;

var n = null;


u == n; -> true

u === n; -> false 


undefined == null의 연산 결과는 참이 된다.

타입까지도 비교하는 "===" 연산자를 이용해 undefined === null 연산을 하면 거짓이 반환된다.





2. 연산자


프로그래밍 언어에는 많은 연산자가 정의되어 있다.

값을 더하고 빼는 등의 산술계산을 하기 위한 산술 연산자와, 두데이터가 같은지 판단하는데 사용되는 비교 연산자,

그리고 and, or을 연산하는 논리 연산자가 있다.


이 절에서는 연산자별로 유의해야 할 사항만을 정리해본다.



증가, 감소 연산자


year = year + 1 -> year ++;


++year, year++ 처럼 전위연산인지 후위 연산인지에 따라 변수값 증가 시점이 다르다.

++year 와같이 전위 연산자로 사용이되면 변수값을 먼저 증가시키고 증가된 값을 연산의 최종값으로 평가한다.

year++ 와같이 후위 연산자로 사용이되면 증가하지 전의 값이 연산에 사용된 다음에 변수의 값이 증가한다.


i = 1;

j = ++;

i; - >2

j; -> 2


i = 1;

j=i++;

i; -> 2

j; -> 1 


감소연산자인 --도 마찬가지로 작용한다.



비교연산자


자바스크립트 비교연산자에는 ==(equal), ===(identical)가 있다.


var b = (1 == "1"); // true


== 연산자는 두 피연산자의 타입이 다른 경우는 타입을 일치시키고 비교하기 때문에 위와같은 결과가 나온다.

즉 숫자1을 문자열로 변환한 다음 비교한다. (자바스크립트 규칙)


1과 "1"을 다르게 판단하고 싶다면 ===연산자를 사용해야 한다.

===연산자는 타입 변환을 하지 않고 타입과 값을 모두 비교한다.

숫자형과 문자열형으로 타입이 다르기 때문에 ===연산자는 false를 반환한다.


== 연산자는 피연산자의 타입이 다르면 타입을 먼저 일치시켜 비교한다.

=== 연산자는 타입 변환을 하지 않는다.



 연산자

 설명 

 예 

 ==

 피연산자의 타입이 서로 다른 경우 비교하기 전에 같은 타입으로 변환한 후 값을 비교한다.

 1=='1'->true

 ===

 피연산자의 타입을 변환하지 않은 상태에서 타입과 값이 모두 같은 경우 true를 반환한다.

 1==='1'->false

 !=

 타입을 변환한 후 피연산자와 값이 같지 않으면 true를 반환 한다 

 1 != '1' -> false

 !== 

 피연산자의 타입을 변환하지 않은 상태에서 값이 같지 않거나 또는 타입이 다르면 true를 반환한다. 

 1 !== '1' ->true



아래와 같이 같이 문자열(또는 숫자, 불린값)과 객체를 비교하면 객체의 값(valueOf())을 비교한다.


var s = "hello";

var o = new object("hello");


s == o -> true


하지만 다음처럼 피연산자가 객체라면 두 객체의 참조값을 비교한다.



var o1 = new String("hello");

var o2 = new String("hello");


o1 == o2 -> false;


==, ===의 피연산자로 객체가 올 경우 두 참조값이 가리키는 메모리의 위치가 같다면 true를 반환한다.


var a = ["1","2","3"];

var b = ["1","2","3"];

a==b; -> false


var a = ["1","2","3"];

var b = [a[0],a[1],a[2]];

a==b; -> false


배열이 리터럴 표현을 사용하고 있지만 다음처럼 생성자를 이용하는 표현으로 변경하면 모두 false인것을 알수 있다.


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

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

a == b; -> false


그 밖에 일부 특수한경우의 비교를 본다면


NaN 값은 어떤 것과 비교해도, 심지어 NaN 자신과 비교해도 false를 반환한다.


NaN == NaN; -> false


그리고 undefinednull을 비교하면 true로 나온다.


undefined == null; -> true



논리 연산자


일반 언어에서는 논리 연산자(||, &&, !)의 양쪽에 모두 불린값을 반환하는 표현만이 올 수 있다.

그리고 결과값 또한 불린값(true/false)이 반환된다.


그러나 자바스크립트에서는 이런 작동 방식이 약간 달라진다.

자바스크립트에서는 객체||객체 와 같은 표현이 가능하다.


obj1 || obj2 연산결과로 반환되는 값은 true, false가 아니라 좌측 또는 우측 피연산자의 최종 평가값이 된다.


OR 연산자 (||)


var reuslt = 좌측 피연산자 || 우측 피연산자.


연산자 ||의 좌측 피연산자를 평가해서 참으로 나오면 우측 피연산자는 평가하지 않고 좌측 피연산자의 최종 평가값반환한다.

즉, 0,"",null,undefined,NaN이 아닌 평가값을 그대로 반환하는 것이다.

반약 좌측 피연산자가 거짓으로 평가되면 우측 피연산자의 최종 평가값을 그대로 반환 한다.


var a = (1+2) || {};


변수 a에는 3이 할당된다.


function validateField(oEvent){

oEvent = oEvent || window.event;

// ...

}


validateField() 함수의 경우, 함수 인자로 넘어오는 oEvent가 null이 아니면 변수 oEvent에 함수 인수 oEvent가 가리키는 참조가 할단된다.

만약 함수 인자인 oEvent가 null인 경우는 우측 피연산자인 window.event가 그대로 반환된다.

만약 window.event도 null이라면 null그대로 반환된다.


결국 validateField() 코드는 다음과 같은 의미로 풀이할 수 있다.


function validateField(oEvent){

if(oEvent == null) oEvent = window.event;

}


AND 연산자 (&&)


var reuslt = 좌측 피연산자 && 우측 피연산자.


연산자 &&의 양쪽의 피연산자가 모두 참으로 평가되는 경우에만 그 결과가 참이 된다.

연산자 || 와 마찬가지로 최종 평가 결과가 참으로 된다고 해서 불린값 true가 반환된다는 것은 아니다.


&&연산자의 경우는 좌측 피연산자의 평가가 거짓으로 되는 경우 우측 피연산자를 평가하지 않고 바로 좌측 값을 반환한다.


var reulst1 = null && true; -> null 할당

var reulst 2 = false && "문자열"; -> false 할당


좌측이 거짓으로 평가됬으므로 좌측값을 그대로 반환하기 때문이다.


좌측값이 참으로 평가되면 우측 피연산자 값을 그대로 반환한다.


var result1 = true && "문자열2";

var result2 = "문자열1" && "문자열2";


위 두경우 모두 &&의 결과 값으로 "문자열2"가 할당된다.

좌측값이 참으로 평가됬기 때문에 경국 우측값을 그대로 반환하기 때문이다.


부정 연산자 (!)


var reuslt = !피연산자


이 연산자는 오른쪽 피연산자를 평가한 결과 값의 반대값을 반환한다.


var var1 = !(a ==c);

var var2 = !"문자열";


a와 c의 값이 같다면 !연산자는 false를 반환한다.

var2에서는 "문자열"은 값이 있는 문자열로서 true로 평가되고 그 반대값인 false가 반환된다.


정리하면 논리 연산자 ||,&&의 경우에는 피연산자 평가값과 연산자의 반환값이 다를 수 있다.

피연ㅅ산자에 대한 평가는 참, 거짓으로 판정되지만 그 평가에 따라 좌측 또는 우측 피연산자 값이 그대로 반환된다.

그러나 !연산자는 피연산자의 평가값이 반대되는 불린값을 반환하기 때문에 객체가 반환될 수는 없고 항상 true/false만 반환 된다.


||,&&의 경우 피연산자의 평가는 true/false로 연산자의 반환값은 좌측 또는 우측 피연산자의 값이 되고

!의 경우 피연산자의 평가도 true/false, 반환값도 true/false가 된다.



3.실행 제어


조건문


조건에 따라 프로그램의 실행 흐름을 제어하는 대표적인 방법으로 if문과 switch 문이 있다.

간단한 조건문인 경우는 ?를 사용하여 삼항연산자를 사용할수도 있다.


if(a>2) console.log("a는 2보다 크다");

else console.log("a는 2보다 작거나 같다");


if(a>2) console.log("a는 2보다 크다");

else if(a==2) console.log("a는 2이다");

else console.log("a는 2보다 작다");


switch(a){

case a>2:  console.log("a는 2보다 크다"); break;

case a == 2: console.log("a는 2이다"); break;

default : console.log("a는 2보다 작다"); break;

}


switch()안에는 주로 변수가 오지만 반환값을 제공하는 어떤 것도 올 수 있다.


이외의 사용은 java언어와 동일하다.


조건 연산자(?)


조건식 ? 식 1: 식2


조건식이 참으로 평가되면 식1이 실행되어 결과 값이 반환되고.

조건식이 거짓으로 평가되면 식2 가 실행되어 결과값이 반환된다.


var age = 16;

var sURL = age > 18 ? (

alert("계속 진행할 수 있습니다.");

, "continue.html";

) : (

alert("나이가 너무 어립니다.");

, "stop.html";

);

location.assign(sURL);


조건식이 반환하는 불린값에 따라 실행할 괄호가 결정되고, 그런 다음 콤마로 분리된 마지막 값이 ? 연산자의 반환값이 된다.


조건 평가 규칙


어떤 함수에서 인자를 받는데, 그 인자는 배열을 받기로 되어 있다.

그래서 함수 내부에서는 그 인자에 아무 값도 할당하지 않은 채 호출하는 경우를 대비해서, 그 인자에 빈 배열을 할당하는 코드를 구현해야 한다고 하자 이때 다음과 같은 코드로 해결 할 수 있다.


function func(a){

a = a || [];

if(a.length == 0){

...

}else {

...

}

}


func();

 

func()를 호출할 때 위처럼 인자 없이 호출하면 a는 undefined로 되어 || 좌측은 false로 평가될 것이고 따라서 우측 표현이 실행되고, 빈 배열 객체를 만드는 배열리터럴의 빈 배열 객체는 true로 평가되고, 그래서 빈 배열 객체가 || 연산 결과로 반환되어 a에 할당 된다.


반복문


for(변수 초기화; 반복 조건문; 변수값 증가){

// 실행코드 블럭

}


자바스크립트에도 for, for/in, while, do/while 같이 기본적으로 반복작업을 해야하는 경우 사용할수 있는 구문이 있다.

특이사항을 정리해 본다면.


for(var i=0; i<10; i++){
    // 실행코드블럭

}


변수 i는 for문안에서만 사용 할수 있을까?

변수의 영역은 함수 단위로 결정이된다. 이것은 다른 언어와의 중요한 차이점이다.

이로 인해 변수 i는 for문 밖에서도 사용할수 있게 된다.


자바스크립트 변수 스코프는 중괄호({})로 결정되는 것이 아니라 함수 단위로 결정된다.


function f(count){

alert(i); -> undefined

for(var i=0; i<count; i++){

};

return i;

}

f(100); -> 100반환


파싱 단계에서 함수 내에 선언된 변수가 함께 정의 된다.

그리고 변수를 검색할 때 {} 단위로 찾는 것이 아니라 함수 단위로 찾는다.

위 코드를 파싱할때 함수 f와 f 내부에서 선언된 변수 i가 정의된다. 이때 i는 undefined로 초기화 된다.

변수 i가 유효한 영역은 for문의 {}코드 블록이 아니라 함수 f 내부의 전체 영역이다.


자바스크립트 프로그램은 파싱 단계와 실행 단계를 거친다. 파싱 단계에서 함수 단위로 변수가 정의 된다.


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


위가 같은 for문의 실행코드블록은 없다. 단지 for문만 존재한다.

하지만 변수값 증가 부분에서 a[i]에 0을 할당하고 i를 1만큼 증가시킨다. 위와같이 초기화 작업도 가능 하다.


for/in 문


for (변수 in 객체){

//실행코드블럭

}


구문에 있는 변수에는 var를 이용한 변수 선언이 들어갈 수 있다.

구문의 객체에는 객체 또는 배열이 올 수 있다.


객체가 오는 경우는 다음과 같이 쓸수 있다.


var myObj = {p1:"a", p2:"b"};

for (var prop in myObj){

console.log("속성명:"+prop+" 값 : "+myObj[prop]);

}


myObj[prop] 부분을 보면 객체의 속성값에 접근하는데 []를 이용한다.

흔히 알고 있는 객체 접근 연산자는 도트(.)다. 그러나 []로도 접근할 수 있다는 것은 객체의 멤버 관리구조를 일고 나면 어렵지 않게 이해할수있다.


한가지 기억해야 할 것은 for/in문으로는 사용자가 정의한 속성에만 접근할 수 있다는 것이다.

Object 객체에 원래 정의되어 있는 속성에는 접근할 수 없다.


배열이 오는 경우는 다음과 같이 쓸수 있다.


var arr = ["a", "b"];

for (var index in arr){

console.log("인덱스:"+index+" 값 : "+arr[index]);

}


배열 객체가 in 뒤에 오면 배열 요소의 인덱스 값이 연수 index에 할당된다.


var myObj = {p1:"a", p2:"b"};

var arr = [];

var i = 0;

for(arr[i++] in myObj);

console.log(arr); -> ["p1", "p2"]


위 for 문은 객체 myObj의 속성명을 배열 arrr에 할당하는 일을 한다.


while, do/while


while과 do/while에서는 특이한 점은 없다.


var i = 0;

while(i<10){

i++;

}


i=0;

do{

i++;

}while(i<10);


while문은 조건식이 먼저나온다. 조건식에 따라서는 실행문이 한 번도 실행되지 않을수 있다.

do/while문은 조건식이 뒤에나와 실행문은 무조건 한번이상 실행된다.

do/while은 세미콜론(;)으로 끝이 난다. while 문처럼 중괄호를 사용하면 코드가 언제 끝날지 알수있지만 do문은 조건식으로 끝나기 때문에 세미콜론(;)을 사용해 코드의 끝을 알려줘야되기 때문이다.


예외 처리

try/catch/finally


다른 프로그래밍 언어에서 처럼 자바스크립트에서도 프로그램에서 예외가 발생하는 경우 try/catch 문을 사용해 예외처리를 지원한다.


try{

//실행코드

}catch(err){

//예외 처리

}finally{

//try 블록에서 예외가 발생하든 하지않든 항상 실행되는 코드.

}


try 코드 블록 내부에서 예외가 발생하면 언제든지 catch 문의 코드가 호출된다.

그리고 finally블록의 코드는 예외가 발생 하든 하지않든 항상 실행된다. try블록에서 return 문이 사용되더라도 finally 코드 블록은 반드시 실행된다.


catch문과 finally 문이 반드시 있어야 하는 것은 아니다. 그래서 try/finally처럼 catch 문을 업애고 사용할 수도 있고 try/catch 처럼 finally 없이도 사용할 수 있다.


Error 객체


catch 블록이 호출될 때는 try 블록에서 발생한 예외에 대한 정보를 가지고 있는 Error 객체를 만들어 인자로 넘겨준다.


 멤버 

 설명 

 message

 사람이 읽을 수 있는 예외에 대항 상세 내용을 담고 있다. 

 name

 예외 타입을 나타내는 문자열을 가지고 있다. name 값은 생성자(예외 타입)의 이름과 동일한 문자열을 반환한다.

 Error 객체의 name 은 "Error"를 반환한다.

 예외 객체의 최상위 부모는 Error 인데, 그것을 상속 받는 모든 예외 객체는 이 속성을 상속해 그 생성자와 동일한 이름의  문자열을 name을 통해 반환한다.

 toString

 표준에서는 Error 객체에 대한 toString 메서드를 정의하고 있지만 스크립트 언어에서 반드시 구현할 필요는 없다.

 예외에 대한 정보를 알고 싶다면 messagem name을 참고한다.


throw 문


때로는 특정 조건이 만족되면 코드에서 직접 예외를 발생시키고 싶은 경우도 있다.

이런 경우 throw를 사용해서 예외를 발생시킬수 있다.


thorw 예외객체


"예외객체" 자리에는 Error 또는 그 자식 객체가 올 수도 있지만,

예외를 나타내는 문자열 또는 예외 코드를 나타내는 숫자가 올 수도 있다.


try{

.....

throw new Error("예외가 밸생했습니다.");

throw "예외가 발생했습니다.";

throw 4;

}catch(e){

console.log(e);

console.log(e.message);

}













참고.


자바스크립트 객체지향 프로그래밍.

댓글