holdanddeepdive/javascript-deep-dive

25장 클래스

Opened this issue · 2 comments

  • 클래스는 문법적 설탕이 아니다?
    -> 클래스를 썼을 때 확실히 더 좋은 경우가 있는지 궁금했음

article1: Please stop using classes in JavaScript

내용요약

수년간 OOP는 소프트웨어 공학의 사실상 표준이었다. 하지만 모든 것에서 그렇듯 프로그래밍 패러다임에도 끝이 있다. 이 글에서는 클래스가 처음에 사용되었던 이유와 js에서 클래스를 사용하는 것이 좋지 않은 이유, 대안을 알아보자.

OOP가 사라지는 이유에 대해서는 이 글을 참고해라.

글 요약: OOP는 '추상'과 '디자인 패턴'을 고민하는데 노력이 많이 든다. 단순함이 좋은 코드를 만드는데, OOP는 너무 복잡하다. OOP가 프로젝트가 너무 복잡해져서 실패하는 것을 개인적으로 목격해왔다. 세상을 복잡한 계층구조로 정리하는 것이 인간의 뇌에 맞지 않다. (인간은 그저 무언가를 '한다.' OOP는 자연스럽지 않기 때문에 어렵다.) (OOPs…라고 표현함.)

클래스 키워드

클래스 키워드가 자바스크립트에 추가된 것은 ES6(ECMAScript 2015)부터였지만, 사람들은 일찍이 클래스를 사용하고 있었다.

아래처럼 상속을 구현하여 사용함
(Car를 상속하는 SportsCar 생성자 세팅)

// actual inheritance logic
SportsCar.prototype = Object.create(Car.prototype);
SportsCar.prototype.constructor = SportsCar;

따라서 사람들의 요청에 의해 class가 도입되었으나, js는 객체지향언어가 아니다. js의 모든것은 객체로 이루어져있으나, 이런 객체의 개념은 OOP의 객체와는 다르다.

또한 Class를 적용하여 구현한 부모, 자식 클래스는 거의 동일한 코드를 hood에 가지고 있다.

상속 문제는 기존의 프로토타입을 활용하면 해결할 수 있다. JS의 철학을 받아들여라.

article2: Should You Use Classes in JavaScript?

요약: 팩토리 함수로 활용하는 법

25장에서 기억할 만한 내용

  • 호이스팅: let, const 처럼 호이스팅 됨
  • new 키워드 사용: 인스턴스 생성이 목적이기 때문에 new 키워드를 반드시 사용
  • 클래스 이름은 몸체 내부에서만 사용가능한 식별자임
  • 책에서는 클래스도 프로토타입 기반의 객체 생성 메커니즘이라고 설명하고 있음
  • 정적메서드는 프토로타입 체인상 위치하지 않고, 클래스에 속한다.

=> Function.prototype.call()

function Product(name) {
  this.name = name;
  console.log(name);
}

function Food(name) {
  Product.call(this, name);
  this.category = 'food';
}

console.log(new Food('cheese').category);