달나라 노트

Google Apps Script : Class, 클래스 (객체) 본문

Google Apps Script

Google Apps Script : Class, 클래스 (객체)

CosmosProject 2022. 11. 22. 21:33
728x90
반응형

 

 

 

Google Apps Script는 Javascript를 기반으로 만들어진 언어입니다.

 

따라서 많은 기본적인 문법들이 Javascript와 동일하거나 비슷하죠.

 

이중에서 class에 대해 알아보겠습니다.

 

 

Calss는 쉽게 말하면 어떤 물체에 대한 정보를 담기위한 틀이라고 보시면 됩니다.

흔히 어떤 물체를 예로 들어서 설명하는데 고양이를 예로 들겠습니다.

 

고양이가 어떠한지 설명하려면 무슨 요소가 필요할까요?

고양이의 이름, 나이, 색깔, 몸무게, 고양이의 울음소리 등등 많은 요소들이 있을겁니다.

 

이렇게 고양이를 구성하는 여러 요소들에 대한 정보를 하나로 모아둔게 class입니다.

다만 모든 고양이가 다 똑같은 이름, 나이, 색 등을 가지고 있지는 않죠.

고양이의 이름도 다양할 것이고 나이도 다양하며 색, 몸무게, 울음소리도 다양할 것입니다.

 

이렇게 고양이를 묘사하기 위한 기본적인 정보의 종류를 모아둔 틀이 class이며

이러한 정보를 개개의 고양이마다 각 고양이만의 특성을 할당하여 만든 것을 object(객체)라고 합니다.

 

 

 

이제 class를 어떻게 만들고

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');

  Logger.log(my_cat.name);
  Logger.log(my_cat.age);
  Logger.log(my_cat.weight);
  Logger.log(my_cat.color);
  Logger.log(my_cat.species);
  my_cat.sound();
}



-- Result
Kitty
5.0
4.5
white
mammal
Moew~

 

위 코드가 바로 Cat이라는 class를 생성하고 이 class를 이용해서 my_cat이라는 객체를 만들어 사용하는 예시입니다.

 

부분별로 알아봅시다.

 

 

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~');
  }
}

 

먼저 Cat이라는 class 선언 부분입니다.

 

- class Cat

 

 

 

class Cat {

 

class의 선언은 class class_name 과 같은 형식으로 선언합니다.

여기서는 class이름을 Cat이라고 했습니다.

 

 

 

이제 그 다음 부분입니다.

 

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

 

여기는 constructor라고 적혀있습니다.

이것은 생성자라고도 하는데 class가 호출될 때 가장 처음 실행되는 부분입니다.

 

그러면 이게 왜 필요한걸까요?

 

한번 생각해봅시다.

지금 저는 Cat이라는 class를 생성하고 있습니다.

Cat이라는 class는 고양이를 묘사하기 위해 필요한 정보가 뭐가 있는지를 담고있는 틀입니다.

 

근데 만약에 나중에 Cat class를 이용해서 객체를 만들 때 누군가가 까먹고 몸무게를 까먹었습니다.

weight 정보를 입력하는 것을 까먹었어요.

그러면 고양이 객체에 몸무게 정보가 없을겁니다.

이 세상에 몸무게가 없는 고양이가 있나요?

 

아뇨 없습니다.

 

이렇게 constructor는 class를 이용해서 객체를 생성할 때 가장 먼저 실행되어 특정 고양이를 묘사하기 위한 정보를 받아 그것을 각각의 변수에 저장해주는 역할을 합니다.

 

 

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

 

그래서 위 constructor 부분을 다시 보면 (name, age, weight, color) 라는 parameter 부분이 보일겁니다.

이것의 의미는 Cat class를 호출할 땐 위처럼 총 4개의 parameter를 반드시 적어야 한다는 의미입니다.

순서대로 name, age, weight, color를 의미합니다.

 

그리고 그 아래에 this.name = name; 이런 식으로 적힌 부분이 많습니다.

 

여기서 this.name은 this 키워드가 붙어있습니다.

this라는 키워드가 붙으면 class에 있는 name이라는 속성을 의미합니다.

그리고 그냥 name은 parameter로 받은 name이구요.

 

따라서 this.name = name의 의미는 parameter로 받은 name값을 Cat class의 name 속성에 할당하라는 의미입니다.

 

다른 것도 마찬가지예요.

 

this.species = 'mammal';

그리고 마지막에 보면 이런 부분이 있습니다.

해석해보면 Cat class의 species 속성에 mammal이라는 값을 할당하라는 것입니다.

 

이것은 고양이의 종을 나타내는 속성값입니다.

고양이는 모두 포유류입니다. 어류인 고양이는 없죠.

따라서 이 정보는 변하지 않는 정보이기 때문에 굳이 Cat class를 호출할 때 매번 고양이는 포유류다 라는 정보를 받아올 필요는 없습니다.

변하지 않는 정보이니 그냥 기본값으로 넣어두는 것이죠.

 

이렇게 class의 여러 속성들이 정해집니다.

 

 

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

 

그리고 다음 부분은 위와 같습니다.

마치 함수를 선언하는 것과 비슷한데 맞습니다. 함수예요.

다만 class 내부에 선언된 함수는 주로 method라고 합니다.

 

고양이는 단순히 이름, 나이, 색 등과 같이 자체의 속성값만 가진 것은 아니죠.

뛰기도하고 소리도 냅니다.

이렇게 class에서 어떤 행동(기능)을 나타내는 함수를 method라고 합니다.

 

 

 

 

 

 

 

class의 생성 부분은 다 봤고 이제 메인 함수에서 어떻게 class를 사용하는지를 봐봅시다.

 

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

