[🐱 μžλ°”μŠ€ν¬λ¦½νŠΈ] 상속 ( Inheritance)

dsfasdΒ·2022λ…„ 9μ›” 21일
0

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 상속

🍎 μƒμ†μ˜ ν•„μš”μ„± -> κΈ°λŠ₯ ν™•μž₯

κ°œλ°œμ„ ν•˜λ‹€ 보면 기쑴에 μžˆλŠ” κΈ°λŠ₯을 가져와 μΆ”κ°€μ μœΌλ‘œ ν™•μž₯ν•΄μ•Ό ν•˜λŠ” 경우 ν•„μš”λ‘œ ν•œλ‹€.
μ΄λ•Œ 기쑴의 κΈ°λŠ₯을 가진 클래슀λ₯Ό λΆ€λͺ¨ 클래슀, μΆ”κ°€ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ—¬ ν™•μž₯된 클래슀λ₯Ό μžμ‹ν΄λž˜μŠ€ 둜 ν†΅μΉ­ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 상속은 λ‹€μŒκ³Ό 같은 λ°©λ²•λ“€λ‘œ κ΅¬ν˜„ 및 μ‚¬μš©ν•  수 μžˆλ‹€.

βœ… prototype chain ν˜•νƒœλ‘œ 직접 κ΅¬ν˜„
βœ… extends ν‚€μ›Œλ“œ μ‚¬μš©
βœ… super ν‚€μ›Œλ“œ μ‚¬μš©


🍎 prototype chain ν˜•νƒœλ‘œ 직접 κ΅¬ν˜„

prototype chain을 ν†΅ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 상속이 μ–΄λ–»κ²Œ μ΄λ€„μ§€λŠ”μ§€ ν™•μΈν•΄λ³΄μž.

상속 예제

function Ultra(){}
Ultra.prototype.ultraProp = true;

function Super(){}
Super.prototype = new Ultra();

function Sub(){}
Sub.prototype = new Super();

var o = new Sub();
console.log(o.ultraProp) // true

Ultra, Super, Sub μ„Έκ°œμ˜ μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€.

var o = new Sub();
μ„œλΈŒ 객체(o) λ₯Ό λ§Œλ“€μ—ˆμ„λ•Œ κ·Έ 객체의 ultraProp ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ©΄ trueκ°€ λ‚˜μ˜¨λ‹€.

ν•˜μ§€λ§Œ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ SubλŠ” ultraProp λ₯Ό κ°–κ³  μžˆμ§€ μ•Šλ‹€.
Sub의 λΆ€λͺ¨μΈ Super, Super의 λΆ€λͺ¨μΈ Ultraκ°€ κ°–κ³  μžˆλŠ” 값이닀.

즉, Ultra (μ΅œμƒμœ„) > Super > Sub
SubλŠ” Superλ₯Ό 상속받고, SuperλŠ” Ultraλ₯Ό μƒμ†λ°›λŠ” μ…ˆμ΄λ‹€.

λ”°λΌμ„œ Sub에 Ultra ν”„λ‘œνΌν‹°λ‘œ μ ‘κ·Όν–ˆμ„λ•Œ,
μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹€ν–‰ κ³Όμ • 쀑에 Sub에 μ •μ˜κ°€ μ•ˆλ˜μžˆλŠ” κ°’μ΄λ‹ˆ, μžλ™μœΌλ‘œ super에 κ·Έ 값을 κ°–κ³  μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

이와같이 λΆ€λͺ¨ μƒμ„±μžλ₯Ό 상속받기 λ•Œλ¬Έμ— μžμ‹ μƒμ„±μžμ—μ„œλŠ” 상속받은 값을 μ‚¬μš©ν•  수 있게 λœλ‹€.

κ²°κ΅­ prototype ν”„λ‘œνΌν‹°μ˜ 호좜이 μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ—°μ‡„μ μœΌλ‘œ μž‘μš©ν•˜λ©΄μ„œ 체인 ν˜•νƒœλ₯Ό 이룬 것을 확인할 수 μžˆλ‹€.
이λ₯Ό prototype chain 으둜 λΆ€λ₯Έλ‹€.

상속 예제 2

const Ultra = {
	ultraProp : true
};

const Super = {}
//Super.prototype = new Ultra();
Super.__proto__ = Ultra;

const Sub = {}
//Sub.prototype = new Super();
Sub.__proto__ = Super;


console.log(Sub.ultraProp) // true

λ‹€μŒκ³Ό 같이 μžμ‹μ˜ ν”„λ‘œν† νƒ€μž… 값에 __proto__ ν‚€μ›Œλ“œλ₯Ό 톡해 직접 λΆ€λͺ¨λ₯Ό ν• λ‹Ήν•΄μ£ΌλŠ” 방법도 μžˆλ‹€.


🍎extends ν‚€μ›Œλ“œμ˜ μ‚¬μš©

extends ν‚€μ›Œλ“œλŠ” 클래슀λ₯Ό λ‹€λ₯Έ 클래슀의 μžμ‹μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ class μ„ μ–Έ λ˜λŠ” class 식에 μ‚¬μš©ν•œλ‹€.

μ˜ˆμ‹œ) extends Date

class DateFormatter extends DateFormatter { 

  getFormattedDate() {
    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    return `${this.getDate()}-${months[this.getMonth()]}-${this.getFullYear()}`;
  }

}

console.log(new DateFormatter('August 19, 1975 23:15:30').getFormattedDate());
// expected output: "19-Aug-1975"

μžμ‹ 클래슀(DateFormatter) μ˜†μ— extends ν‚€μ›Œλ“œλ₯Ό 덧뢙여 λΆ€λͺ¨ 클래슀(DateFormatter) λ₯Ό ν™•μž₯ν•˜μ˜€λ‹€.

  • λ‚΄μž₯ 객체 (Number, BigInt, Math, Date λ“± )의 ν™•μž₯도 κ°€λŠ₯ν•˜λ‹€.

🍎super ν‚€μ›Œλ“œμ˜ μ‚¬μš©

super ν‚€μ›Œλ“œλŠ” λΆ€λͺ¨ 였브젝트의 ν•¨μˆ˜(λΆ€λͺ¨ μƒμ„±μž ν•¨μˆ˜)λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•œλ‹€.

μ˜ˆμ‹œ ) super(μΈμžκ°’1, μΈμžκ°’2);

class Polygon {
  constructor(height, width) {
    this.name = 'Polygon';
    this.height = height;
    this.width = width;
  }
  sayName() {
    console.log('Hi, I am a ', this.name + '.');
  }
}

class Square extends Polygon {
  constructor(length) {
    this.height; // 참쑰였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. superκ°€ λ¨Όμ € ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

    // μ—¬κΈ°μ„œ, λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μƒμ„±μžν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 높이값을 λ„˜κ²¨μ€λ‹ˆλ‹€.
    // Polygon의 길이와 높이λ₯Ό λ„˜κ²¨μ€λ‹ˆλ‹€.
    super(length, length);

    // μ°Έκ³ : νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ super() ν•¨μˆ˜κ°€ λ¨Όμ € ν˜ΈμΆœλ˜μ–΄μ•Ό
    // 'this' ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그렇지 μ•Šμ„ 경우 참쑰였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  }
}
profile
기둝을 μ •λ¦¬ν•˜λŠ” 곡간!

0개의 λŒ“κΈ€