π μλ°μ€ν¬λ¦½νΈ ν΄λμ€ λ¬Έλ² - μλ²½ κ°μ΄λ
ES6 ν΄λμ€ λ¬Έλ²μ μ’λ JAVAμ€λ½κ² κ°μ²΄ μ§ν₯μ μΌλ‘ νννκΈ° μν΄ μΆκ°λ μλ‘μ΄ λ¬Έλ²μ΄λ€.
ES5κΉμ§ μλ°μ€ν¬λ¦½νΈμλ ν΄λμ€κ° μμλ€. κ·Έλμ νλ‘ν νμ 체μ΄λμ ν΅ν΄ ν΄λμ€ λΉμ€λ¬΄λ¦¬νκ² κ΅¬νν΄μμλλ° ES6 λ²μ Όμ λ€μ΄μλ©΄μ ν΄λμ€μ λΉμ·ν ꡬ쑰 λ¬Έλ²μ μΆκ°νμλ€.
λ€λ§ μκΉμλ§ ν΄λμ€ κ΅¬μ‘°μ΄μ§, μμ§ λ΄λΆμ μΌλ‘λ νλ‘ν νμ λ°©μμΌλ‘ μλλλ€.
λ€μμ νλ‘ν νμ λ¬Έλ²κ³Ό ν΄λμ€ λ¬Έλ²μ κ°λ¨ν μ°¨μ΄μ΄λ€.
μ΄ λμ κ°μ κ²°κ³Όλ₯Ό μΆλ ₯νμ§λ§, λ¬Έλ² μκΉμλ§ λ€λ₯΄κ³ λ΄λΆ λ‘μ§μ μμ ν κ°μ ꡬ쑰λΌλ μ λ§ κΈ°μ΅νλ©΄ λλ€.
ES5 νλ‘ν νμ λ¬Έλ²
// μμ±μ
function Person({name, age}) {
this.name = name;
this.age = age;
}
Person.prototype.introduce = function() {
return `μλ
νμΈμ, μ μ΄λ¦μ ${this.name}μ
λλ€.`;
};
const person = new Person({name: 'μ€μμ€', age: 19});
console.log(person.introduce()); // μλ
νμΈμ, μ μ΄λ¦μ μ€μμ€μ
λλ€.
β
ES6 ν΄λμ€ λ¬Έλ²
// ν΄λμ€
class Person {
// μ΄μ μμ μ¬μ©νλ μμ±μ ν¨μλ ν΄λμ€ μμ `constructor`λΌλ μ΄λ¦μΌλ‘ μ μν©λλ€.
constructor({name, age}) { //μμ±μ
this.name = name;
this.age = age;
}
// κ°μ²΄μμ λ©μλλ₯Ό μ μν λ μ¬μ©νλ λ¬Έλ²μ κ·Έλλ‘ μ¬μ©νλ©΄, λ©μλκ° μλμΌλ‘ `Person.prototype`μ μ μ₯λ©λλ€.
introduce() {
return `μλ
νμΈμ, μ μ΄λ¦μ ${this.name}μ
λλ€.`;
}
}
const person = new Person({name: 'μ€μμ€', age: 19});
console.log(person.introduce()); // μλ
νμΈμ, μ μ΄λ¦μ μ€μμ€μ
λλ€.
μλ°μ€ν¬λ¦½νΈ ν΄λμ€ λ¬Έλ²
Class μ μΈ
constructorλ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ ν΄λμ€ νλλ₯Ό μ΄κΈ°ννκΈ° μν νΉμν λ©μλμ΄λ€.
constructorλ ν΄λμ€ μμ ν κ°λ§ μ‘΄μ¬ν μ μλ€. 2κ° μ΄μ μμ κ²½μ° Syntax Errorκ° λ°μνλκΉ μ£Όμνμ.
class Person {
height = 180; // μΈμ€ν΄μ€ λ³μ
// constructorλ μ΄λ¦μ λ°κΏ μ μλ€.
constructor(name, age) {
// thisλ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
this.name = name;
this.age = age;
}
}
let person1 = new Person('john', 23);
console.log(person1.name); // john
console.log(person1.age); // 23
console.log(person1.height); // 180
ν΄λμ€ νλμ μ μΈκ³Ό μ΄κΈ°νλ λ°λμ constructor λ΄λΆμμ μ€μνλ€.
constructor λ΄λΆμ μ μΈν ν΄λμ€ νλλ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ λ°μΈλ© λλ€.
ν΄λμ€ νλλ κ·Έ μΈμ€ν΄μ€μ νλ‘νΌν°κ° λλ©°, μΈμ€ν΄μ€λ₯Ό ν΅ν΄ ν΄λμ€ μΈλΆμμ μΈμ λ μ°Έμ‘°ν μ μλ€. (public)
JAVAλ Pythonμ ν΄λμ€λ¬Έλ²κ³Όμ μ°¨μ΄μ μ, μλ°μ€ν¬λ¦½νΈμ ν΄λμ€ λ¬Έλ²μμ μΈμ€ν΄μ€ λ³μλ₯Ό λ°λμ μ§μ νμ§ μκ³ μμ±μ(constructor)μ ν΅ν΄ this.λ³μ λ¬Έλ²μΌλ‘ μλ μμ±λ μ μλ€λ μ μ΄λ€.
ν΄λμ€μ λ³Έλ¬Έ(body)μ strict modeμμ μ€νλλ€. μ±λ₯ ν₯μμ μν΄ λ μ격ν λ¬Έλ²μ΄ μ μ©λλ€.
Class λ©μλ μ μ
βν΄λμ€μ λ©μλλ₯Ό μ μν λλ κ°μ²΄ 리ν°λ΄μμ μ¬μ©νλ λ¬Έλ²κ³Ό μ μ¬ν λ¬Έλ²μ μ¬μ©νλ€.
class Calculator {
add(x, y) {
return x + y;
}
subtract(x, y) {
return x - y;
}
}
let calc = new Calculator();
calc.add(1,10); // 11
β
κ°μ²΄ 리ν°λ΄μ λ¬Έλ²κ³Ό λ§μ°¬κ°μ§λ‘, μμμ ννμμ λκ΄νΈλ‘ λλ¬μΈμ λ©μλμ μ΄λ¦μΌλ‘ μ¬μ©ν μλ μλ€.
const methodName = 'introduce'; // ν΄λμ€ λ©μλ μ΄λ¦
class Person {
constructor({name, age}) {
this.name = name;
this.age = age;
}
// μλ λ©μλμ μ΄λ¦μ `introduce`κ° λ©λλ€.
[methodName]() {
return `μλ
νμΈμ, μ μ΄λ¦μ ${this.name}μ
λλ€.`;
}
}
console.log(new Person({name: 'μ€μμ€', age: 19}).introduce()); // μλ
νμΈμ, μ μ΄λ¦μ μ€μμ€μ
λλ€.
β
Getter / Setter
ν΄λμ€ λ΄μμ Getter νΉμ setterλ₯Ό μ μνκ³ μΆμ λλ λ©μλ μ΄λ¦ μμ get λλ setμ λΆμ¬μ£Όλ©΄ λλ€.
class Account {
constructor() {
this._balance = 0;
}
get balance() {
return this._balance;
}
set balance(newBalance) {
this._balance = newBalance;
}
}
const account = new Account();
account.balance = 10000;
account.balance; // 10000
β
μ μ λ©μλ (static)
μ μ λ©μλλ ν΄λμ€μ μΈμ€ν΄μ€κ° μλ ν΄λμ€ μ΄λ¦μΌλ‘ 곧λ°λ‘ νΈμΆλλ λ©μλμ΄λ€.
static ν€μλλ₯Ό λ©μλ μ΄λ¦ μμ λΆμ¬μ£Όλ©΄ ν΄λΉ λ©μλλ μ μ λ©μλκ° λλ€.
μ°λ¦¬κ° λλ€κ°μ μ»κΈ° μν΄ Math.random() κ°μ λ©μλλ₯Ό μ°λ―μ΄, λ°λ‘ new Math() μμ΄ κ³§λ°λ‘ ν΄λμ€λͺ
.λ©μλλͺ
μΌλ‘ ν¨μλ₯Ό νΈμΆν΄μ μ¬μ©νλ κ²μ΄ λ°λ‘ radom λ©μλκ° staticμΌλ‘ μ€μ λμ΄ μκΈ° λλ¬Έμ΄λ€.
class Person {
constructor({ name, age }) { // μμ±μ μΈμ€ν΄μ€
this.name = name;
this.age = age;
}
static static_name = 'STATIC'; // μ μ μΈμ€ν΄μ€
getName() { // μΈμ€ν΄μ€(νλ‘ν νμ
) λ©μλ
return this.name;
}
static static_getName() { // μ μ λ©μλ
return this.static_name;
}
}
const person = new Person({ name: 'jeff', age: 20 });
person.getName(); // jeff
Person.static_getName(); // STATIC
class Person {
constructor({ name, age }) {
this.name = name;
this.age = age;
}
// μ΄ λ©μλλ μ μ λ©μλ
static static_sumAge(...people) {
/*
ν¨μ νλΌλ―Έν° peopleλ₯Ό μ κ°μ°μ°μ ...peopleλ₯Ό ν΅ν΄ λ°°μ΄λ‘ λ§λ¬
[ {"name": "μ€μμ€", age": 19}, { "name": "μ νκ²½","age": 20 }]
*/
// κ·Έλ¦¬κ³ κ° κ°μ²΄μ ageκ°μ μ»μ΄μ ν©μΉ¨
return people.reduce((acc, person) => acc + person.age, 0);
}
}
const person1 = new Person({ name: 'μ€μμ€', age: 19 });
const person2 = new Person({ name: 'μ νκ²½', age: 20 });
Person.static_sumAge(person1, person2); // 39
β
μ λλ μ΄ν°
Generator λ©μλλ₯Ό μ μνλ €λ©΄, λ©μλ μ΄λ¦ μμ * κΈ°νΈλ₯Ό λΆμ¬μ£Όλ©΄ λλ€.
class Gen {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
}
// 1, 2, 3μ΄ μ°¨λ‘λλ‘ μΆλ ₯λ©λλ€.
for (let n of new Gen()) {
console.log(n);
}
ν΄λμ€ μμ (Class Inheritance)
βν΄λμ€ μμ(class inheritance, subclassing) κΈ°λ₯μ ν΅ν΄ ν ν΄λμ€μ κΈ°λ₯μ λ€λ₯Έ ν΄λμ€μμ μ¬μ¬μ©ν μ μλ€.
extends ν€μλ
extends ν€μλλ ν΄λμ€λ₯Ό λ€λ₯Έ ν΄λμ€μ νμ ν΄λμ€λ‘ λ§λ€κΈ° μν΄ μ¬μ©λλ€.
class Parent {
// ...
}
class Child extends Parent {
// ...
}
μ μ½λμμ, extends ν€μλλ₯Ό ν΅ν΄ Child ν΄λμ€κ° Parent ν΄λμ€λ₯Ό μμνλ€.
μ΄ κ΄κ³λ₯Ό λ³΄κ³ 'λΆλͺ¨ ν΄λμ€-μμ ν΄λμ€ κ΄κ³' νΉμ 'μνΌ ν΄λμ€(superclass)-μλΈ ν΄λμ€(subclass) κ΄κ³'λΌκ³ λ§νκΈ°λ νλ€.
βλ°λΌμ μ΄λ€ ν΄λμ€ Aκ° λ€λ₯Έ ν΄λμ€ Bλ₯Ό μμλ°μΌλ©΄, λ€μκ³Ό κ°μ μΌλ€μ΄ κ°λ₯ν΄μ§λ€.
- μμ ν΄λμ€ Aλ₯Ό ν΅ν΄ λΆλͺ¨ ν΄λμ€ Bμ μ μ λ©μλμ μ μ μμ±μ μ¬μ©ν μ μλ€.
- λΆλͺ¨ ν΄λμ€ Bμ μΈμ€ν΄μ€ λ©μλμ μΈμ€ν΄μ€ μμ±μ μμ ν΄λμ€ Aμ μΈμ€ν΄μ€μμ μ¬μ©ν μ μλ€.
class Parent {
static staticProp = 'staticProp';
static staticMethod() {
return 'I\'m a static method.';
}
instanceProp = 'instanceProp';
instanceMethod() {
return 'I\'m a instance method.';
}
}
class Child extends Parent {}
// μμνλ©΄ λΆλͺ¨μ staticμμλ€μ μ¬μ© κ°λ₯
console.log(Child.staticProp); // staticProp
console.log(Child.staticMethod()); // I'm a static method.
// μμνλ©΄ λΆλͺ¨μ μΈμ€ν΄μ€λ₯Ό μ¬μ© κ°λ₯
const c = new Child();
console.log(c.instanceProp); // instanceProp
console.log(c.instanceMethod()); // I'm a instance method.
super ν€μλ
βsuper ν€μλμ λμ λ°©μμ λ€μκ³Ό κ°λ€.β
- μμ±μ λ΄λΆμμ superλ₯Ό ν¨μμ²λΌ νΈμΆνλ©΄, λΆλͺ¨ ν΄λμ€μ μμ±μκ° νΈμΆ
- μ μ λ©μλ λ΄λΆμμλ super.propκ³Ό κ°μ΄ μ¨μ λΆλͺ¨ ν΄λμ€μ prop μ μ μμ±μ μ κ·Όν μ μλ€.
- μΈμ€ν΄μ€ λ©μλ λ΄λΆμμλ super.propκ³Ό κ°μ΄ μ¨μ λΆλͺ¨ ν΄λμ€μ prop μΈμ€ν΄μ€ μμ±μ μ κ·Όν μ μλ€.
super(); // λΆλͺ¨ μμ±μ
super.λ©μλλͺ
// μ κ·Ό
class Person{
constructor(name, first, second){
this.name=name;
this.first=first;
this.second=second;
}
sum(){
return (this.first + this.second);
}
}
class Person2 extends Person{
// override Person
constructor(name, first, second, third){
super(name, first, second); //λΆλͺ¨ μμ±μλ₯Ό κ°μ Έμμ ννκ² νλ€.
this.third = third;
}
sum(){
// λΆλͺ¨ λ©μλλ₯Ό κ°μ Έμμ μ¬μ©.
// μ€λ²λ‘λ© λ©μλμμ μ¨μ ν λΆλͺ¨ λ©μλλ₯Ό μ¬μ©νκ³ μΆμλ
return super.sum() + this.third;
}
}
var kim = new Person2('kim', 10, 20, 30);
document.write(kim.sum()); // 60
Private ν΄λμ€ λ³μ
μ΄μ κΉμ§ μλ°μ€ν¬λ¦½νΈ ν΄λμ€μ λͺ¨λ λ©μλλ νΌλΈλ¦μΌλ‘ μ§μ λμλ€.
κ·Έλμ μ λͺ 무μ€ν λ°μͺ½μ§λ¦¬ ν΄λμ€ κ΅¬νμ²΄λ‘ λΉλμ λ°μμμ§λ§, ES2021λΆν°λ λ©μλμ νλλͺ μμ "#"μ λΆμ¬μ νλΌμ΄λΉ λ©μλμ νλ μ μκ° κ°λ₯ν΄μ‘λ€. (λ³΄λ€ JAVA μ€λ¬μμ‘λ€)
# κΈ°νΈλ₯Ό μ λμ¬λ‘ μ¬μ©νμ¬ λ©μλμ μ κ·Όμλ₯Ό λΉκ³΅κ°λ‘ μ€μ ν μ μμΌλ©° λμμ getter λ° setter λ©μλλ₯Ό μ¬μ©ν μλ μλ€.
class myClass {
// private λ³μ
#num = 100
// private λ©μλ
#privMethod(){
console.log(this.#num); // νλΌμ΄λΉ λ³μ νΈμΆ
}
publicMethod() {
this.#privMethod(); // νλΌμ΄λΉ λ©μλ νΈμΆ
}
}
let newClass = new myClass();
newClass.publicMethod() // 100
Private Fields 체ν¬νκΈ°
private λ³μλ₯Ό ν΄λμ€μ μΆκ°νλ κ² κΉμ§λ μ’μμ§λ§, ν΄λμ€λ₯Ό μ΄μ©ν λ, μ΄ ν΄λμ€ μΈμ€ν΄μ€κ° privateμΈμ§ publicμΈμ§ νμΈμ΄ μ΄λ €μ΄ κ²½μ°κ° μμλ€.
μλνλ©΄ public νλμ λν΄ ν΄λμ€μ μ‘΄μ¬νμ§ μλ νλμ μ κ·Όμ μλνλ©΄ undefinedκ° λ°νλλ λ°λ©΄μ, private νλλ undefinedλμ μμΈλ₯Ό λ°μμν€κ² λκΈ° λλ¬Έμ΄λ€. κ·Έλμ νΉμ κ°μ²΄μ μ΄λ€ private νλ‘νΌν°κ° μλμ§ νμΈνκΈ° μ΄λ €μ λ€.
λ°λΌμ in ν€μλλ₯Ό μ¬μ©ν΄ μ΄ κ°μ²΄μμ private μμ±/λ©μλ κ° μλμ§λ₯Ό 체ν¬ν μ μλ€.
class Foo {
#brand = 100;
static isFoo(obj) {
return #brand in obj;
}
}
const foo = new Foo();
const foo2 = { brand: 100 };
console.log('foo : ', Foo.isFoo(foo)); // true
console.log('foo2 : ', Foo.isFoo(foo2)); // false
ν΄λμ€ μμ & νλ‘ν νμ μμ λ¬Έλ² λΉκ΅
βν΄λμ€ μμμ λ΄λΆμ μΌλ‘ νλ‘ν νμ μμ κΈ°λ₯μ νμ©νκ³ μλ€.
μλ μ½λμ ν΄λμ€ μμμ λν νλ‘ν νμ 체μΈμ κ·Έλ¦ΌμΌλ‘ λνλ΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ λλ€.
class Person {}
class Student extends Person {}
const student = new Student();
νλ‘ν νμ μμ λ°©μ
//νλ‘ν νμ
λ°©μ
function Person(name, first, second){
this.name=name;
this.first=first;
this.second=second;
}
Person.prototype.sum = function() {
return (this.first + this.second);
}
function Student(name, first, second, third){
Person.call(this, name, first, second);
//Personμ μμ±μ ν¨μμ΄λ€. κ·Έλ₯ μ°λ©΄ thisλ λλ°? κ·Έλμ μ΄λ call,bindν¨μλ₯Ό μ¨μ€λ€.
//ν΄λμ€μ super() μ κ°μ μν μ νλ€κ³ 보면 λλ€. νμ§λ§ μμ§ μμμ΄ λ건 μλλ€.
this.third = third;
}
//λ°©λ² 1 λΉνμ€ :
//Student νλ‘ν νμ
μ€λΈμ νΈ λ§ν¬λ₯Ό Person νλ‘ν νμ
μ€λΈμ νΈλ‘ μ°κ²°μμΌ sumμ μ¬μ©ν μμκ² μ°Ύμκ°λλ‘ μ€μ
Student.prototype.__proto__ = Person.prototype;
//λ°©λ² 2 νμ€ :
//Personνλ‘ν νμ
μ€λΈμ νΈλ₯Ό μλ‘ λ§λ€μ΄μ λμ
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student; //μμ±μ μ°κ²°
Student.prototype.avg = function(){
return (this.first+this.second+this.third)/3;
}
var kim = new Student('kim', 10, 20, 30);
ν΄λμ€ μμ λ°©μ
//ν΄λμ€ λ°©μ
class Person{
constructor(name, first, second){
this.name=name;
this.first=first;
this.second=second;
}
sum(){
return (this.first + this.second);
}
}
class Student extends Person{
constructor(name, first, second, third){
super(name, first, second);
this.third = third;
}
sum(){
return super.sum() + this.third;
}
avg(){
return (this.first+this.second+this.third)/3;
}
}
var kim = new Student('kim', 10, 20, 30);
β