๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

    CSS์˜ ๊ฝƒ, Flexbox

    CSS์˜ ๊ฝƒ, Flexbox

    [CSS] ํ™”๋ฉด ์ค‘์•™ ๋ฐฐ์น˜ (Flexbox/Grid) | Engineering Blog by Dale Seo [CSS] ํ™”๋ฉด ์ค‘์•™ ๋ฐฐ์น˜ (Flexbox/Grid) Engineering Blog by Dale Seo www.daleseo.com ์ด๋ฒˆ์—์•ผ๋ง๋กœ CSS Flex๋ฅผ ์ตํ˜€๋ณด์ž ์ด ํŠœํ† ๋ฆฌ์–ผ์€ “์ฐจ์„ธ๋Œ€ CSS ๋ ˆ์ด์•„์›ƒ” ์‹œ๋ฆฌ์ฆˆ์˜ ์ฒซ๋ฒˆ์งธ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—์•ผ๋ง๋กœ CSS Flex๋ฅผ ์ตํ˜€๋ณด์ž ์ด๋ฒˆ์—์•ผ๋ง๋กœ CSS Grid๋ฅผ ์ตํ˜€๋ณด์ž ๋ฒŒ์จ๋ถ€ํ„ฐ ์Šคํฌ๋กค์˜ ์••๋ฐ•์ด ๋Š๊ปด์ง€๊ณ ,‘์ข€ ํŽธ์•ˆํ•˜๊ฒŒ ๋ˆ„ studiomeal.com *์—˜๋ฆฌ๋‹˜์˜ ๋ฌด๋ฃŒ ์œ ํŠœ๋ธŒ ์˜์ƒ์„ ๋ณด๊ณ  ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค! 1. flexbox๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฐ•์Šค์— ์ ์šฉ๋˜๋Š” ์†์„ฑ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๊ณ , ๊ทธ ์ปจํ…Œ์ด๋„ˆ ๋ฐ•์Šค ์•ˆ์— ์žˆ๋Š” ์•„์ดํ…œ๋“ค์— ์ ์šฉ๋˜๋Š” ์†์„ฑ๊ฐ’๋“ค๋„ ์กด์žฌ..

    Html/css ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ

    Html/css ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ

    0. ์•„์ด๋””์–ด/์›น ๋ ˆ์ด์•„์›ƒ ๋ธŒ๋ ˆ์ธ ์Šคํ† ๋ฐ https://excalidraw.com/ 1. ์‹ค์‹œ๊ฐ„ Html/css/js ์ ์šฉ์ƒํƒœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ JS Bin - Collaborative JavaScript Debugging 2. ์ƒ‰๊น”์„ ๊ณ ๋ฅด๊ณ  ์‹ถ์„ ๋•Œ, ์ƒ‰๊น” ๊ณ ๋ฅด๋ฉด uI ์ปฌ๋Ÿฌ ๋ฐฐ์น˜๊ตฌ์„ฑ๊นŒ์ง€ ๋ฏธ๋ฆฌ๋ณด์—ฌ์ค€๋‹ค Color Tool - Material Design 3. ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์›ํ•˜๋Š” ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝ, 16x16 / 32x32 / 64x64 / 128x128 / 256x256๋“ฑ https://www.iloveimg.com/ko 4. ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ํŒŒ๋น„์ฝ˜ ์ƒ์„ฑ https://www.websiteplanet.com/ 5. ๋””์ž์ด๋„ˆ๋“ค์ด ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฌด๋ฃŒ ์•„์ด์ฝ˜ ๋ชจ์Œ https://fontawesome.com/ svg t..

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฝƒ 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..

    [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํ˜ธ์ถœ ์‹œ๊ทธ๋‹ˆ์ฒ˜(ํƒ€์ž…์‹œ๊ทธ๋‹ˆ์ฒ˜)๋ž€?

    ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ž€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋งํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋งˆ๋‹ค ์‹œ๊ทธ๋‹ˆ์ณ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ ๋Œ€์ฒด์ ์œผ๋กœ ์•„๋ž˜์˜ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ๋งค๊ฐœ๋ณ€์ˆ˜(Parameter)์˜ ๊ฐœ์ˆ˜ (์˜ต์…”๋„) ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜• (์˜ต์…”๋„) ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์ž๋ฃŒํ˜• ๋งŒ์•ฝ ๋‘ ํ•จ์ˆ˜์˜ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜, ๊ทธ ํƒ€์ž…์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์ด ๋‘ ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜์˜ ์ „์ฒด ํƒ€์ž…์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• function sum(a: number, b: number): number { return a + b; } numberํƒ€์ž…์˜ ์ธ์ž ๋‘๊ฐœ๋ฅผ ๋ฐ›์•„ numberํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋œป์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜ ํƒ€์ž… ๋ฌธ๋ฒ• (a: number, b: number) => number ์ด๋Ÿฐ ์‹์˜ ํ‘œํ˜„์„ ํ˜ธ์ถœ ์‹œ..