[Deep Dive] Class

link717Β·2021λ…„ 9μ›” 26일
0

Deep Dive

λͺ©λ‘ 보기
5/28
post-thumbnail

🌼 25.2 클래슀 μ •μ˜

ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ˜ μ •μ˜ν•œλ‹€. 클래슀 이름은 μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 파슀칼 μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€. classλŠ” μƒμ„±μž ν•¨μˆ˜μ²˜λŸΌ μ„ μ–Έλ¬Έ ν˜•νƒœ ν˜Ήμ€ ν‘œν˜„μ‹ ν˜•νƒœλ‘œ ν‘œν˜„ ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œ μ •μ˜λœ ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜μ΄λ©° new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

//클래슀 μ„ μ–Έλ¬Έ
class Person {};

//읡λͺ… 클래슀 ν‘œν˜„μ‹
const Animal = class {};

//κΈ°λͺ… 클래슀 ν‘œν˜„μ‹
//μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ €λ©΄ 클래슀λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
//MyClassλŠ” 클래슀 λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•œ μ‹λ³„μžλ‹€.
const Vegetable = class MyVegetable {};
  • 클래슀λ₯Ό ν‘œν˜„μ‹μœΌλ‘œ ν‘œκΈ°κ°€ κ°€λŠ₯ν•˜λ‹€λŠ” 것은 ν΄λž˜μŠ€κ°€ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 일급 κ°μ²΄λΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

  • 클래슀 λͺΈμ²΄μ—λŠ” 0개 μ΄μƒμ˜ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

    • constructor(μƒμ„±μž): μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ 특수 λ©”μ„œλ“œμ΄λ‹€. μ»¨μŠ€νŠΈλŸ­ν„° λ‚΄λΆ€μ—μ„œ this에 μΆ”κ°€ν•œ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°κ°€ λœλ‹€. 이 λ•Œ μ»¨μŠ€νŠΈλŸ­ν„° λ‚΄λΆ€μ˜ thisλŠ” ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀.

      • ν”„λ‘œν†  νƒ€μž… λ©”μ„œλ“œμ˜ constructorμ™€λŠ” 직접적인 관련이 μ—†μœΌλ©° constructorλŠ” λ©”μ„œλ“œλ‘œ ν•΄μ„λ˜μ§€ μ•Šκ³  ν•¨μˆ˜ 객체 μ½”λ“œμ˜ μΌλΆ€μ²˜λŸΌ λ™μž‘ν•œλ‹€.

      • μ»¨μŠ€νŠΈλŸ­ν„°λŠ” μƒλž΅μ΄ κ°€λŠ₯ν•˜λ©° μ»¨μŠ€νŠΈλŸ­ν„°λ₯Ό μƒλž΅ν•œ ν΄λž˜μŠ€λŠ” μ»¨μŠ€νŠΈλŸ­ν„°λ‘œ 인해 빈 객체λ₯Ό μƒμ„±ν•œλ‹€.

      • μ»¨μŠ€νŠΈλŸ­ν„°λŠ” λ³„λ„μ˜ λ°˜ν™˜λ¬Έμ„ 갖지 μ•ŠμœΌλ©° new μ—°μ‚°μžλ₯Ό 톡해 ν΄λž˜μŠ€κ°€ 호좜되면 μ•”λ¬΅μ μœΌλ‘œ thisλ₯Ό λ°˜ν™˜ν•œλ‹€.

    • ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ: μƒμ„±μž ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ prototypeμ΄λΌλŠ” ν‚€μ›Œλ“œ 없이 클래슀 λͺΈμ²΄μ œ μ •μ˜λœ λ©”μ„œλ“œλŠ” 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ‘œ λ™μž‘ν•œλ‹€.

      • function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μ„ μ‚¬μš©ν•œλ‹€.
    • μ •μ λ©”μ„œλ“œ: λ©”μ„œλ“œμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 정적 λ©”μ„œλ“œκ°€ λœλ‹€. 정적 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— λ°”μΈλ”©λœ λ©”μ„œλ“œλ‘œ μΈμŠ€ν„΄μŠ€μ™€ λ‹€λ₯΄κ²Œ 별닀λ₯Έ 생성 과정이 ν•„μš” μ—†μœΌλ©° μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ 클래슀둜 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

      • 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν†  νƒ€μž… λ©”μ„œλ“œλŠ” μžμ‹ μ΄ 속해 μžˆλŠ” ν”„λ‘œν† νƒ€μž… 체인이 λ‹€λ₯΄λ‹€.

      • 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μ—†μ§€λ§Œ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

