[딥다이브] 17, 18장 스터디 후기

Haz·2022년 2월 27일
0
post-thumbnail

17장 생성자 함수에 의한 객체 생성

17.1 Object 생성자 함수

객체를 생성하는 방법 중 생성자 함수를 통해 객체를 만드는 방법을 공부했다. 이제껏 JSON방식으로만 객체를 생성해온 나로서는 객체의 세계에 한 발 더 내딛었다는 걸 알 수 있었다.

// 객체 생성자 함수를 호출하면 빈 객체를 생성하여 반환한다.
const person = new Object();

// 프로퍼티 추가
person.name = "Kwon";
person.favoriteBrand = "Starbucks";

console.log(person); 

아주 간단한 방식으로 객체를 만들 수 있었다. 다만 생성자 함수로 객체를 생성했을 때는 일일이 프로퍼티를 추가해야한다는 번거로움이 있었다.
이에 더해 늘 '인스턴스'가 뭔지 궁금했는데, 한 페이지를 넘겨보니 이에 대한 정의가 있었다. 생성자 함수에 의해 생성된 객체가 바로 인스턴스였다. 그냥 객체랑 동의어라고 봐도 될 것 같다.

17.2 생성자 함수

객체리터럴, 즉 JSON 방식으로 객체를 만들게 되면 여러 개의 객체에서 같은 메소드나 프로퍼티가 필요할 때 계속 동일한 부분이 반복되어 메모리 낭비, 코드 낭비인 면이 있다는 것은 알고 있었다. 그러나 어떤 방법으로 이를 해결할 수 있는지 몰라 반복적으로 사용하고 있었다. 딥다이브에서는 이 문제의 해결방식으로 생성자 함수를 호출하는 방법을 제안했다.

function Circle(radius) {
  this.radius = radius;
  this.getDiameter = function() {
  	return 2 * this.radius;
  };
}

// 인스턴스의 생성
const circle1 = new Circle(5);
const circle2 = new Circle(10);

위의 예시처럼 함수를 선언하고 함수 내부에 지름을 구하는 메소드를 생성한다. 자바처럼 클래스 기반 객체지향이 아니기 때문에 일반 함수와 동일한 방법으로 생성할 수 있다는 점이 편리했다. 하지만 함수의 결과를 반환하는 반환문이 없어서 저 상태로는 일반 함수로 활용할 수 없기 때문에 사용할 때 주의가 필요하다는 점을 늘 기억해야겠다.
자바스크립트가 인스턴스를 암묵적으로 처리해 반환한다는 점(상단 예시에서는 this.radius 같은 것)은 이제 놀랍지도 않다. 자바스크립트가 스스로 하지 않는 게 오히려 더 놀라울 것이다.

생성자 함수 꼭지에서 흥미로웠던 부분은 new.target 에 대한 설명이었다. constructor에서 this와 유사한 역할을 맡는 "메타 프로퍼티"라니! new 연산자와 함께 생성자 함수에서 호출되면 함수 내부의 new.target이 함수 자신을 가리킬 수 있다면 활용성이 무궁무진할 것 같았다. 아직 이와 관련된 코딩은 해본 적 없지만 예제를 찾아보고 활용법을 더 공부해야겠다.

18장 함수와 일급객체

가장 기다렸던 챕터다. 책의 거의 첫 부분부터 "함수는 일급객체"라는 이야기가 잊어버릴만 하면 등장했다. 그래놓고 뒤에 가서 공부할 테니 넘어가라는데 궁금해서 미치는 줄 알았다. 이 챕터에서 가장 공부가 된 부분은 arguments와 관련된 부분이었다.

18.1 일급객체

우선 일급객체의 조건부터 알아보자.

  1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
  2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  3. 함수의 매개변수에 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.

자바스크립트의 함수는 이를 모두 충족한다고 한다(조건 자체에 함수라는 단어가 들어가는데 복문 같기도 하고). 책에 있는 예시를 같이 디버깅해보며 조건들을 이해할 수 있었다. 그냥 그렇구나, 하고 넘어가면 될 것 같다.

18.2 함수 객체의 프로퍼티

함수도 객체이기 때문에 당연히 프로퍼티를 갖고, 이 꼭지에서 바로 arguments에 대한 내용이 나온다. 회사 프로젝트에 가끔 함수의 매개변수로 "argument", "arg"를 사용한 함수들이 있는데 도대체 저 매개변수가 어떤 작용을 하는지 이해할 수가 없어 이 부분을 특히 정독했다.

그리고 너무나 단순해서 헛웃음이 절로 나지 뭔가. arguments는 그 자체로도 객체고, 함수를 호출할 때 전달된 인수들의 정보를 담는 순회 가능한 유사 배열 객체다. 순회가 가능하다는 이야기는 for문을 이용해 객체 안에 있는 값들을 참조할 수 있다는 것이다. 그래서 내가 인수값을 하나의 함수에서 여러 개 받았을 경우 콘솔 창에서, 혹은 함수 내부에서 arguments 객체를 사용해 각 인수를 조건으로 걸어줄 수 있게 된다. 이런 성격 때문에 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하다고 한다.

매개변수와 인자의 차이는 아직도 이해가 잘 안되서 이 글에서 혼용했지만, 언젠가 그 차이를 깨닫게 되는 날 고치도록 하겠다. 잘 이해한 사람이 있다면 댓글로 친절한 설명 혹은 URL 부탁한다.

이렇게 또 한 주의 스터디가 흘러갔다. 다다음주까지 하게 되면 이제 책의 1/3을 끝마치게 된다!!! 작년 말부터 지금까지 신입으로 취업해서 정신 없는 와중에도 쉬지 않고 꾸준히 스터디를 진행하고 있는 나 자신이 대견하다😁

profile
나도 재밌고, 남들도 재밌는 서비스 만들어보고 싶다😎

0개의 댓글