λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Javascript & NodeJS

[JavaScript] 클래슀 (Class)

by vodkassi 2021. 12. 12.
728x90

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λΉ„λ‘―ν•œ μ—¬λŸ¬ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ” "클래슀", ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•˜λ©΄ "λΆ„λ°˜, 개체ꡰ" μ΄λΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•œλ‹€. 이 κ°œλ…μ€ "객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°" 과도 κΉŠμ€ 연관성을 가지고 μžˆμ–΄, κ°œλ°œμžλ‘œμ¨λŠ” μ•Œμ•„λ‘μ–΄μ•Ό ν•  ν•„μˆ˜ 상식이기도 ν•˜λ‹€. 

 

ν΄λž˜μŠ€λŠ” 말 κ·ΈλŒ€λ‘œ ν•˜λ‚˜μ˜ κ·Έλ£Ή, λ˜λŠ” 묢음이라고 μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.κ°€λ Ή, '이름', '성별', 'λ‚˜μ΄' λΌλŠ” 속성이 있고, '이름 λΆ€λ₯΄κΈ°', '개λͺ…ν•˜κΈ°', 'λ‚˜μ΄ κ³„μ‚°ν•˜κΈ°' λ“±μ˜ λ©”μ„œλ“œ (κΈ°λŠ₯) 이 μžˆλ‹€κ³  ν•˜μž. '이름' 속성과 '이름 λΆ€λ₯΄κΈ°', '개λͺ…ν•˜κΈ°' λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ κ·Έλ£Ήν™”ν•˜μ—¬ κ΄€λ¦¬ν•˜λŠ” 것이 이듀을 κ°œλ³„μ μœΌλ‘œ λΆ„μ‚°μ‹œν‚€λŠ” 것보닀 훨씬 μž‘μ—…μ— μš©μ΄ν•  것이닀. μ΄λ ‡κ²Œ λΉ„μŠ·ν•œ κΈ°λŠ₯을 ν•˜κ±°λ‚˜ 속성을 κ°–λŠ” μš”μ†Œλ“€μ„ ν•˜λ‚˜μ˜ 객체에 λ‹΄μ•„ μ‚¬μš©ν•˜κ³  관리할 수 μžˆλ„λ‘ ν•˜λŠ” 자료ꡬ쑰λ₯Ό 클래슀라고 ν•œλ‹€. 

 

κ·Έλ ‡λ‹€λ©΄ ν΄λž˜μŠ€λŠ” μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”κ°€? 이λ₯Ό μ•Œμ•„λ³΄κΈ° 전에 λ¨Όμ €, μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ 클래슀의 관계뢀터 λ“€μ–΄κ°€λ³΄μž. 

 

✨  μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ 클래슀의 관계

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” "ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ μ–Έμ–΄" 이닀. 이 λ§μΈμ¦‰μŠ¨, ν΄λž˜μŠ€κ°€ ν•„μš” μ—†λŠ” (class-free) 객체지ν–₯ μ–Έμ–΄λΌλŠ” λœ»μ΄λ‹€. ES5 μ‹œμ ˆκΉŒμ§€λ§Œ 해도 μƒμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ 톡해 상속을 κ΅¬ν˜„ν–ˆμ§€λ§Œ, ES6 μ—μ„œ λ„μž…λœ "클래슀" κ°œλ… 덕뢄에 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ 훨씬 κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  수 있게 λ˜μ—ˆλ‹€.

 

// μƒμ„±μž ν•¨μˆ˜ (ES5)
var Person = (function() {
    function Person(name) {
    	this.name = name;
    }
    Person.prototype.sayHi = function () {
    	console.log('Hi, ' + this.name)
    }
}());

var me = new Person('Kang')
me.sayHi() // Hi, Kang

// 클래슀 (ES6)
class Person {
    constructor(name) {
    	this.name = name;
    }
    sayHi() {
    	console.log('Hi, ' + this.name)
    }
}

const me = new Person('Kang')
me.sayHi() // Hi, Kang

 

ν•˜μ§€λ§Œ κΈ°μ‘΄(ES5) 에도 객체지ν–₯을 κ΅¬ν˜„ν•  수 μžˆμ—ˆλ‹€λ©΄, ꡳ이 μƒˆλ‘œ 클래슀λ₯Ό λ„μž…ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

 