🌼 25.6 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

1.μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩: new ν‚€μ›Œλ“œλ₯Ό 톡해 classκ°€ 호좜되면 μ•”λ¬΅μ μœΌλ‘œ 빈 객체가 μƒμ„±λ˜λ©° μƒμ„±λœ μΈμŠ€ν„΄μŠ€κ°€ this둜 바인딩 λœλ‹€.

2.μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”: μ»¨μŠ€νŠΈλŸ­ν„° λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©° μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜λŠ” λ“± μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

3.μΈμŠ€ν„΄μŠ€ λ°˜ν™˜: 클래슀의 λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisκ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λœλ‹€.

🌼 25.7 ν”„λ‘œνΌν‹°

λ‹€λ₯Έ 객체지ν–₯ μ–Έμ–΄μ²˜λŸΌ private, public, protected ν‚€μ›Œλ“œμ™€ 같은 μ ‘κ·Ό μ œν•œμžλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μΈμŠ€ν„΄μŠ€λŠ” μ–Έμ œλ‚˜ publicν•˜λ‹€.

  • μ™ΈλΆ€μ˜ 값을 μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•  ν•„μš”κ°€ μžˆλŠ” κ²½μš°μ—λŠ” constructor λ‚΄λΆ€μ—μ„œ thisλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

  • μ™ΈλΆ€μ˜ 값을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  클래슀 λͺΈμ²΄μ— 클래슀 ν•„λ“œλ₯Ό μ •μ˜ν•˜λŠ” 경우, this에 클래슀 ν•„λ“œλ₯Ό λ°”μΈλ”©ν•˜μ§€ μ•Šκ³  클래슀 ν•„λ“œμ— μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•  μˆ˜λ„ μžˆλ‹€.(ν˜„μž¬ 정식 ν‘œμ€€ μ‚¬μ–‘μœΌλ‘œ μŠΉκΈ‰λ˜μ§€λŠ” μ•Šμ•˜μœΌλ‚˜ μ΅œμ‹  λΈŒλΌμš°μ €, node.jsλŠ” μ„ μ œμ μœΌλ‘œ κ΅¬ν˜„ν•΄λ‘μ—ˆλ‹€.)

  • 클래슀 ν•„λ“œμ— λ©”μ„œλ“œλ„ ν• λ‹Ήν• (ν•¨μˆ˜ μ„ μ–Έ) 수 μžˆμœΌλ‚˜ μ΄λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ μ•„λ‹Œ ν•¨μˆ˜μ˜ ν”„λ‘œνΌν‹°λ‘œ λ™μž‘ν•˜λ―€λ‘œ ν΄λž˜μŠ€ν•„λ“œμ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” 것은 ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

🌼 25.7.4 private ν•„λ“œ μ •μ˜ μ œμ•ˆ

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μΊ‘μŠν™”λ₯Ό μ™„μ „ν•˜κ²Œ μ§€μ›ν•˜μ§€ μ•Šμ•„ λ‹€λ₯Έ 객체 지ν–₯ μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜λŠ” μ ‘κ·Ό μ œν•œμž ν‚€μ›Œλ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€λ§Œ μƒˆλ‘œμš΄ ν‘œμ€€ 사양이 μ œμ•ˆλ˜μ–΄ μžˆμ–΄ μ•„λž˜μ˜ ν‚€μ›Œλ“œλ₯Ό μ„ μ œμ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

  • privateν•„λ“œ 선두에 #을 뢙이며 μ°Έμ‘°ν• λ•Œλ„ #을 λΆ™νžˆλ©΄ private μ ‘κ·Ό μ œν•œμžμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œ private으둜 μ„ μ–Έλœ ν•„λ“œλŠ” 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. 단, μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.
class Animal {
  //private ν•„λ“œλŠ” 클래슀 λͺΈμ²΄μ— μ •μ˜ν•΄μ•Ό ν•œλ‹€.
  //μ΄ˆκΈ°κ°’μ„ μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ undefinedλ₯Ό κ°–λŠ”λ‹€.
  #age = 0;
  constructor(age) {
    this.#age = age;
  }

  //μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‘œ ν”„λ‘œνΌν‹°λ₯Ό 읽을 수 μžˆλ‹€.
  get age() {
    return this.#age;
  }
  
  //μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‘œ ν”„λ‘œνΌν‹° 값을 λ³€κ²½ν•  수 μžˆλ‹€.
  set age(newAge) {
    this.#age = newAge;
  }
}

