μ±… 리뷰/λ¦¬νŒ©ν† λ§(μžλ°”μŠ€ν¬λ¦½νŠΈνŒ)

[λ¦¬νŒ©ν„°λ§ 2판] 12.11 슈퍼클래슀λ₯Ό μœ„μž„μœΌλ‘œ λ°”κΎΈκΈ°

Rainbow🌈Coder 2022. 12. 6. 18:23
728x90

1.  슈퍼클래슀λ₯Ό μœ„μž„μœΌλ‘œ λ°”κΎΈμ–΄μ•Ό ν•  λ•Œ

κΈ°λŠ₯을 μ˜¨μ „νžˆ μ‚¬μš©ν•  수 μ—†κ³  μ–΄μšΈλ¦¬μ§€ μ•Šμ€ 클래슀λ₯Ό μƒμ†ν–ˆμ„ λ•Œ,
상속을 λ¨Όμ € μ μš©ν–ˆλ‹€κ°€ λ¬Έμ œκ°€ 생겼을 λ•Œ

객체 μ§€ν–₯μ—μ„œ 상속이 ν˜Όλž€κ³Ό λ³΅μž‘λ„λ₯Ό ν‚€μšΈ μˆ˜λ„ μžˆλ‹€.

상속을 잘λͺ» μ μš©ν•œ μ˜ˆλ‘œλŠ” μžλ°”μ˜ μŠ€νƒ ν΄λž˜μŠ€κ°€ 유λͺ…ν•˜λ‹€. μžλ°”μ˜ μŠ€νƒμ€ 리슀트λ₯Ό μƒμ†ν•˜κ³  μžˆλŠ”λ°,

데이터λ₯Ό μ €μž₯ν•˜κ³  μ‘°μž‘ν•˜λŠ” 리슀트의 κΈ°λŠ₯을 μž¬ν™œμš©ν•˜κ² λ‹€λŠ” 생각이 μ΄ˆλž˜ν•œ κ²°κ³Όλ‹€. 

 

μ΅œμ•…μ€

리슀트(슈퍼클래슀)의 μ—°μ‚° 쀑 μŠ€νƒ(μ„œλΈŒν΄λž˜μŠ€)μ—λŠ” μ μš©λ˜μ§€ μ•ŠλŠ” 게 λ§ŽμŒμ—λ„ κ·Έ λͺ¨λ“  연산이 μŠ€νƒ μΈν„°νŽ˜μ΄μŠ€μ— κ·ΈλŒ€λ‘œ λ…ΈμΆœλœλ‹€λŠ” 것

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 : μ„œλΈŒ ν΄λž˜μŠ€λŠ” 슈퍼 클래슀 자리λ₯Ό λŒ€μ²΄ν•˜λ”λΌλ„ 잘 λ™μž‘ν•΄μ•Ό ν•œλ‹€. 

μžλ°”μ˜ μŠ€νƒμ²˜λŸΌ, 슈퍼클래슀의 κΈ°λŠ₯듀이 μ„œλΈŒν΄λž˜μŠ€μ— μ–΄μšΈλ¦¬μ§€ μ•ŠλŠ”λ‹€λ©΄ κ·Έ κΈ°λŠ₯듀을 상속을 톡해 μ΄μš©ν•˜λ©΄ μ•ˆλœλ‹€λŠ” μ‹ ν˜Έλ‹€.

이닀.

 

μ œλŒ€λ‘œ 된 상속이라면 μ„œλΈŒν΄λž˜μŠ€κ°€ 슈퍼클래슀의 λͺ¨λ“  κΈ°λŠ₯을 μ‚¬μš©ν•¨μ€ λ¬Όλ‘ , μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 슈퍼클래슀의 μΈμŠ€ν„΄μŠ€λ‘œλ„ μ·¨κΈ‰ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

λ”°λΌμ„œ, μŠ€νƒμ—μ„œ 리슀트 객체λ₯Ό ν•„λ“œμ— μ €μž₯해두고 ν•„μš”ν•œ κΈ°λŠ₯만 μœ„μž„ν–ˆλ‹€

λ©΄ 더 λ©‹μ‘Œμ„ 것이닀.

 

슈퍼/μ„œλΈŒ ν΄λž˜μŠ€λŠ” κ°•ν•˜κ²Œ κ²°ν•©λœ κ΄€κ³„λΌμ„œ 슈퍼클래슀λ₯Ό μˆ˜μ •ν•˜λ©΄ μ„œλΈŒν΄λž˜μŠ€κ°€ 망가지기 쉽기 λ•Œλ¬Έμ— μœ„μž„μœΌλ‘œ 바꾸기도 ν•œλ‹€.