κ·Έ μ΄μœ λŠ”, μƒμ„±μž ν•¨μˆ˜λ„ ν”„λ‘œν† νƒ€μž… 기반의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ°λŠ” ν•˜λ‚˜, μ œκ³΅ν•˜μ§€ μ•ŠλŠ” μ—¬λŸ¬ κΈ°λŠ₯으둜 인해 객체지ν–₯을 μ™„μ „νžˆ κ΅¬ν˜„ν•˜λŠ” λ°μ—λŠ” μ œμ•½μ΄ μžˆμ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. κ°€λ Ή, μƒμ„±μž ν•¨μˆ˜μ™€ 클래슀의 차이λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

πŸ“ new μ—°μ‚°μž 없이 호좜 : μƒμ„±μž ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ§€λ§Œ, ν΄λž˜μŠ€λŠ” 였λ₯˜κ°€ λ‚œλ‹€.

πŸ“ extends 와 super : μƒμ„±μž ν•¨μˆ˜μ—λŠ” μ œκ³΅λ˜μ§€ μ•Šμ§€λ§Œ, ν΄λž˜μŠ€μ—λŠ” μ œκ³΅λœλ‹€.

πŸ“ ν˜Έμ΄μŠ€νŒ… : μƒμ„±μž ν•¨μˆ˜μ—λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λ‚˜, ν΄λž˜μŠ€μ—λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ“ strict mode : μƒμ„±μž ν•¨μˆ˜μ—λŠ” μ•”λ¬΅μ μœΌλ‘œ μ§€μ •λ˜μ§€ μ•Šμ§€λ§Œ, ν΄λž˜μŠ€μ—λŠ” μ•”λ¬΅μ μœΌλ‘œ μ§€μ •λœλ‹€.

πŸ“ [[Enumerable]] : 클래슀의 constuctor, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œλŠ” λͺ¨λ‘ [[Enumerable]] 의 값이 false λ‹€.  

 

ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜λ³΄λ‹€ 상속 관계 κ΅¬ν˜„μ„ λ”μš± λͺ…λ£Œν•˜κ²Œ ν•˜κΈ° λ•Œλ¬Έμ—, 객체지ν–₯을 λ”μš± κ²¬κ³ ν•˜κ²Œ λ§Œλ“ λ‹€κ³  ν•˜κΈ°λ„ ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ ν΄λž˜μŠ€κ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€, κΈ°λ³ΈλΆ€ν„° μ‘°κΈˆμ”© μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 

 

✨  클래슀의 μ •μ˜μ™€ λ©”μ„œλ“œ

μš°μ„  클래슀λ₯Ό μ •μ˜ν•  λ•ŒλŠ” λ‹€μŒ 원칙을 λ”°λ₯΄λ©΄ λœλ‹€.

1. class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜

2. Pascal Case μ‚¬μš© 

 

class Person {
    // some code ...
}

 

μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•ŒλŠ” λ‹€μŒ 원칙을 λ”°λ₯Έλ‹€.

1. new μ—°μ‚°μž μ‚¬μš© 

 

const me = new Person();

// new μ—°μ‚°μž 없을 경우
const you = Person(); // TypeError: Class constructor Person cannot be invoked without 'new'

 

ν΄λž˜μŠ€λŠ” ν‘œν˜„μ‹μœΌλ‘œλ„ μ •μ˜λ  수 μžˆλŠ”λ°, 이 λ•Œ 클래슀 이름은 없을 μˆ˜λ„ μžˆλ‹€. 

 

const Person = class {}
const Person1 = class Test {}

 

ν΄λž˜μŠ€λŠ” 일급 객체이며, λ‹€μŒ νŠΉμ§•μ„ κ°–λŠ”λ‹€.

  • λŸ°νƒ€μž„μ— 생성이 κ°€λŠ₯ν•˜λ‹€.
  • λ³€μˆ˜λ‚˜ μžλ£Œκ΅¬μ‘°μ— μ €μž₯ν•  수 μžˆλ‹€. 
  • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 μžˆλ‹€.
  • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 
πŸ’‘ 일급 κ°μ²΄λž€? (First-class object)
ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜κ±°λ‚˜, ν•¨μˆ˜μ˜ 결과둜 λ°˜ν™˜λ˜κ±°λ‚˜, λ³€μˆ˜μ— 할당될 수 μžˆλŠ” λͺ¨λ“  객체λ₯Ό 가리킨닀. 

 

ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μƒμ„±μž ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ—, ν΄λž˜μŠ€λ„ κ²°κ΅­ ν•¨μˆ˜μ˜ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ μƒμ†λ°›λŠ”λ‹€. 

 

 

