Javascript

ES6 class 도입에 대한 이해 :: 마이구미

mygumi 2017. 10. 18. 15:43
반응형

이 글은 ES6에서 도입된 class 키워드에 대한 이해를 도울 것이다.

광범위하고 깊은 내용이 많기에, 다소 간략하게 다룬다.

자세한 사항은 관련 링크를 참고하길 바란다.


자바스크립트는 ES6에서 class 키워드가 도입되었다.

class, super, extends, static 등 class 기반의 키워드들이 도입되었다.

클래스 기반에 익숙한 사용자에게는 좋은 소식이지만, 한편으로는 많은 비평이 존재한다.


Why? 왜 class 도입에 대해 많은 이야기가 오고가는 것인가?


우선 자바스크립트가 나온 시점으로 돌이켜보자.

클래스 기반 언어인 C++ 또는 JAVA 개발자가 자바스크립트는 다룬다면, 과거에나 현재에나 비슷한 의문과 혼란을 가진다.

(간단히 말하자면, 동적 언어라는 것과 클래스가 존재하지 않는다는 점이다.)


How?

클래스가 없으면 어떻게 하지?

ES6에서 class가 도입되었다는 건 이전까지는 어떻게 사용된거지?


이것을 이해하기 위해서는 OOP(객체지향프로그래밍) 를 살펴봐야한다.

OOP의 형태는 크게 2가지로 나뉠 수 있다.


  • 클래스(class) 기반 형태
  • 프로토타입(prototype) 기반 형태

생소한 단어일 수도 있고, OOP의 형태의 분류를 이해하지 못할 수 있다.
왜냐하면 OOP에서 클래스라는 용어가 존재하기 때문이다.
또한 클래스와 객체를 같다고 생각한다면, 혼란스러울 것이다. (엄연히 클래스와 객체는 다른 의미이다)
프로토타입 기반 OOP는 단순히 클래스가 존재하지 않는 OOP라고 생각하면 된다.

What? 클래스 기반과 프로트타입 기반의 차이점은 무엇인가?

둘 사이의 차이점은 클래스와 인스턴스이다.
C++ 또는 JAVA에서는 클래스는 틀이고, 인스턴스는 클래스가 실체화된 것이다.
, 클래스는 클래스로부터 상속되고 하위클래스와의 관계가 만들어진다. (계층구조)

프로토타입은 클래스와 인스턴스의 차이를 두지 않는다.
실체화된 객체로써, 객체는 다른 객체로부터 상속된다.

결국 다음을 말하고자 말이 길어졌다.
자바스크립트는 프로토타입 기반의 언어이다.(C++, JAVA 클래스 기반)

프로토타입 기반의 언어로써, 클래스가 존재하지 않다.

OOP의 상속의 경우에는 prototype을 사용하여 기존 클래스 상속을 흉내낸다.

이러한 방법으로 지금까지 OOP의 개념을 가지게 하였다.

참고 - 상속과 프로토타입 - MDN 문서


Why? class 문법을 추가에 대한 비평이 있는가?


우선 class 문법이 추가되었다고 해서, 클래스 기반으로 변한 것은 아니라는 점을 알아두자.

ES6의 class 키워드는 겉은 class 이더라도, 내부적으로 프로토타입 기반으로 구성되어있다.

이러한 이유 때문에, 단순히 편의를 위한 문법이라는 비평을 볼 수 있다.


비평의 이유는 프로토타입 기반에서 클래스가 추가되었다는 점이다.

모두 사용해서 좋다고 생각할 수 있지만, 외국의 한 개발자의 말이면 모두 정리된다.


Using class inheritance in JavaScript is like driving your new Tesla Model S to the dealer

and trading it in for a rusted out 1983 Ford Pinto. -Eric Elliott


해석하면, "자바스크립트에서 클래스 상속을 사용하는 것은 최신 테슬라 모델을 1983년 포드 모델로 바꾸는 것과 같다" 라는 의미가 된다.

사실 상, 전적으로 동의되는 말이 된다.

프로토타입 기반은 클래스 기반의 고전적인 방법보다 훨씬 강력한 시스템이 된다.

예를 들면, 프로토타입 기반을 클래스 기반으로 바꾸는 건 쉽지만, 클래스 기반을 프로토타입 기반으로 바꾸는 일은 거의 불가능하다.

참고 - 프로토타입 상속과 클래스 상속의 차이점 - Eric Elliott


Why? class 문법이 추가된 이유는 무엇인가?


자바스크립트는 프로토타입 기반의 언어이고, 프로토타입 기반 자체는 강력한 시스템이 된다.

하지만, SW개발에 있어, 아직까지 클래스 기반보다 널리 퍼지고 있지 못하고 있다.

그 이유는 정적 타입과 동적 타입에 대한 이야기로 빠질 수 있다.
예를 들어, typescript 와 javascript에 대한 비교를 할 수 있겠다.

참고 - typescript와 javascript


그렇기에, ES6에서 class 도입된 이유는 아직까지 우세한 클래스 기반 때문이라는 말도 존재한다.

그렇기에 클래스 기반 사용자를 위해 편의를 제공해주는 것을 택했을 수도 있다.

이것이 어쩔 수 없는 판단인지, 큰 그림을 그리기 위한 취지인지는 추측만 할뿐이다.


자바스크립트에서 class 키워드는 피해야하는 것인가?


본인의 견해로는 100% 답은 없다.

자바스크립트 개발자라면 사실상 피해야하는 것이 맞다.

단순하게 프로토타입 기반의 언어에서 프로토타입을 놔두고 클래스를 쓴다는 것이 맞는 표현은 아니다.

결론은 class를 피하는 것이 좋다고 볼 수 있지만, 무조건 피해야된다는 것은 아니라고 본다.

우선적으로, 정적 타입 언어와 동적 타입 언어에 대한 입장 차이이기 때문에, 올바른 답은 없다.

반응형