λ‹€λ§Œ, μœ„μž„μ˜ 단점은 μœ„μž„μ˜ κΈ°λŠ₯을 μ΄μš©ν•  호슀트의 ν•¨μˆ˜ λͺ¨λ‘λ₯Ό 전달 ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λŠ” 점이닀. 전달 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” 것은 맀우 μ§€λ£¨ν•˜μ§€λ§Œ μ•„μ£Ό λ‹¨μˆœν•΄μ„œ λ¬Έμ œκ°€ 생길 κ°€λŠ₯성은 적닀.

 

 

2. 절차 및 효과

(1) 슈퍼 클래슀 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” ν•„λ“œλ₯Ό μ„œλΈŒν΄λž˜μŠ€μ— λ§Œλ“ λ‹€.(슈퍼 ν΄λž˜μŠ€κ°€ μœ„μž„ 객체가 될 κ²ƒμ΄λ―€λ‘œ 이 ν•„λ“œλ₯Ό 'μœ„μž„μ°Έμ‘°'라 λΆ€λ₯΄μž)

(2) 슈퍼 클래슀의 λ™μž‘ 각각에 λŒ€μ‘ν•˜λŠ” 전달 ν•¨μˆ˜λ₯Ό μ„œλΈŒν΄λž˜μŠ€μ— λ§Œλ“ λ‹€(λ¬Όλ‘  μœ„μž„ 참쑰둜 μ „λ‹¬ν•œλ‹€) μ„œλ‘œ κ΄€λ ¨λœ ν•¨μˆ˜λΌλ¦¬ 그룹으둜 λ¬Άμ–΄ μ§„ν–‰ν•˜λ©°, 그룹을 ν•˜λ‚˜μ”© λ§Œλ“€ λ•Œλ§ˆλ‹€ ν…ŒμŠ€νŠΈν•œλ‹€.

 

Before

class List {//...}
class Stack extends Lists {//...}

After

class Stack {
	constructor(){
    	this._storage = new List();
    }
    //μ΄λ ‡κ²Œ ν•˜λ©΄ 이제 Stack은 List와 상관없이 μ›ν•˜λŠ” Api듀을 외뢀에 λ…ΈμΆœν•  수 μžˆλ‹€.
    
    pop(){//...}
    
    push(){//...}
}

class List {//...}

 

μœ„μž„μ„ μ΄μš©ν•˜μ—¬ κΈ°λŠ₯의 μΌλΆ€λ§Œ 빌렀였고, μ„œλ‘œ λ³„κ°œμΈ κ°œλ…μž„μ΄ λͺ…ν™•ν•΄μ§„λ‹€.

3.  μ˜ˆμ‹œ

상속을 끊고 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μœ„μž„μ„ λ°›μœΌλ €λ©΄ μƒμœ„ 클래슀 받을 λ³€μˆ˜λ₯Ό ν•„λ“œκ°’μœΌλ‘œ μ„ μ–Έν•˜λ©΄ λœλ‹€.]

그리고 μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€.

 

<1> λ¦¬νŒ©ν† λ§ μ „

 

class CatalogItem {
	constructor(id, title, tags) {
		this._id = id;
		this._title = title;
		this._tags = tags;
	}

	get id() {
		return this._id;
	}

	get title() {
		return this._title;
	}
}

class Scroll extends CatalogItem {
	constructor(id, title, tags, dateLastCleaned) {
		super(id, title, tags);
		this._lastCleaned = dateLastCleaned;
	}

	needsCleaning(targetDate) {
		const threshold = this.hasTag('revered') ? 700 : 1500;
        
        return this.daysSinceLastCleaning(targetData) > threshold; 
	}
}

 

<2> λ¦¬νŒ©ν† λ§ ν›„ 

 

class CatalogItem {
	constructor(id, title, tags) {
		this._id = id;
		this._title = title;
		this._tags = tags;
	}

	get id() {
		return this._id;
	}

	get title() {
		return this._title;
	}
}


class Scroll {
	#catalogItem;
	constructor(id, dateLastCleaned, catalogId, , catalog) {
		this._id = id;
		this._catalogItem = catalog.get(catalogId); //Repository νŒ¨ν„΄
		this._lastCleaned = dateLastCleaned;
	}

	get id() {
		return this.id;
	}

	get title() {
		return this._catalogItem.title;
	}

	needsCleaning(targetDate) {
		const threshold = this.hasTag('revered') ? 700 : 1500;
		return this.daysSinceLastCleaning(targetData) > threshold;
	}
}

 

정리

  • 상속을 끊으렀면 μœ„μž„μ„ μ‚¬μš©ν•˜μž!
  • λΆ€λͺ¨ 클래슀λ₯Ό ν•„λ“œκ°’μ„ μ„ μ–Έν•˜μž!

 

μ°Έκ³  λ¬Έν—Œ : https://m.blog.naver.com/fbfbf1/222892773497

https://vvs1.tistory.com/157

728x90