ES11 κΈ°μ€€μœΌλ‘œ 클래슀의 λͺΈμ²΄μ—λŠ” λ©”μ„œλ“œλ§Œ μ„ μ–Έν•  수 있으며, μ„ μ–Έν•  수 μžˆλŠ” λ©”μ„œλ“œμ˜ μ’…λ₯˜λŠ” μ„Έ κ°€μ§€λ‘œ κ΅¬λΆ„λœλ‹€. (constructor(μƒμ„±μž) / ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ / 정적 λ©”μ„œλ“œ) 

 

πŸ“constructor(μƒμ„±μž)

μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œμ΄λ©°, 이름을 λ³€κ²½ν•  수 μ—†λ‹€. 

 

class Person {
    constructor(name) {
    	this.name = name;
    }
}

 

constructor λŠ” 클래슀 내에 μ΅œλŒ€ ν•œ 개만 μ‘΄μž¬ν•  수 있으며, μƒλž΅λ„ κ°€λŠ₯ν•˜λ‹€. λ§Œμ•½ μƒλž΅ν•  κ²½μš°μ—λŠ” 빈 constructor κ°€ μ•”λ¬΅μ μœΌλ‘œ μ •μ˜λ˜μ–΄, 빈 객체λ₯Ό μƒμ„±ν•œλ‹€.

 

class Person {

}

// μœ„μ™€ 동일함
class Person {
	constructor(){
    }
}

 

constructor λŠ” λ³„λ„μ˜ λ°˜ν™˜λ¬Έμ„ 갖지 μ•Šμ•„μ•Ό ν•˜λŠ”λ° κ·Έ μ΄μœ λŠ” ν΄λž˜μŠ€κ°€ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜λŠ” μ¦‰μ‹œ μ•”λ¬΅μ μœΌλ‘œ this (μΈμŠ€ν„΄μŠ€) 객체λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. this κ°€ μ•„λ‹Œ λ‹€λ₯Έ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€λ©΄ this λ°˜ν™˜μ΄ λ¬΄μ‹œλ˜κ³  λ°˜ν™˜κ°’μ΄ λ°˜ν™˜λœλ‹€. (ν•˜μ§€λ§Œ μ›μ‹œκ°’μ„ λ°˜ν™˜ν•˜λŠ” κ²½μš°μ—λŠ” λ°˜ν™˜μ΄ λ¬΄μ‹œλœλ‹€.)

 

class Person {
    constructor(name){
    	this.name = name;
        return {}
    }
}

const me = new Person('Ha');
console.log(me) // {}

// μ›μ‹œκ°’ λ°˜ν™˜
class Person {
    constructor(name){
    	this.name = name;
        return 100
    }
}

const me = new Person('Ha');
console.log(me) // {name: 'Ha'}

 

πŸ“ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ

클래슀의 prototype 에 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•œλ‹€λ©΄, 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ λœλ‹€. 

 

class Person {
    constructor(name){
    	this.name = name;
    }
    
    // ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
    sayHi() {
    	console.log('Hi, I am' + this.name);
    }
}

 

μ΄λ•Œ, ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λŠ” ν¬λ‘œν† νƒ€μž… 체인의 일원이 되며, ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž…μ— μ‘΄μž¬ν•˜λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ λ˜λŠ” 것이닀. μΈμŠ€ν„΄μŠ€λŠ” μ΄λŸ¬ν•œ λ©”μ„œλ“œλ₯Ό "상속"λ°›μ•„ μ‚¬μš©ν•˜λŠ” 것이닀.

 

const me = new Person('Ha');
Object.getPrototypeOf(me) === Person.prototype // true;
me.constructor === Person;
Object.getPrototypeOf(Person.prototype) === Object.prototype // true;

 

 

πŸ“μ •μ  (static) λ©”μ„œλ“œ

정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œμ΄λ‹€. 정적 λ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ” 방법은 두 가지가 μžˆλŠ”λ°, ν•˜λ‚˜λŠ” ν”„λ‘œν† νƒ€μž…μ— 직접 ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•΄μ£ΌλŠ” 것이며, λ‘˜μ§ΈλŠ” 클래슀 λ‚΄λΆ€μ—μ„œ static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것이닀. 

 

class Person {
    constructor(name){
    	this.name = name;
    }
}
// 정적 λ©”μ„œλ“œ 방법 1 
Person.sayHi = function () {
    console.log('Hi')
}

class Person {
    constructor(name){
    	this.name = name;
    }
    
