본문 바로가기

카테고리 없음

모던 리액트 딥 다이브 1.3 클래스

1.3 클래스

클래스란 특정한 객체를 만들기 위한 일종의 템플릿과 같은 개념이다. 즉, 특정한 형태의 객체를 반복적으로 만들기 위해 사용되는 것이 바로 클래스다.

  • 클래스가 나오기 이전에는 클래스라는 개념이 없어 객체를 만드는 템플릿 같은 역할을 함수가 도맡아 했었다.
  • 반대로 말하면, 우리가 자바스크립트에서 클래스로 하는 모든 것들을 함수로도 동일하게 표현할 수 있다.

클래스 내부 구조

constructor

  • constructor는 생성자로, 이름에서 알 수 있는 것처럼 객체를 생성하는 데 사용하는 특수한 메서드다.
  • 단 하나만 존재할 수 있으며, 생성자에서 별다르게 수행할 작업이 없다면 생략 가능하다.

 

프로퍼티

  • 클래스로 인스턴스를 생성할 때 내부에 정의할 수 있는 속성값을 의미한다.
  • 기본적으로 인스턴스 생성 시 constructor 내부에는 빈 객체가 할당돼 있는데, 바로 이 빈 객체에 프로퍼티 키와 값을 넣어서 활용할 수 있게 도와준다.
  • JS는 기본적으로 public이고, 타입스크립트에서는 private, protected, public을 사용할 수 있다.

 

getter

  • getter란 클래스에서 무언가 값을 가져올 때 사용된다.
  • get을 앞에 붙여야 하고, 뒤 이어서 getter의 이름을 선언해야 한다.

 

setter

  • setter란 클래스 필드에 값을 할당할 때 사용한다.
  • set이라는 키워드를 먼저 선언하고, 그 뒤를 이어서 이름을 붙이면 된다.

 

인스턴스 메서드(프로토타입 메서드)

  • 클래스 내부에서 선언한 메서드를 인스턴스 메서드라고 한다.
  • 이 인스턴스 메서드는 실제로 JS의 prototype에 선언되므로 프로토타입 메서드로 불리기도 한다.
  • Car라는 클래스를 선언하고, 그 내부에 hello라고 하는 인스턴스 메서드를 정의했다.
Object.getPrototypeOf(myCar) === Car.prototype // true

 

정적 메서드

  • 정적 메서드는 인스턴스가 아닌 클래스의 이름으로 호출할 수 있는 메서드다.
  • 정적 메서드 내부의 this는 인스턴스가 아닌, 클래스 자신을 가리키기 때문에 다른 메서드에서 일반적으로 사용하는 this를 사용할 수 없다.
  • 이러한 이유로 리액트 클래스형 컴포넌트 생명주기 메서드인 static getDerivedStateFromProps(props, state)에서는 this.state에 접근할수 없다.
  • 정적 메서드는 인스턴스를 생성하지 않아도 사용할 수 있기 때문에 여러 곳에서 재사용이 가능하다는 장점이 있다.
  • 이 때문에 애플리케이션 전역에서 사용하는 유틸 함수를 정적 메서드로 많이 활용하는 편이다.

 

상속

  • 리액트에서는 클래스형 컴포넌트를 만들기 위해서 extends React.Component 또는 extends React.PureComponent와 같이 선언한다.
  • 기존 클래스를 상속받아서 자식 클래스에서 상속받은 클래스를 기반으로 확장하는 개념이다.
  • Car를 extends한 Truck이 생성한 객체에서도, Truck이 따로 정의하지 않은 honk 메서드를 사용할 수 있는것을 볼 수 있다.

클래스는 객체지향 언어를 사용하던 다른 프로그래머가 좀 더 자바스크립트에 접근하기 쉽게 만들어주는,

일종의 문법적 설탕(syntactic sugar)의 역할을 한다고 볼 수 있다.

또한 자바스크립트 클래스는 프로토타입을 기반으로 작동한다는 사실도 확인할 수 있다.