์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฝƒ composition(๋ถ€์ œ: ์ƒ์†์˜ ๋ฌธ์ œ์ )

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฝƒ composition(๋ถ€์ œ: ์ƒ์†์˜ ๋ฌธ์ œ์ )

    Favor Composition over inheritance "์ƒ์† ๋Œ€์‹ ์— ์ปดํฌ์ง€์…˜(๋œป: ๊ตฌ์„ฑ์š”์†Œ๋“ค, ๊ตฌ์„ฑ)์„ ๋” ์„ ํ˜ธํ•˜์„ธ์š”." ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ OOP์˜ ๊ฝƒ, composition์„ ๋‹ค๋ฃจ๊ธฐ ์ „์— ์ƒ์†์˜ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋ฏธ๋ฆฌ ๋งํ•˜์ž๋ฉด, composition์€ ๋ณต์žกํ•˜๊ฒŒ ์ƒ์†์˜ ์ˆ˜์ง ๊ตฌ์กฐ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๋Œ€์‹ ์— ์ƒ์†์˜ ๋ ˆ๋ฒจ์„ ํ•œ ๋‹จ๊ณ„๋กœ๋งŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ๋ฌธ์ œ์ ๋„ ๋ฏธ๋ฆฌ ๋งํ•˜์ž๋ฉด, composition์šฉ์œผ๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ํด๋ž˜์Šค์™€ ๊ฐ€์ ธ์˜ค๋Š” ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์ปคํ”Œ๋ง์ด ๋„ˆ๋ฌด ์‹ฌํ•˜๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค.( ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ํด๋ž˜์Šค์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ž˜์Šค์— ๋“ค์–ด๊ฐ€์„œ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.-> ๋” ํ™•์žฅ์ด ์‰ฝ๊ณ  ์œ ์—ฐํ•œ ํ…Œํฌ๋‹‰์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์„..

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๋‹คํ˜•์„ฑ(polymorphism)์ด ๋ญ๊ฐ€ ์ข‹์€ ๊ฒƒ์ผ๊นŒ?

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๋‹คํ˜•์„ฑ(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๊ฐœ ์ด์ƒ์˜ ์ œ๋„ค๋ฆญ ์ ์šฉํ•ด๋ณด๊ธฐ(์ถ”๋ก , ๋ช…์‹œ, ํ”„๋กœ๋ฏธ์Šค ์ œ๋„ค๋ฆญ๊นŒ์ง€)

    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..