    // 정적 λ©”μ„œλ“œ 방법 2 
    static sayHi() {
    	console.log('Hi, I am' + this.name);
    }
}

// 정적 λ©”μ„œλ“œ 호좜 방법 
Person.sayHi();

 

정적 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— λ°”μΈλ”©λœ λ©”μ„œλ“œκ°€ 되며, ν΄λž˜μŠ€λŠ” ν΄λž˜μŠ€κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— ν•¨μˆ˜ 객체가 λ˜λ―€λ‘œ, 정적 λ©”μ„œλ“œλŠ” 클래슀 μ •μ˜ 이후에 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλ‹€. (λ³„λ„μ˜ 생성 κ³Όμ • ν•„μš” μ—†μŒ) 정적 λ©”μ„œλ“œλŠ” 클래슀둜 ν˜ΈμΆœν•˜λ©°, μΈμŠ€ν„΄μŠ€λ‘œ ν˜ΈμΆœν•  수 μ—†λ‹€. (μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인에 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ)

 

μ‰½κ²Œ 예λ₯Ό λ“€κΈ° μœ„ν•΄ μ•„λž˜μ˜ 그림을 보자. C λŠ” Child 클래슀 (λ˜λŠ” μƒμ„±μž ν•¨μˆ˜) κ°€ μƒμ„±ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ΄λ©°, C 의 [[Prototype]] λŠ” Child.prototype 이닀. 이 Child.prototype μ•ˆμ— contstructor 와 prototype Method κ°€ λ“€μ–΄μžˆλŠ” 것이며, Child μ•ˆμ— static Method κ°€ λ“€μ–΄μžˆλ‹€. Child λŠ” μƒμ„±μž ν•¨μˆ˜ / ν΄λž˜μŠ€μ΄κΈ°μ— [[Prototype]] 인 Parent 둜 Function.prototype λ₯Ό 가지며, Child.prototype λŠ” κ°μ²΄μ΄λ―€λ‘œ Parent 둜 Object.prototype λ₯Ό κ°–λŠ”λ‹€. 

 

 

λ”°λΌμ„œ 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ 각각 μ†ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 체인이 λ‹€λ₯΄λ©°, ν˜ΈμΆœν•˜λŠ” 주체도 λ‹€λ₯΄λ‹€. (this λ°”μΈλ”©μ˜ λŒ€μƒλ„ λ‹€λ₯Έλ°, 이 λ‚΄μš©μ„ 쑰금 더 μ•ŒκΈ° μœ„ν•΄μ„œλŠ” Javascript 의 this 포슀트λ₯Ό 읽어봐도 μ’‹λ‹€.)

πŸ’‘ [[Prototype]]
- ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  객체가 가지고 μžˆλŠ” 인터널 슬둯
- 객체의 μž…μž₯μ—μ„œ μžμ‹ μ˜ λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체

πŸ’‘ prototype ν”„λ‘œνΌν‹°
- ν•¨μˆ˜ 객체만 가지고 μžˆλŠ” ν”„λ‘œνΌν‹°μ΄
- ν•¨μˆ˜ 객체가 μƒμ„±μžλ‘œ μ‚¬μš©λ  λ•Œ 이 ν•¨μˆ˜λ₯Ό 톡해 생성될 객체의 λΆ€λͺ¨ 역할을 ν•˜λŠ” 객체(ν”„λ‘œν† νƒ€μž… 객체)

 

πŸ’‘ 정적 λ©”μ„œλ“œ 더 μ•Œμ•„κ°€κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” μ—¬λŸ¬ ν‘œμ€€ 빌트인 객체 (μ „μ—­μ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 객체) 듀이 μ‘΄μž¬ν•œλ‹€. Math, Number, JSON, Object λ“±... μ΄λ“€μ—κ²Œλ„ μ—¬λŸ¬ 개의 정적 λ©”μ„œλ“œλ“€μ΄ μ‘΄μž¬ν•˜λ©°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©λ˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ (utility function) 으둜 μ§€μΉ­λ˜κΈ°λ„ ν•œλ‹€.

 

