[번역] 자바스크립트 클래스를 정의하는 3가지 방법 (3 ways to define a JavaScript class)

이 글은 Stoyan Stefanov 의 글 3 ways to define a JavaScript class 을 번역한 것입니다.
(http://www.phpied.com/3-ways-to-define-a-javascript-class/

자바스크립트 클래스를 정의하는 3가지 방법 

 

소개


자바스크립트는 문법측면에서 아주 유연한 객체지향 언어이다. 이 글에서 객체를 정의하고 생성하는 3가지 방법을 찾을 수 있다. 이미 자주쓰는 방법이 있다 하더라도 다른사람들이 작성한 다른 방법들을 이해하는데 도움이 될것이다.
먼저 자바스크립트에는 클래스라는 개념이 없다는것을 알고 있어야한다. 함수는 클래스를 흉내내기 위하여 사용될 수 있지만 일반적으로 자바스크립트는 클래스가 없는 언어이다.
자바스크립트에서 모든것은 객체이다. 그리고 상속은 객체가 객체로 부터 상속을 받지, 다른 클래스가 있는 언어들처럼 클래스가 클래스로부터 상속받지 않는다.
 

1. 함수 이용하기


가장 많은 쓰는 방법중 하나다. 평범한 자바스크립트 함수를 만든 다음 new 키워드로 객체를 생성하면 된다. 함수를 이용하여 생성한 객체의 속성값과 메소드를 정의하기 위해서는 아래 예제와 같이 this 키워드를 사용하면 된다. 

function Apple (type) {
    this.type = type;
    this.color = "red";
    this.getInfo = getAppleInfo;
}

// 안좋은 방법! 아래 계속 읽어보세요.
function getAppleInfo() {
    return this.color + ' ' + this.type + ' apple';
}

Apple 생성자함수를 사용하여 객체를 생성하기 위해서는 다음과 같이 속성에 값을 입력하고 메소드를 호출하면 된다.

var apple = new Apple('macintosh');
apple.color = "reddish";
alert(apple.getInfo());


1.1. 내부에 메소드 정의하기


위 예제를 보면 Apple 클래스의 getInfo() 메소드가 별개의 함수인 getAppleInfo() 에 정의되어 있다. 이렇게 해도 되긴 하지만 한가지 단점이 있다 - 이렇게 정의된 많은  함수들은 전역 네임스페이스에 정의되고 만다. 이렇게 되면 사용하는 다른 라이브러리나 동일한 함수이름을 사용해야된다면 함수이름이 충돌될 수 있게 된다.  무분별한 전역 네임스페이스의 사용을 막기 위해, 아래 같이 메소드를 생성자함수안에 정의할 수 있다.

function Apple (type) {
    this.type = type;
    this.color = "red";
    this.getInfo = function() {
        return this.color + ' ' + this.type + ' apple';
    };
}

이렇게 바꾸어도 위에서 같이 객체를 생성하고 속성값과 메소드를 사용하면 된다.

1.2. prototype에 메소드 추가하기


1.1의 단점은 새로운 객체를 생성할때마다 getInfo() 메소드가 매번 재생성된다는것이다. 가끔 그것을 원할수는 있지만, 거의 드물다. 더 좋은방법은 생성자 함수의 프로토타입에 getInfo() 를 추가하는것이다.

function Apple (type) {
    this.type = type;
    this.color = "red";
}

Apple.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' apple';
};

다시 1. 과 1.1. 과 같은 방법으로 새 객체를 사용하면 된다.

2. 객체 리터럴(literal) 사용하기


리터럴(literal) 은 자바스크립트에서 객체와 배열을 정의하는 간단한 방법이다. 빈 객체를 생성하려면 아래 같이 할 수 있다.

var o = {};

아래과 같은 보통의 방법 대신 위와 같이 하면 된다.

var o = new Object();

배열은 다음같이 할 수 있다.

var a = [];

아래같이 하는 대신 위와 같이 하면 된다.

var a = new Array();


보통의 클래스를 생성하기 위한 작업들을 하지 않고 바로 객체를 생성할 수 있다.
이번에는 앞의 예제들과 동일한 기능을 하지만 객체 리터럴을 이용해보면:
 

var apple = {
    type: "macintosh",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' apple';
    }
};

