자바스크립트는 왜 클래스를 도입했을까

YooSeok2·2022년 10월 13일
0
post-thumbnail

개요

초기 자바스크립트에 클래스란 개념은 없었으나 ES6 자바스크립트에서 클래스가 도입되었다.
클래스는 흔히 자바나 C++에서 객체지향 프로그래밍을 위해 쓰인다. 이와 달리 자바스크립트는 프로토타입 기반의 객체지향 프로그래밍 언어이다. 이렇듯 클래스와 프로토타입은 객체지향 프로그래밍(OOP)를 위해 쓰이는 서로 다른 방법론이다. 그렇다면 이미 프로토타입으로 OOP를 잘 수행하던 자바스크립트에서 왜 클래스가 도입된걸까?

물음의 해답을 찾기 위해 클래스와 프로토타입을 더 자세히 알아보자.

클래스

먼저 클래스기반 언어에서는 클래스를 이용하여 객체를 만든다. 클래스란 객체의 상태와 기능을 정의한 틀을 의미하며 이를 인스턴스화 하여 생성된 객체를 인스턴스라고 한다. 여기서 인스턴스는 클래스의 복사본이며 개별적으로 존재하고 서로간의 어떠한 참조도 이루어지지 않는다.

* Java로 구현된 클래스와 인스턴스 예시

/** 클래스 선언 */
public class Human{ 
	private int age;
	private String name;
	public void introduce(){
		System.out.printIn('My name is' + name+'and my age is' + age);
	}
}

public static void main(String[] args){
	Human gildong = new Human();  // 인스턴스 생성
}

프로토타입

프로토타입 기반은 이러한 클래스의 개념이 없고 오로지 객체 생성 방법만이 존재한다.

객체생성 방법
1. 객체 리터럴
2. Object() 생성 함수
3. 생성자 함수

// 객체 리터럴
var obj1 = {};

// Object() 생성자 함수
var obj2 = new Object();

// 생성자 함수
function F() {}
var obj3 = new F();

프로토타입이라는 용어는 두 가지로 나뉜다. 자신을 원형으로 다른 객체가 참조할 프로토타입 객체와 상위에서 물려받은 객체의 정보를 담은 프로토타입 링크가 있다.
콘솔에서 객체를 출력하면

위의 이미지처럼 [[Prototype]] 이라는 인터널 슬롯을 볼 수 있는데 이곳에 후자의 정보가 쓰여져 있다. 이렇듯 객체는 다른 객체와 프로토타입으로 연결되어져 있으며 이를 프로토타입 체인이라고 한다. 프로토타입 체인의 종착지에는 모든 Built-in 객체들의 원형인 Object.prototype이 있다.
자바스크립트는 이러한 프로토 타입 체인을 이용하여 OOP의 상속을 구현해내며 클래스 방식을 모방할 수 있다. 반대로 클래스기반에서 프로토타입으로 바꾸는 일은 불가능하다. 이 점에서 프로토타입 방식이 OOP를 수행하는데 더 강력한 시스템이라 볼 수 있다.

지금까지의 이야기를 종합해보면 프로토타입과 클래스는 모두 OOP를 위한 수단이며 자바스크립트에서 도입된 클래스는 프로토타입으로 흉내낸 Syntatic Sugar라는 것이다.

Syntatic Sugar란?
컴퓨터 프로그래밍적으로 같은 동작을 하는 구문을 다르게 표현하는 것을 말한다.
예를 들어 x = 1을 x -> 1 이라고 표현했을 때 둘 다 동작은 x를 1로 설정하는 일이다.

다시 논점으로 돌아와서 오랜기간동안 자바, C++이 유행하였고 자바스크립트가 인기를 끈지는 얼마되지 않았다. 따라서 기존 언어에 익숙한 개발자들이 자바스크립트를 사용하면서 어려움을 느낄 수 밖에 없었고 크게 두 가지가 있다. 첫 번째는 동적 타입이다. 이를 해결하기 위해 타입스크립트가 도입되었고 성공적이었다. 기존의 자바스크립트를 사용하던 개발자도 불편을 겪던 디버그 문제도 해소 시켜주고 협업하는데 큰 이점으로 작용되었기 때문이다. 두 번째는 프로토타입 기반의 OOP이다. 이에 자바스크립트는 클래스를 도입하였다. 즉 아직까지 지배적인 클래스 기반의 OOP에 익숙한 개발자들의 편의를 도모하기 위해 클래스가 도입된것이다.

profile
아는만큼 보인다

0개의 댓글