HTML5 ES6 클래스 사용하기
10 Jan 2020 | javascript html5ES6 클래스
ES6(ECMAScript 6, ES2015)에 클래스를 사용하는 구문이 추가되었습니다. 기존에도 클래스를 사용할 수는 있었지만, 다음과 같이 function
을 이용하거나 클래스 표현식을 이용해서 사용했었습니다.
기존 클래스 선언 방법
function Person(id, name, email) { this.id = id; this.name = name; this.email = email; } Person.prototype.id = function() { return id; } Person.prototype.name = function() { return "[name: " + this.name + ", email: " + this.email + "]"; }
ES6 에서의 클래스 선언 방법
class Person { constructor(id, name, email) { this.id = id; this.name = name; this.email = email; } id() { return id; } name() { return name; } info() { return "[name: " + this.name + ", email: " + this.email + "]"; } }
훨씬 더 Java의 문법과 비슷해졌습니다. 커다란 중괄호로 묶이기 때문에 기존 클래스 선언보다 가독성도 더 좋아졌습니다.
함수 선언문과 클래스 선언문의 차이
- 클래스 선언문은 자바스크립트 엔진이 미리 읽어들이지 않음. 따라서 생성자를 사용하기 전에 클래스 선언문이 먼저 호출되어야 함
- 클래스 선언문은 한 번만 작성되어져야 함
클래스 Property 접근자 작성하기
class Person { constructor(name) { this._name = name; } get name() { return this._name; } set name(value) { this._name = value; } }
위에서 name()
메소드에 get
, set
키워드를 사용했습니다.
따라서 다음과 같이 사용할 수 있습니다.
const p = new Person("snowdeer", "Seo", "snowdeer0314@gmail.com"); p.name = "Won"; console.log(p.info());
위에서 get
이나 set
키워드 함수 내부를 보면 this._name
변수를 사용하고 있는 것이 보입니다. 자바스크립트에서 게터나 세터와 같은 이름의 속성을 만들 수 없기 때문에 별도의 변수를 추가해서 이를 해결한 방법이며, 자바스크립트에서는 private
속성을 지원하지 않아서 prefix
로 _
을 추가해서 형식적으로 표현만 했습니다.
static 메소드 작성하기
export default class Person { constructor(name) { this._name = name;; Person.count++; } get name() { return this._name; } set name(value) { this._name = value; } static count() { return Person.count; } } Person.count = 0;
사용법은 다음과 같습니다.
function test() { const p1 = new Person("snowdeer", "Seo"); console.log(Person.count); const p2 = new Person("ran", "Lee"); const p3 = new Person("yang", "Yang"); console.log(Person.count); console.log(p3.count); }
실행 결과는 다음과 같습니다.
1 3 undefined
클래스 상속
class Person { constructor(name) { this._name = name;; } get name() { return this._name; } set name(value) { this._name = value; } } class Student extends Person { hello() { console.log("Hello, My name is " + super.name + ". "); } }