이 경우, 클래스의 인스턴스를 생성할 필요가 없다, 이미 생성되어 있다. 그러므로 생성된 인스턴스를 바로 사용하면 된다.

apple.color = "reddish";
alert(apple.getInfo());

이런 객체를 싱글튼(singleton) 이라고 부르기도 한다. 자바와 같이 클래스가 있는 언어에서 싱글튼(singleton)같이 싱글튼은 언제나 하나의 클래스 인스턴스만을 가질 수 있다, 동일한 클래스의 객체를 더 생성할 수 없다. 자바스크립트는 모든 객체가 처음부터 싱글튼이기때문에 자바스크립트(클래스가 존재하지 않는다. 기억들 나시죠?)에서 이 개념은 더 이상 의미가 없다.

3. 함수를 이용한 싱글튼


또 싱글튼 얘기? ^^
세번째 방법은 위에 다른 두가지 방법의 조합이다. 우선 싱글튼을 정의하기 위하여 함수를 사용한다. 문법은 아래와 같다.
 
var apple = new function() {
    this.type = "macintosh";
    this.color = "red";
    this.getInfo = function () {
        return this.color + ' ' + this.type + ' apple';
    };
};

위의 1.1. 과 아주 비슷하지만, 객체를 사용하는 방법은 2. 와 똑같다.

apple.color = "reddish";
alert(apple.getInfo());

new function(){...} 구문은 2가지를 동시에 한다: 함수(익명 생성자 함수)를 정의하고 new 로 작동(invoke)시킨다. 이렇게 써본적이 없으면 다소 복잡해 보일수 있고, 그렇게 많이 쓰이지도 않는다, 그래도 한번만 사용하거나 이름짓기 어려운 생성자함수가 꼭 필요할때 사용할수 있는 방법이다.


요약


자바스크립트에서 객체를 생성하는 3가지(한가지 더) 방법을 정리해보았다. (이 글의 제목에도 불구하고) 자바스크립트에는 클래스같은것은 없다는것을 기억하기 바란다. 새로운 지식을 이용해 코딩을 시작하길 기대하고 있나요? 즐겁게 자바스크립트 코딩하세요.

참고자료

댓글 6개

(1)
어떤 방법이 좋을까요?
전 2번 object literal 만 사용하는데. 
방법별로 성능차이도 있으려나.. 
(2)
  • 2014-03-25 화 11:17:01 (3 년전)
  • 미드나잇
전 객체의 쓰임에 맞게 작성합니다. 
요즘엔 두개를 섞어서 자주 써요. 
ex)
function Point (){
 this.x = 0;
 this.y = 0;
}

Point.prototype = {
    setPoint : function(x, y){
       this.x = x;
       this.y = y;
    }
    movePoint : function(x, y){
       this.x += x;
       this.y += y;
    }
}

이런식으로 쓰면 객체처럼 생성할 수 있으니 싱글톤보단 나은것 같습니다. 
 
(3)
  • 2015-05-12 화 13:15:27 (2 년전)
  • t
a<>
(4)
  • 2016-01-20 수 09:27:01 (2 년전)
  • 김도원

좋은 글이라 저의 개인블로그에 스크랩하려고 합니다.

혹시 문제가 되신다면 바로 삭제하도록 하겠습니다. 
(5)
  • 2017-02-14 화 10:58:22 (2 주전)
  • 나그네
좋은 글 감사합니다.
(6)
  • 2017-02-17 금 12:59:52 (2 주전)
  • 느루
자바스크립트 완벽 가이드 객체 생성하기 부분을 보다가 객체를 생성하기전에 함수를 선언해야 한다는 문장이 나오는데
그게 무슨 말인지 이해가 안가서 찾다가 여기로 들어오게 되었어요.

책에서는 함수 만드는 부분은 생략이 되어 이해가 안되었는데 여기 덕분에 그게 무슨 말인지 알게되었네요.

감사합니다. 

댓글쓰기

관련 post

L

[번역] 자바스크립트 프로그래밍 언어에 대한 연구 (Douglas Crockford 의 A Survey of the JavaScript Programming Language)

Q

자바스크립트로 문자열에서 html 태그 제거하기

K

자바스크립트 쿠키 클래스

K

javascript 로 codeigniter uri->segment() 함수 구현하기