let animal = new Animal(10);

console.log(animal.age); // 10
//μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν˜•νƒœμ΄μ§€λ§Œ ν”„λ‘œνΌν‹°λ₯Ό λ‹€λ£¨λŠ” κ²ƒμ²˜λŸΌ μ‚¬μš©ν•œλ‹€.
animal.age = 20;
console.log(animal.age); // 20

🌼 25.8 상속에 μ˜ν•œ 클래슀 ν™•μž₯

상속에 μ˜ν•œ 클래슀 ν™•μž₯은 κΈ°μ‘΄ 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ 클래슀λ₯Ό ν™•μž₯(extends)ν•˜μ—¬ μ •μ˜ν•˜λŠ” 것이닀. ν΄λž˜μŠ€λŠ” 상속을 톡해 κΈ°μ‘΄ 클래슀λ₯Ό ν™•μž₯ν•  수 μžˆλŠ” 문법이 기본적으둜 μ œκ³΅λ˜μ§€λ§Œ μƒμ„±μž ν•¨μˆ˜λŠ” 그렇지 μ•Šλ‹€. μƒμ†μœΌλ‘œ ν™•μž₯된 클래슀λ₯Ό μ„œλΈŒ 클래슀 λ˜λŠ” μžμ‹ 클래슀라고 λΆ€λ₯΄κ³  μ„œλΈŒ ν΄λž˜μŠ€μ— μƒμ†λœ 클래슀λ₯Ό 수퍼 클래슀 λ˜λŠ” λΆ€λͺ¨ 클래슀라고 λΆ€λ₯Έλ‹€.

  • extends ν‚€μ›Œλ“œλŠ” 클래슀뿐만 μ•„λ‹ˆλΌ μƒμ„±μž ν•¨μˆ˜λ₯Ό 상속받아 클래슀λ₯Ό ν™•μž₯ν•  μˆ˜λ„ μžˆλ‹€.

  • λ™μ μœΌλ‘œ 상속받을 λŒ€μƒλ₯Ό κ²°μ •ν•˜μ—¬ 클래슀λ₯Ό ν™•μž₯ν•  μˆ˜λ„ μžˆλ‹€.

    🌼 25.8.5 super ν‚€μ›Œλ“œ

    super ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœν•  μˆ˜λ„ 있고 this와 같이 μ‹λ³„μžμ²˜λŸΌ μ°Έμ‘°ν•  수 μžˆλŠ” νŠΉμˆ˜ν•œ ν‚€μ›Œλ“œμ΄λ‹€.

  • super 호좜: superλ₯Ό ν˜ΈμΆœν•˜λ©΄ 수퍼클래슀의 μ»¨μŠ€νŠΈλŸ­ν„°λ₯Ό ν˜ΈμΆœν•œλ‹€.

//수퍼 클래슀
class Base {
  constructor(a, b) {
    this.a = a;
    this.b = b;
  }
}

//μ„œλΈŒ 클래슀
class Derived extends Base {
  constructor(a, b, c) {
    //μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ μ»¨μŠ€νŠΈλŸ­ν„°λ₯Ό μƒλž΅ν•˜μ§€ μ•ŠλŠ” 경우, λ°˜λ“œμ‹œ superλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
    //super ν‚€μ›Œλ“œλŠ” λ°˜λ“œμ‹œ μ„œλΈŒν΄λž˜μŠ€ μ»¨μŠ€νŠΈλŸ­ν„° μ•ˆμ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
    super(a, b);
    //superλ₯Ό ν˜ΈμΆœν•˜κΈ° μ „μ—λŠ” this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
    this.c = c;
  }
}

const derived = new Derived(1, 2, 3);
console.log(derived) //Derived {a: 1, b: 2, c: 3}
  • super μ°Έμ‘°: super 클래슀λ₯Ό μ°Έμ‘°ν•˜λ©΄ μ„œλΈŒ 클래슀 λ©”μ„œλ“œ λ‚΄μ—μ„œ 수퍼 클래슀 λ¨Έμ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. μ£Όμ˜ν•  것은 λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μœΌλ‘œ μ •μ˜λœ ν•¨μˆ˜λ§Œμ΄ HomeObjectλ₯Ό 가지며, 이둜 인해 superλ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€λŠ” 것이닀.

좜처: λͺ¨λ˜ μžλ°” 슀크립트 Deep Dive-이웅λͺ¨

profile
Turtle Never stop

0개의 λŒ“κΈ€