javascript/λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ

2.2 class의 κΈ°λ³Έ μ„ μ–Έ

λŒ•λŒ•μ΄λ°œπŸΎ 2018. 12. 5. 17:15



이전 ν¬μŠ€νŒ…μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반의 μ–Έμ–΄λΌλŠ” 말을 ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. 그리고 es6μ—μ„œ μΆœν˜„ν•œ class λ˜ν•œ 이 기반 μœ„μ—μ„œ λ³€ν™”λœ ν˜•νƒœμž…λ‹ˆλ‹€. κ·ΈλŸΌ 기쑴의 ν”„λ‘œν† νƒ€μž…μœΌλ‘œλŠ” μ–΄λ–€μ‹μœΌλ‘œ 클래슀λ₯Ό ν‘œν˜„ν–ˆλŠ”μ§€ λΉ„κ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

(이 글은 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.)


class.js


1
2
3
4
5
6
7
8
function Cat(name) {
  this.name = name;
}
 
Cat.prototype.speak = function () {
  console.log(this.name + ' makes a noise.');
};
 
cs




이와같이 function으둜 μž‘μ„±μ„ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μœ„ μ½”λ“œλ₯Ό 보면 Catμ΄λΌλŠ” ν•¨μˆ˜κ°€ 있고 κ·Έ ν•¨μˆ˜(객체)λ₯Ό cλΌλŠ” λ³€μˆ˜μ— μ„ μ–Έν•©λ‹ˆλ‹€.

그럼 c λ³€μˆ˜λŠ” Cat μžλ£Œν˜•μ— μžˆλŠ” speakλΌλŠ” ν•¨μˆ˜μ— 접근이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. μ•„λ§ˆ classλ₯Ό μ•„μ‹œλŠ” 뢄듀이라면 new μ—°μ‚°μž μ–˜κΈ°λ₯Ό 많이 듀어보셨을 κ²λ‹ˆλ‹€. μ“°λŠ” 방법은 λ‹€λ₯Έλ° 거의 기쑴에 μ•Œλ˜ classλž‘ λΉ„μŠ·ν•˜κ²Œ λ™μž‘μ„ ν•˜κ³  있죠.


그럼 es6에 μΆ”κ°€λœ classλ‘œλŠ” μ–΄λ–»κ²Œ λ°”λ€ŒλŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


class.js

1
2
3
4
5
6
7
8
9
class Cat{
    constructor(name) {
        this.name = name;
    }
    speak() {
        console.log(this.name + ' makes a noise.');
    }
}
 
cs


λ˜‘κ°™μ€ λ™μž‘μ„ ν•˜λŠ”λ° 기쑴에 class에 λŒ€ν•œ κ°œλ…μ„ μ’€ μ•ˆλ‹€λ©΄ 이해가 λ˜λŠ” ꡬ문으둜 λ°”κΌˆμŠ΅λ‹ˆλ‹€. 


Constructor에 λŒ€ν•œ μ„€λͺ…은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Constructor (μƒμ„±μž)μ„Ήμ…˜

constructor λ©”μ†Œλ“œλŠ” class λ‘œ μƒμ„±λœ 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ†Œλ“œμž…λ‹ˆλ‹€.  "constructor" λΌλŠ” 이름을 κ°€μ§„ νŠΉμˆ˜ν•œ λ©”μ†Œλ“œλŠ” 클래슀 μ•ˆμ— ν•œ 개만 μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν΄λž˜μŠ€μ— ν•œ 개λ₯Ό μ΄ˆκ³Όν•˜λŠ” constructor λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€λ©΄, SyntaxError κ°€ λ°œμƒν•  κ²ƒμž…λ‹ˆλ‹€.


class에 λŒ€ν•œ μ–˜κΈ°λ₯Ό ν•  λ•Œ κΌ­ λ‚˜μ˜€λŠ” 단어가 상속 μ΄λΌλŠ” λ‹¨μ–΄μΈλ°μš” 기쑴에 μž‘μ„±λœ 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 방법이죠.

μžλ°”μ—μ„œλŠ” extendsλΌλŠ” ν‚€μ›Œλ“œλ‘œ 클래슀λ₯Ό μƒμ†λ°›λŠ”λ°μš” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ™μΌν•©λ‹ˆλ‹€.


class.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}
 
class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}
cs



Animalμ΄λΌλŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό μƒμ†λ°›λŠ” Dog 클래슀λ₯Ό μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λͺ¨λ“  동물은 이름을 κ°–μ§€λ§Œ μšΈμŒμ†Œλ¦¬λŠ” λ™λ¬Όλ§ˆλ‹€ μƒμ΄ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μžμ‹ν΄λž˜μŠ€μ—μ„œ speak() ν•¨μˆ˜μ— λŒ€ν•œ λ‚΄μš©λ§Œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©μ„ ν•˜λ©΄ 적어도 이 μ½”λ“œμ—μ„œλŠ” μƒμ„±μžλ₯Ό μ€‘λ³΅ν•΄μ„œ μ •μ˜ν•΄μ•Όν•˜λŠ” μ½”λ“œμ€‘λ³΅μ„ ν”Όν•  수 있게 λ©λ‹ˆλ‹€. class의 μ‚¬μ΄μ¦ˆκ°€ 컀지고 μ€‘λ³΅λ˜λŠ” 뢀뢄이 λ§Žλ‹€λ©΄ ꡉμž₯히 효율적이겠죠.

λ˜ν•œ super ν‚€μ›Œλ“œλ₯Ό 톡해 μžμ‹ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}
 
class Dog extends Animal {
  speak() {
    super.speak();
    console.log(this.name + ' barks.');
  }
}
cs

Dog ν΄λž˜μŠ€λŠ” Animal 클래슀λ₯Ό μƒμ†λ°›μ•˜μœΌλ―€λ‘œ super ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ Animal 클래슀의 speak ν•¨μˆ˜κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ 해보신 뢄듀이라면 거의 λ™μΌν•œ λͺ¨μ–‘을 ν•˜κ³ μžˆκΈ°λ•Œλ¬Έμ— 더 μ‰½κ²Œ 이해가 가싀거라 μƒκ°ν•©λ‹ˆλ‹€.