ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Instantiation Patterns (인스턴스화 패턴)
    concept/javascript 2020. 5. 8. 19:38

     

     

    ES6 에서는 Class 라는 생성자 함수가 생겨서 instance를 쉽게 만들 수 있다.

    하지만 ES6가 나오기 전 까지는 어떻게 instance를 만들었을까?

    그런거 알 필요 없고 그냥 Class 쓰면 되지 않아? 라고 생각할지도 모르겠지만

    이 과정에 대해서 더 자세히 공부하면 응용이 더 쉬워지겠지?

     

    그런데 Class가 무엇이냐.

    Class의 개념을 먼저 짚고 가려고 한다.

    Class는 하나의 정형화된 모델을 만들어 두고 그 모델을 기반으로 복제품을 만들기 위해 사용하는 것이다.

    즉, 옛날에는 책을 하나 만들기 위해 일일히 다 손으로 썼어야 했다면 금속활자가 만들어진 후 다량의 책을 빠른 시간에 찍어낸 세기의 발명과도 같은 것!

    여기서 Class는 금속활자인 것이다.

     

    자세한 포스팅은 2020/04/02 - [concept/javascript] - 객체 지향 JavaScript (Class) 참고

     

    이걸 프로그래밍적으로 다시 생각해보자면, 찍어내는 기능은 함수를 통해서 구현할 수 있다고 이해하면 되겠다.

     

     

    ES6 이전에는 바로 이 4가지 방식으로 instance를 만들었다.

    1. Functional
    2. Functional Shared
    3. Prototypal
    4. Pseudoclassical

     

    1. Functional

    let 원본_훈민정음 = function(){
        let 배포용_훈민정음 = {};
        배포용_훈민정음.content = '나랏말싸미듕귁에달아'; //property : 속성
    	배포용_훈민정음.책주인이름 = function(이름){ //method : 기능
        	this.이름 = 이름
        }
        return 배포용_훈민정음;
    }
    
    let 훈민정음1 = 원본_훈민정음(); //{content: "나랏말싸미듕귁에달아"}
    let 훈민정음2 = 원본_훈민정음(); //{content: "나랏말싸미듕귁에달아"}
    훈민정음1.책주인이름('권오연'); //{content: "나랏말싸미듕귁에달아", 이름: "권오연"}

     

    2. Functional shared

    extend의 활용! (functional shared)

    이 때 property function과 method function을 따로 만들고 extend를 활용해서 functional shared를 하면 메모리 효율이 조금 더 좋아진다!

    왜냐면 위의 방식대로 하면 각각의 instance(훈민정음1, 2)들이 property와 method를 가지고 있게 되는데,

    extend를 쓰면 property function과 method function의 메모리 주소만을 참조하기 때문이다.

     

    코드로 본다면

     

     

    extend 예시

     

    3. Prototypal

    functional share에서 빈 객체를 

    Object.create(기능함수);

    로 바꿔주면 된다.

     

     

    4. Pseudoclassical

    먼저 코드를 작성하고 메소드는 프로토타입으로 만들어준다.

    let Car = function(position){
    	this.position = position;
    }
    
    Car.prototype.move = function() {
    	this.position += 1;
    };
    
    let car1 = new Car(5);
    let car2 = new Car(10);

    찍어낼 때는 new operator를 붙여주면 끝!

     

    요게 ES6 Class 방법과 정확하게 동일한 원리~!

    댓글

Designed by Tistory.