달나라 노트

Google Apps Script : prototype, prototype method 본문

Google Apps Script

Google Apps Script : prototype, prototype method

CosmosProject 2022. 11. 28. 23:12
728x90
반응형

 

 

 

Prototype method라는 것에 대해 알아봅시다.

 

Class를 생성한 후 이 Class를 어떠한 변수에 할당해서 해당 변수를 객체(인스턴스)로 만듭니다.

이것을 인스턴스화(=객체화)라고 하죠.

 

Class에는 여러 속성이 있을 것이고 method도 있을 것입니다.

인스턴스화 과정에서 Class에 있는 모든 정보는 객체화가 될 대상 변수로 복사되죠.

 

 

class Cat {
  constructor(name, age, weight, color) {
    this.name = name;
    this.age = age;
    this.weight = weight;
    this.color = color;
    this.species = 'mammal';
  }

  sound() {
    Logger.log('Moew~');
  }
}

function myFunction(){
  var my_cat = new Cat(name='Kitty', age=5, weight=4.5, color='white');

  my_cat.sound();
}

 

위 코드를 봅시다.

Cat이라는 이름의 class를 만들고 Cat class를 이용해서 my_cat 변수를 인스턴스화 시키고 있습니다.

 

그러면 Cat class에 있던 name, age, weight, color, species와 같은 모든 속성들이 복사됩니다.

그리고 각 속성들은 인스턴스화할 때 parameter로 주어진 값들(Kitty, 5, 4.5, white 등)을 가지게 되겠죠.

 

이렇게 Class에 있는 속성들이 인스턴스화 과정에서 어떠한 변수에 그대로 복사됩니다.

이렇게 어떤 데이터가 복사된다는 것은 그만큼 더 많은 메모리를 사용한다는 의미이죠.

 

근데 sound()라는 method는 어떨까요?

 

class에 있는 모든 속성들은 각 객체마다 각각의 값을 가질 수 있도록 복사됩니다.

method도 동일할까요?

 

Cat class에서 name, age, weight, color 등의 속성들은 객체를 만들 때 parameter로 어떤 값을 전달하냐에 따라 달라질 수 있습니다.

이 세상에 모든 고양이가 같은 이름, 나이, 몸무게 , 색상을 가질 수는 없죠.

따라서 동일한 class를 이용하여 객체를 여러 번 생성한다고 해도, 일반적인 경우에는 속성들은 각 객체마다 다른 값을 가지고 있습니다.

그래서 객체마다 각각의 속성정보를 복사해서 따로 가지고 있는 것이 맞습니다.

 

 

 

지금까지의 내용을 그림으로 표현하자면 위와 같습니다.

 

class에 있는 여러 속성(attribute)들과 method의 정보를 object에 그대로 복사하는 과정입니다.

 

 

 

 

하지만 class를 사용하다보면 sound() 같은 method는 사실 객체마다 그 기능이 달라지지 않는 경우가 대부분입니다.

따라서 method 정보까지 모두 각각의 객체에 일일이 복사해두는 것은 그만큼 메모리 낭비인 것이죠.

 

Google Apps Script는 prototype이라는 개념을 가지고있습니다.

모든 class는 prototype 속성이라는 특수한 속성을 가지고 있는데 class가 가진 method를 이 prototype 속성에 포함시키면 이 method는 객체에 직접적으로 복사되지 않습니다.

 

class에 있는 method는 class에만 존재하고 객체에는 존재하지 않습니다. 따라서 객체는 method 정보가 없으니 메모리를 절약할 수 있죠.

근데 그렇다고 객체에서 method를 사용할 수 없으면 안되겠죠?

따라서 객체에서 method를 호출할 때 마다 원본 class로부터 그 method의 정보를 불러와 실행시킵니다.

객체에서 method를 호출할 때 마다 class에 있는 prototype method를 불러오는 것이죠.

 

 

 

이를 그림으로 나타내면 위와 같습니다.

 

보시면 Object1, Object2에는 method를 나타내는 사각형이 비어있습니다.

즉, object(객체)에는 method정보가 없는 것입니다.

 

그러나 만약 obejct1, object2에서 sound() method를 호출할 때에는 원본 Class의 sound() method를 참조해서 호출하는 방식이죠.

여기서 원본 class에 있는 method를 prototype method라고 합니다.

 

 

이 과정을 실제 코드에서 알아봅시다.

 

 

class Cat {
  constructor(name, age, weight, color) {
    this.name = name;
    this.age = age;
    this.weight = weight;
    this.color = color;
    this.species = 'mammal';
  }

  sound() {
    Logger.log('Moew~');
  }
}

function myFunction(){
  var my_cat = new Cat(name='Kitty', age=5, weight=4.5, color='white');

  my_cat.sound();
}

 

위 코드를 그대로 GAS editor에 복사해서 아래 이미지처럼 18행에 break point를 설정합니다.

그리고 디버그 버튼을 눌러봅시다.

 

 

그러면 위 이미지의 오른쪽 처럼 디버그 로그가 나올 것입니다.

여기서는 코드에 존재하는 여러 class나 객체들의 정보도 볼 수 있습니다.

 

일단 보면 Local -> my_cat을 보면 my_cat 객체에 대한 정보입니다.

my_cat 객체에 대한 정보를 보면 name, age, weight, color, species라는 속성들은 있는데 sounc() method는 없습니다.

 

그리고 그 아래에 Cat 이라는 부분도 있죠. Cat class의 정보를 나타내주는 곳입니다.

여길 보면 sound()라는 function이 있죠.

이것이 바로 sound method입니다.

 

이렇게 Cat class에는 sound() method가 있으면서 my_cat 객체에는 sound method가 없는 것을 알 수 있죠.

prototype이 실제 적용된 것을 확인한 것입니다.

 

my_cat 객체는 자기 자신이 sound method에 대한 정보를 가지고 있지는 않지만

my_cat이 sound method를 호출할 때에는 원본 Cat class에 있는 sound method를 참조하여 호출하는 것입니다.

 

 

 

 

 

 

728x90
반응형
Comments