์ ์ฒด ๊ธ
[ํ์ ์คํฌ๋ฆฝํธ] ๊ฐ์ฒด์งํฅ์ ๊ฝ composition(๋ถ์ : ์์์ ๋ฌธ์ ์ )
Favor Composition over inheritance "์์ ๋์ ์ ์ปดํฌ์ง์ (๋ป: ๊ตฌ์ฑ์์๋ค, ๊ตฌ์ฑ)์ ๋ ์ ํธํ์ธ์." ํ์ ์คํฌ๋ฆฝํธ OOP์ ๊ฝ, composition์ ๋ค๋ฃจ๊ธฐ ์ ์ ์์์ ๋ฌธ์ ์ ์ ๋ํด์ ๋จผ์ ์ ํ์๊ฐ ์๋ค. ๋ฏธ๋ฆฌ ๋งํ์๋ฉด, composition์ ๋ณต์กํ๊ฒ ์์์ ์์ง ๊ตฌ์กฐ๊ฐ ๊ธธ์ด์ง๋ ๋์ ์ ์์์ ๋ ๋ฒจ์ ํ ๋จ๊ณ๋ก๋ง ์ ์งํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฒ์ด๋ค. ๋ฌธ์ ์ ๋ ๋ฏธ๋ฆฌ ๋งํ์๋ฉด, composition์ฉ์ผ๋ก ๊ฐ์ ธ๋ค ์ฐ๋ ํด๋์ค์ ๊ฐ์ ธ์ค๋ ํด๋์ค ์ฌ์ด์ ์ปคํ๋ง์ด ๋๋ฌด ์ฌํ๋ค๋ ์ ์ด ์๋ค.( ๊ฐ์ ธ๋ค ์ฐ๋ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ค๋ฅธ ํด๋์ค๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ๊ฐ์ ธ๋ค ์ฐ๋ ํด๋์ค์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋์ค์ ๋ค์ด๊ฐ์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ค.-> ๋ ํ์ฅ์ด ์ฝ๊ณ ์ ์ฐํ ํ ํฌ๋์ ๋ค์ ํฌ์คํ ์..
[ํ์ ์คํฌ๋ฆฝํธ] ๋คํ์ฑ(polymorphism)์ด ๋ญ๊ฐ ์ข์ ๊ฒ์ผ๊น?
ํฌ์คํ ์ ๋ชฉ์ ํด๋ต์ ์๋ ์ฝ๋์ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋, ์ง์ํ๊ธฐ ์ด๋ ต๋ค๋ฉด ํฌ์คํ ๊ฐ์ฅ ์๋์ ๊ธฐ์ฌํด๋์๋ค! //ํํธ1 const machines = [ new CoffeMachine(25, 25), new CafeLatteMachine(15, 25, 25, "S1"), new saltCoffeeMachine(5, 10), new CoffeMachine(25, 25), new CafeLatteMachine(15, 25, 25, "S1"), new saltCoffeeMachine(5, 10), ]; machines.forEach((machine) => { console.log("------------์ปคํผ๋จธ์ ๊ฐ๋~!------------"); console.log(machine.makeCoffee(1..
[ํ์ ์คํฌ๋ฆฝํธ] ์ปคํผ๋จธ์ ํด๋์ค <-์์- ์นดํ๋ผ๋ผ๋จธ์ ํด๋์ค
์ปคํผ๋จธ์ ํด๋์ค๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์๋ค. type CoffeeCup = { orderShot: number; hasMilk: boolean; }; interface CoffeeMaker { makeCoffee(shots: number): CoffeeCup; } //์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์ด๋ค. class CoffeMachine implements CoffeeMaker { private static ONE_SHOT_CAPSULE: number = 3; private static ONE_CUP_WATER: number = 10; static makeMachine(beans: number, water: number): CoffeMachine { return new CoffeMachine(beans, wat..
[ํ์ ์คํฌ๋ฆฝํธ] OOP ๋คํ์ฑ, ์์ ๊ฐ๋ ํ์คํ๊ฒ ์ ๋ฆฌ
๋คํ์ฑ ์ ์ : ๋คํ์ฑ์ด๋ ํ๋์ ์ด๋ฆ(๋ฐฉ๋ฒ)์ผ๋ก ๋ง์ ์ํฉ์ ๋์ฒํ๋ ๊ธฐ๋ฒ์ด๋ค. ํจ๊ณผ : ๊ฐ๋ ์ ์ผ๋ก ๋์ผํ ์์ ์ ํ๋ ํจ์๋ค์ ๋๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์์ผ๋ฏ๋ก ์ฝ๋๊ฐ ๋ ๊ฐ๋จํด์ง๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ, ์ฝ๋ ๊ธธ์ด ๊ฐ์๊ฐ ๋์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋๋ก ๋์์ค๋ค. ์์ ์ค๋ช ์ ์กฐ๊ธ ๋ ํ์ด ์ค๋ช ํ์๋ฉด, ์๋์ ๊ฐ๋ค. ๋คํ์ฑ์ [์์]์์ ๋น๋กฏ๋๋ ํฐ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. ๋คํ์ฑ์ ์์์ ํตํด ๋์ผ ์ด๋ฆ์์๋ ๊ทธ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. ๋คํ์ฑ : ๊ฐ์ ์ด๋ฆ์ ๋ถ๋ ๋๋ฐ ๋ค๋ฅธ ํ์์ ํ๋ ๊ฒ(๊ฐ์ ๋์์ด์ง๋ง ๋ค๋ฅธ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์ด) [ํด๋์ค ์์] extends ํด๋์ค ์์์ ์ ์ด์ฉํ๋ฉด ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ฉด์, ์์ํด๋์ค์์๋ง ์กฐ๊ธ ๋ ์์ํด๋์ค์ ํน..
[ํ์ ์คํฌ๋ฆฝํธ] ์ ๋ค๋ฆญ ํ์ ๋ณ์นญ
type MyEvent = { target: T; type: string; }; type ButtonEvent = MyEvent; let myEvent: MyEvent = { target: "ํ๊ธธ๋์ด๋ฒคํธ", type: "click", }; type TimedEvent = { event: MyEvent; from: Date; to: Date; }; function trggerEvent(event: MyEvent): void { console.log(event); } trggerEvent({ target: "ํฉ์ง์ด์ด๋ฒคํธ", type: "mouseover", }); ์ ๋ค๋ฆญ ํ์ ๋ณ์นญ : ํ์ ๋ณ์นญ๊ณผ ํ ๋น ๊ธฐํธ(=) ์ฌ์ด์๋ง ์ ๋ค๋ฆญ ํ์ ์ ์ ์ธํ ์ ์๋ค. type MyEvent = { target: T; ty..
[ํ์ ์คํฌ๋ฆฝํธ] 2๊ฐ ์ด์์ ์ ๋ค๋ฆญ ์ ์ฉํด๋ณด๊ธฐ(์ถ๋ก , ๋ช ์, ํ๋ก๋ฏธ์ค ์ ๋ค๋ฆญ๊น์ง)
2๊ฐ ์ด์์ ์ ๋ค๋ฆญ ์ ์ฉํด๋ณด๊ธฐ ์ด์ function map(array: unknown[], f: (item: unknown) => unknown): unknown[] { let result = []; for (let i = 0; i U): U[] { let result = []; for (let i = 0; i < array.length; i++) { result[i] = f(array[i]); } return result; } : ์ธ์ ๋ฐฐ์ด ๋ฉค๋ฒ์ ํ์ ์ ๋๋ณํ๋ T, ๋ฐํ ๋ฐฐ์ด ๋ฉค๋ฒ ํ์ ์ ๋๋ณํ๋ U..
[ํ์ ์คํฌ๋ฆฝํธ] ํจ์ํธ์ถ ์๊ทธ๋์ฒ์ ์ ๋ค๋ฆญ
function filter(array: T[], f: (item: T) => boolean): T[] { let result = []; // tslint:disable-next-line: prefer-for-of for (let i = 0; i boolean): T[] }; let names = [{ ์ด๋ฆ: "smith" }, { ์ด๋ฆ: "kate" }, { ์ด๋ฆ: "max" }]; //1. T๋ number๋ก ํ์ ๋จ console.log(filte..