이상학의 개발블로그

[JavaScript] 내장 타입 인스턴스화 본문

JavaScript

[JavaScript] 내장 타입 인스턴스화

학학이 2016. 7. 26. 23:20

Introduction

자바스크립트는 new Object() 를 이용해 일반 객체를 생성하고 객체를 다룬다.
자바스크립트에는 Object 타입 외에 언어에서 제공하는 내장 참조 타입이 있다.

내장 타입

  • Array : 인덱스로 접근할 수 있는 목록, 배열
  • Date : 날짜와 시간
  • Error : 에러 객체 ( 에러 종류에 따라 하위 타입이 존재한다. )
  • Function : 함수
  • Object :  일반 객체
  • RegExp : 정규식
내장 참조 타입은 일반 객체와 같이 new 를 이용해 인스턴스화 한다.

1
2
3
4
5
6
var item = new Array();
var now = new Date();
var error = new Error("에러발생");
var func = new Function( "console.log('hi'); ");
var obj = new Object();
var reg = new RegExp("\\d+"); // 한개 이상의 숫자로만 구성된 문자열, one or more digits
cs

객체 및 배열 리터럴

객체는 중괄호 안에 새로 만들 객체의 프로퍼티를 정의하는 객체 리터럴로 만들수 있다.
Json 처럼 key, value 의 조합이다. 이름 : 값 으로 구성되며 쉼표로 프로퍼티를 구분한다.
1
2
3
4
var person = {
    name : "학학이",
    age : 26
}
cs

간혹 이름에 공백이나 대쉬(-)를 넣는 경우는 key 인 이름을 문자열인 따옴표로 묶어주면 특수문자를 사용할 수 있다.
1
2
3
4
var person = {
    "my name" : "학학이",
    "now-age" : 26
}
cs

객체를 리터럴로 생성하지 않고 new를 이용해 만드려면 다음과 같이한다.
1
2
3
var person = new Object();
person.name = "학학이";
person.age = 26;
cs

객체 리터럴을 이용하면 new Object()를 호출하지 않는다. 실제로 생성자를 호출하지 않지만 new를 한것과 동일한 단계를 수행해서 객체를 생성한다.
따라서 개인의 취향에 맞게 객체를 생성하면 된다.


배열 리터럴도 객체와 비슷하게 사용한다.
1
2
3
4
5
// new 사용
var lang = new Array("C""Java""JS");
 
// 배열 리터럴 사용
var lang2 = ["C""Java""JS");
cs

개인적으로 new를 사용하지 않고 리터럴을 사용한다. new를 입력하는것도 귀찮다.


함수 및 정규식 리터럴

함수는 보통 리터럴을 사용해 정의한다. Function 생성자를 통해 함수를 선언하면 보기 힘들고 유지보수에도 안 좋다.
1
2
3
4
5
6
7
// 함수 리터럴
function go(val){
    return val;
}
 
// 함수 생성자
var go2 = new Function("val""return val;");
cs

함수 생성자를 통한 함수 선언은 보이게도 힘들고 함수 내용을 변경할때도 힘들다.


자바스크립트 정규식은 new RegExp 생성자를 생성하지 않고 정규식 리터럴을 사용할 수 있다.
1
2
3
4
5
// 정규식 리터럴
var onlyNumber = /\d+/g;
 
// 정규식 생성자
var onlyNumber2 = new RegExp("\\d+""g");
cs

리터럴 표현식과 생성자의 문자열 패턴이 다른 이유는 RegExp를 사용하면 정규식 패턴을 인수로 전달해야하기 때문에 백슬래시도 이스케이프 해야한다.

그래서 리터럴은 \d만 사용하지만 생성자는 \\d로 백슬래시도 명시적으로 이스케이핑 해준다.


Conclusion

자바스크립트는 언어 자체가 갖고 있는 내장 참조 타입이 있다

다른 언어들과 비슷하게 배열, 객체, 함수 등이 있고 기본적으로 new 연산자를 통해서 내장 타입을 인스턴스로 만들 있다.

이러한 내장 타입은 new 연산자 말고 리터럴 이용해 인스턴스 할수 있으며, new 내부적으로 같은 로직을 수행한다.

리터럴 or 생성자의 사용은 개인의 선택이지만 Function 타입은 유지보수를 위해 리터럴을 사용할 것을 권한다.

아마 Function new 통해 인스턴스화하는 코드는 정말 찾기 힘들것이다.



Comments