ES6부터 자바스크립트에서도 class 문법이 지원된다.
클래스는 객체를 생성하는 탬플릿으로 재사용할 수 있고, 내부의 변수와 메서드를 추상화할 수 있다.
class 사용하기
// class 표현식
const Data = class {
constructor(name) {
this.name = name;
}
get name() {
return "이름은 " + this._name + "입니다.";
}
set name(name) {
if (name.length <= 3) {
alert("Too Short");
} else {
this._name = name;
}
}
}
// class 선언식
class Data {
constructor(name) {
this.name = name;
}
get name() {
return "이름은 " + this._name + "입니다.";
}
set name(name) {
if (name.length <= 3) {
alert("Too Short");
} else {
this._name = name;
}
}
}
// 출력되는 값은 같다.
const data = new Data("HI"); // alert("Too Short") 출력
console.log(data.name); // 이름은 undefined입니다.
data.name = "HIHIHI";
console.log(data.name); // 이름은 HIHIHI입니다.
- 위와 같은 방법들로 클래스를 사용할 수 있다.
class User {
constructor(name) {
// setter를 활성화합니다.
this.name = name;
}
get name() {
return this.name;
}
set name(value) {
if (value.length < 4) {
console.log("이름이 너무 짧습니다.");
return;
}
this.name = value;
}
}
let user = new User("lee"); // undefined
- set 함수는 생성자가 실행될 때 실행될 수 있다. 참조
const Data3 = class Person {
constructor(nickName) {
Person.nickName = nickName;
}
get name() {
return "이름은 " + this._name + "입니다.";
}
set name(name) {
if (name.length <= 3) {
alert("Too Short");
} else {
this._name = name;
}
}
}
const data = new Data3("kim");
console.log(data.name); // 이름은 undefined입니다.
data.name = "1245673";
console.log(data.name); // 이름은 1245673입니다.
console.log(data3.name); // Person
- class는 변수에 할당될 수 있다.
- named class에서 name은 이 클래스의 이름이다.
function makeClass() {
return class {
clg() {
console.log("CLG");
}
};
}
const c = makeClass();
const cc = new c();
cc.clg();
- class는 동적으로 생성될 수 있다.
extends 상속
- 클래스는 다른 클래스를 상속받아 사용할 수 있다.
class Person {
constructor (name) {
this.name = name;
}
}
class Detail extends Person {
constructor (name, age) {
super(name);
this.age = age;
}
}
const data = new Detail("park", 15);
console.log(data.name); // park
console.log(data.age); // 15
- super를 통해서 상속받은 부모 클래스의 생성자 함수를 호출할 수 있다.
- super.메서드 로 생성자뿐만 아니라 부모 클래스의 다른 메서드도 접근할 수 있다.
- 자바스크립트의 클래스는 다중 상속이 불가능하다.
- 다중 상속을 구현하고자 한다면, 믹스인 기능을 사용할 수 있다.
class JsClass {
#id;
#password;
#vaildId() {
// private method
}
getId() {
return this.#id;
}
setId(id) {
this.#id = id;
}
}
- 클래스 내부에서 선언된 변수와 메서드는 기본적으로 public이며 외부에서 접근 가능하다.
- ES2019부터 추가된 기능으로, 변수나 메서드 이름 앞에 #을 붙이면, private 변수나 메서드가 된다.
- 이렇게 encapsulation된 클래스에서 private 변수는 해당 클래스의 scope 내부에서만 사용될 수 있고, 외부에서 private 변수나 메서드에 접근 시 syntax error가 발생한다.
참고 자료 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes, https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/class
class 식 - JavaScript | MDN
class 표현식은 ECMAScript 2015 (ES6)에서 클래스를 정의하는 한 방법입니다. function 식과 비슷하게, class 식은 기명(named) 또는 익명(unnamed)일 수 있습니다. 기명인 경우, 클래스명은 클래스 본체(body)에
developer.mozilla.org
Classes - JavaScript | MDN
Class는 객체를 생성하기 위한 템플릿입니다. 클래스는 데이터와 이를 조작하는 코드를 하나로 추상화합니다. 자바스크립트에서 클래스는 프로토타입을 이용해서 만들어졌지만 ES5의 클래스 의
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/Private_class_fields
Private class fields - JavaScript | MDN
class 의 속성(property)들은 기본적으로 public 하며 class 외부에서 읽히고 수정될 수 있다. 하지만, ES2019 에서는 해쉬 # prefix 를 추가해 private class 필드를 선언할 수 있게 되었다.
developer.mozilla.org
'JavaScript' 카테고리의 다른 글
자바스크립트 코드 실행시간 측정하기 (0) | 2023.02.11 |
---|---|
NPM에 패키지 배포하고 사용해보기 (+ 타입스크립트) (0) | 2023.02.09 |
자바스크립트 generator 함수란? (0) | 2023.02.02 |
javascript 스코프와 실행 컨텍스트 (0) | 2023.01.31 |
javascript의 호이스팅(hoisting) 알아보기 (0) | 2023.01.24 |