  Logger.log(my_cat.name);
  Logger.log(my_cat.age);
  Logger.log(my_cat.weight);
  Logger.log(my_cat.color);
  Logger.log(my_cat.species);
  my_cat.sound();
}

 

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

이 부분이 가장 중요합니다.

 

Cat class를 이용해서 my_cat 변수를 객체로 만드는 과정입니다.

 

먼저 Class를 이용하여 어떤 객체를 만들 때에는 new 키워드와 함께 사용해야 합니다.

 

Cat class를 정의할 때 constructor에서 4개의 정보를 parameter로 받는다고 했죠.

그래서 위처럼 Cat() class를 호출할 때 name, age, weight, color 4개의 정보를 전달하는 것입니다.

 

그러면 이렇게 정보가 채워진 채로 my_cat 변수가 cat 객체가 되는 것이죠.

 

이렇게하면 우리가 만든 틀인 Class를 기반으로 생성된 객체가 반환되며 my_cat 변수를 객체로 만들어줍니다.

이 말을 좀 더 고급스럽게 하면 Class를 호출하면 Class를 기반으로 생성된 인스턴스가 반환되며 my_cat을 인스턴스화 한다고 합니다.

객체 = 인스턴스 대략적으로 이렇게 이해하면 됩니다.

 

 

 

코드 아래 부분을 보면 log method를 이용해서 my_cat의 속성값들(name, age, weight, color, species)을 출력하고 있습니다.

 

Kitty
5.0
4.5
white
mammal

 

출력 결과는 위와 같습니다.

 

mammal은 Cat class 내부적으로 기본값으로 설정되어있는 것과 같고,

나머지는 Cat class를 호출하였을 때 parameter로 전달한 값이 모두 잘 출력되는 것을 알 수 있죠.

 

 

- my_cat.sound();

그리고 마지막으로 my_cat의 sound() method를 실행했더니 Cat class에서 설정했던 고양이 울음 소리인 Moew~가 출력되는 것을 알 수 있습니다.

 

 

 

 

 

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');
  Logger.log(my_cat.weight);

  my_cat.weight = 7;
  Logger.log(my_cat.weight);
}


-- Result
4.5
7.0

 

전체적인 코드는 이전과 같습니다.

 

 

- my_cat.weight = 7;

다만 위 부분을 보면 my_cat 객체를 만든 후 my_cat 객체의 weight 속성에 7을 할당하고 있습니다.

이렇게 객체를 한번 생성한 후에도 객체의 속성값은 얼마든지 바꿀 수 있습니다.

 

출력되는 결과를 보면 my_cat.weight을 7로 할당하기 전에는 4.5인데 할당한 후에는 7로 나오는 것이 보이죠.

 

 

 

 

 

 

 

 

 

 

 

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

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

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

  my_cat.sound(add_sound='mew');
}


-- Result
Moew~
Mew

 

위 코드를 봅시다.

위 코드는 sound() method를 약간 수정했습니다.

 

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

 

sound method 생성 부분을 보면 add_sound라는 parameter가 하나 생겼습니다.

즉, method는 일반적인 함수와 사실상 동일하기 때문에 parameter를 받을 수 있습니다.

그리고 add_sound parameter를 log로 출력해주고있죠.

 

 

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

  my_cat.sound(add_sound='Mew');

 

그래서 my_cat 객체를 생성한 후 sound method를 호출할 때 add_sound parameter에 Mew라는 값을 주었습니다.

 

 

Moew~

Mew

그 결과는 위와 같습니다.

원래부터 sound method에서 출력되는 Moew~라는 울음소리 말고도 제가 parameter로 입력한 Mew라는 울음소리도 출력되었네요.

 

지금이야 단순히 class 속 method가 parameter로 받은 값을 출력해주는 것으로 그쳤지만

실제로 사용하다보면 method에 특정 parameter를 받아서 method속에서 연산을 한다던지 등 굉장히 유용하게 사용할 수 있습니다.

 

 

 

 

 

 

728x90
반응형
Comments