κ°€λ Ή, Math κ°μ²΄μ—λŠ” max() λΌλŠ” 정적 λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜λŠ”λ°, 이 덕뢄에 this 바인딩이 이루어지지 μ•Šκ³  고유의 ν•¨μˆ˜ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 있게 λœλ‹€. λ§Œμ•½ max() κ°€ 정적 λ©”μ„œλ“œκ°€ μ•„λ‹ˆμ—ˆλ‹€λ©΄, Math 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 값에 따라 max() ν•¨μˆ˜μ˜ κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 것이닀. JSON.stringify(), Object.is() λ“±κ³Ό 같은 λ©”μ„œλ“œ λͺ¨λ‘ λ™μΌν•œ νŠΉμ§•μ„ 가지고 μžˆλ‹€. 

 

 

✨  ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€

클래슀λ₯Ό κ΅¬μ„±ν•˜κ³  λ‚˜λ©΄, 이 클래슀의 μΈμŠ€ν„΄μŠ€ (instance) λΌλŠ” 것을 λ§Œλ“€ 수 μžˆλ‹€κ³  ν–ˆλ‹€. μΈμŠ€ν„΄μŠ€λŠ” 무엇이며, μ–΄λ–»κ²Œ λ§Œλ“€ 수 μžˆλŠ” κ²ƒμΌκΉŒ? ν΄λž˜μŠ€κ°€ ν•˜λ‚˜μ˜ "개체ꡰ" 에 가깝닀면, μΈμŠ€ν„΄μŠ€λŠ” ν•΄λ‹Ή ꡰ에 μ†Œμ†λœ ν•˜λ‚˜μ˜ κ°œλ³„ "개체" 에 가깝닀. 

 

클래슀 μ•žμ— new μ—°μ‚°μžλ₯Ό λΆ™μ—¬ ν˜ΈμΆœν•˜λ©΄ λ‹€μŒ μˆœμ„œλ‘œ 일듀이 μ§„ν–‰λœλ‹€. 

 

1. 클래슀의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]] 호좜

2. 빈 객체 (μΈμŠ€ν„΄μŠ€) 생성

- [[Prototype]] 으둜 클래슀의 prototype κ°€ κ°€λ¦¬ν‚€λŠ” 객체 μ„€μ • (μœ„ 그림의 Child.prototype) 

- 빈 κ°μ²΄λŠ” this 에 바인딩

πŸ’‘ this λ°”μΈλ”©μ΄λž€ μ‹λ³„μžμ™€ 값을 μ—°κ²°ν•˜λŠ” 과정이닀.
λ³€μˆ˜κ°€ 선언될 λ–„, λ³€μˆ˜ 이름(μ‹λ³„μž)와 λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ μ—°κ²°λ˜λŠ”λ°, 이 κ³Όμ • μ—­μ‹œ 바인딩이닀.
this 바인딩은 this μ‹λ³„μžμ™€ this κ°€ 가리킬 값을 μ—°κ²°ν•˜λŠ” 과정이며, ν•¨μˆ˜ 호좜 방식 뿐만 μ•„λ‹ˆλΌ strict mode 에도 영ν–₯을 λ°›λŠ”λ‹€.

 

3. 클래슀의 constructor λ‚΄λΆ€ μ½”λ“œ μ‹€ν–‰

- this λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴 (바인딩)

- μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” (ν”„λ‘œνΌν‹° μΆ”κ°€, constructor 전달받은 μ΄ˆκΈ°κ°’μœΌλ‘œ κ°’ μ΄ˆκΈ°ν™”) 

4. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

- μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ this λ°˜ν™˜ (암묡적) 

 

class Person {
    constructor(name){
    // μΈμŠ€ν„΄μŠ€ 생성, this 바인딩, {} 
    	this.name = name; // this λ°”μΈλ”©λœ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” 
    // this λ°˜ν™˜ (암묡적), {name = name} 
    }
}

 

 

✨  ν΄λž˜μŠ€μ™€ ν”„λ‘œνΌν‹°

ν΄λž˜μŠ€κ°€ κ°–λŠ” ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜λŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ™€ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‘œ λ‚˜λ‰  수 μžˆλ‹€.

 

πŸ“ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°

μ•žμ„œ λ…Όμ˜ν•œ this 바인딩이 이루어진 λŒ€μƒμ˜ ν”„λ‘œνΌν‹°μ™€ 같은 값을 μ˜λ―Έν•˜λ©°, constructor λ‚΄λΆ€μ—μ„œ μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€. 이떄, μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” μ–Έμ œλ‚˜ public ν•œ μƒνƒœλ₯Ό κ°–λŠ”λ‹€. 즉, λͺ¨λ“  μ½”λ“œμ—μ„œ ν•΄λ‹Ή 값에 μ ‘κ·Όν•  수 μžˆλ‹€. 

 

πŸ“ μ ‘κ·Όμž ν”„λ‘œνΌν‹°

자체적으둜 값을 갖지 μ•Šκ³  λ‹€λ₯Έ ν”„λ‘œνΌν‹°μ˜ 값을 μ½κ±°λ‚˜ μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ ν”„λ‘œνΌν‹°λ‹€. 

 

const person = {
    firstName: 'Haeun',
    lastName: 'Kang',
    
    // μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ μ ‘κ·Όμž ν”„λ‘œνΌν‹°
    get fullName() {
    	return `${this.firstName} ${this.lastName}`
    }
}

console.log(person.fullName); // Haeun Kang

 

μ΄λŸ¬ν•œ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” ν΄λž˜μŠ€μ—μ„œλ„ λ‹€μŒκ³Ό 같이 μ‚¬μš©λ  수 μžˆλ‹€. 

 

class Person = {
    constructor(first, last) {
        this.firstName: first,
        this.lastName: last,
    }
    
    get fullName() {
    	return `${this.firstName} ${this.lastName}`;
    }
    
    set fullName(name) {
    	[this.firstName, this.lastName] = name.split(' ');
    }
}

const me = new Person('Haeun', 'Kang');

me // {firstName: 'Haeun', lastName: 'Kang'}
me.fullName // 'Haeun Kang'
me.fullName = 'Haeun Kim'
me.fullName // 'Haeun Kim'
me // {firstName: 'Haeun', lastName: 'Kim'}

 

μœ„μ—λ„ λ‚˜μ™”λ‹€μ‹œν”Ό, μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” 자체적으둜 값을 갖지 μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ μ ‘κ·Όμž ν•¨μˆ˜ (getter, setter ν•¨μˆ˜) 둜 κ΅¬μ„±λ˜μ–΄, λ‹€λ₯Έ 데이터 ν”„λ‘œνΌν‹°μ˜ 값을 μ½κ±°λ‚˜ μ €μž₯ν•œλ‹€. μ΄λ•Œ μ ‘κ·Όμž ν•¨μˆ˜μ˜ 이름은 μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ²˜λŸΌ μ‚¬μš©λ˜μ–΄, ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœλ˜λŠ” 것이 μ•„λ‹ˆλΌ ν”„λ‘œνΌν‹°μ²˜λŸΌ μ°Έμ‘°ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ‚¬μš©λœλ‹€. 

πŸ’‘ getter ν•¨μˆ˜
- get ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜
- ν”„λ‘œνΌν‹° 값을 μ ‘κ·Όν•˜μ—¬ 값에 λŒ€ν•΄ 무언가 μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©
- λ°˜λ“œμ‹œ λ°˜ν™˜κ°’ μžˆμ–΄μ•Ό 함

πŸ’‘ setter ν•¨μˆ˜  
- set ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜
- ν”„λ‘œνΌν‹° 값을 ν• λ‹Ήν•  λ•Œ μ‚¬μš© 
- λ°˜λ“œμ‹œ λ§€κ°œλ³€μˆ˜ μžˆμ–΄μ•Ό 함 

 

 

✨  κ²°λ‘ 

클래슀λ₯Ό μ‚¬μš©ν•˜κΈ°μ— μ•žμ„œ ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€μ˜ 관계, 그리고 ν”„λ‘œν† νƒ€μž… 체인을 μ΄ν•΄ν•˜λŠ” 것은 생각보닀 μ€‘μš”ν•˜λ‹€. μ–΄λ–€ λ©”μ„œλ“œλ₯Ό μ •μ˜ν–ˆλŠ”λ° λ©”μ„œλ“œ μœ ν˜•μ— 따라 λ‹€λ₯Έ ν”„λ‘œν† νƒ€μž… 체인에 속해, μ‚¬μš©ν•˜μ§€ λͺ»ν•  수 μžˆκΈ°λ„ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ˜ν•œ 클래슀의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό 잘 이해해 두어야 μ°¨ν›„ 객체지ν–₯의 κ°œλ…μ„ 깊게 λ“€μ–΄κ°€κ±°λ‚˜, μ˜μ‘΄μ„± μ£Όμž…κ³Ό 같은 μ€‘μš” κ°œλ…μ„ λ‹€λ£° λ•Œ 쑰금 더 λΉ λ₯΄κ²Œ 지식을 μŠ΅λ“ν•  수 μžˆλ‹€. 

 

 

✨  참고자료

 

λŒ“κΈ€