์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    swift5.5 ์Šค๋ ˆ๋“œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ (async/await, Actor)

    ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๋˜๋Š” ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ณต์œ ๋œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” "๊ณ„์ขŒ ์ด์ฒด" ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ณ„์ขŒ ์ด์ฒด๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๊ณ„์ขŒ A์™€ B๊ฐ€ ์žˆ๊ณ , A ๊ณ„์ขŒ์—์„œ B ๊ณ„์ขŒ๋กœ ์ผ์ • ๊ธˆ์•ก์„ ์ด์ฒดํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. class BankAccount { private(set) var balance: Int init(balance: Int) { self.balance = balance } func deposit(_ amount: Int) { balance += amount } func withdraw(_ amount: Int) { balance -= amount } } func transfer(from accountA..

    modalPresentationStyle .fullScreen๊ณผ .overFullScreen์˜ ์ฐจ์ด์ 

    modalPresentationStyle์˜ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ ์ค‘ .fullScreen์€ ๋ชจ๋‹ฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ๋ถ€๋ชจ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋ชจ๋‹ฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™”๋ฉด ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•˜์—ฌ ๋ถ€๋ชจ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, .overFullScreen์€ ๋ชจ๋‹ฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ, ๋ถ€๋ชจ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋ณด์ด๋ฉฐ, ์ผ๋ถ€ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ฌ์ „ํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋‹ฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ, ๋ถ€๋ชจ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ผ๋ถ€ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ฌ์ „ํžˆ ๋ณด์ด๋ฉฐ ๋ฐฐ๊ฒฝ์€ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, .fullScreen์€ ๋ชจ๋‹ฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ๋ถ€๋ชจ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๋Š” ๋ฐ˜๋ฉด์—, .overFullScreen์€ ๋ชจ๋‹ฌ ๋ทฐ ..

    Swift 5.1 Static and class subscripts (SE-0254)

    Swift 5.1์—์„œ๋Š” static ๋ฐ class subscript๊ฐ€ ๋„์ž…๋˜์–ด ํด๋ž˜์Šค ๋ฐ ๊ตฌ์กฐ์ฒด์—์„œ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ(Subscript)๋ฅผ ์ •์˜ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜, ๋ฆฌ์ŠคํŠธ, ๋ฐฐ์—ด ๋“ฑ์˜ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋Š” ์ธ์Šคํ„ด์Šค ๋ ˆ๋ฒจ์—์„œ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Swift 5.1์—์„œ๋Š” static ๋ฐ class ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Static subscript static subscript๋Š” ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ํƒ€์ž… ์ž์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ธ์Šคํ„ด์Šค ์—†์ด ํƒ€์ž… ์ž์ฒด์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. static subscript๋Š” static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. struct TimesTabl..

    reason: 'Don't know about flushed view

    iOS์—์„œ addSubView ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ๋ทฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์„œ๋ธŒ๋ทฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์—ˆ๊ฑฐ๋‚˜, ์ด์ „์— ๋‹ค๋ฅธ ๋ทฐ์— ์ถ”๊ฐ€๋˜์—ˆ์„ ๊ฒฝ์šฐ, addSubView๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฏธ ์ œ๊ฑฐ๋œ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋ทฐ๊ฐ€ ์•„์ง ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์Šˆํผ ๋ทฐ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ๋ฅผ ๋ณด์ด๊ฒŒ ํ•˜๊ฑฐ๋‚˜ setNeedsDisplay ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋„๋ก ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋ทฐ๊ฐ€ ์Šˆํผ ๋ทฐ์™€ ์ด๋ฏธ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์ธต ๊ตฌ์กฐ์— ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์Šˆํผ ๋ทฐ์™€ ์ƒ๊ด€์—†๋Š” ๋ทฐ๋ฅผ ๋งŒ๋“ค๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋ทฐ..

    ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด(Decorator Pattern)

    ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด(Decorator Pattern)์ด๋ž€? ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ, ๊ธฐ์กด์˜ ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐ์„ฑ์ด ๋†’์€ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์˜ ๊ตฌ์„ฑ์š”์†Œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. Component: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์—์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ConcreteComponent: Component ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. Decorator: Component ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ๊ฐ์ฒด์˜ ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ConcreteDecorator: Decorator ํด..

    ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด(Adapter Pattern)

    ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ํŒจํ„ด์œผ๋กœ, ์‹ค์ œ๋กœ ๋งŽ์€ ๊ฒฝ์šฐ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. // ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค class ExternalLib { func doSomethingComplicated() { // ... } } // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ธํ„ฐํŽ˜์ด์Šค protocol MyLib { func doSomethingSimple() } // ์–ด๋Œ‘ํ„ฐ..

    ์ž„์‹œ๋ณ€์ˆ˜ ๋ถ„๋ฆฌ (Split Temporary Variable)

    ์ž„์‹œ ๋ณ€์ˆ˜ ๋ถ„๋ฆฌ๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ํŠน์ • ํ‘œํ˜„์‹์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๊ธธ์–ด์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์ง€๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ‘œํ˜„์‹์„ ์ž„์‹œ ๋ณ€์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Swift ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” ํ•™์ƒ๋“ค์˜ ์ˆ˜ํ•™ ์‹œํ—˜ ์„ฑ์ ์„ ํ‰๊ท  ๋‚ด๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. func calculateAverageScore(scores: [Int]) -> Double { var totalScore = 0 for score in scores { totalScore += score } return Double(totalScore) / Double(scores.count) } ์œ„ ์ฝ”๋“œ๋ฅผ ์ž„์‹œ ๋ณ€์ˆ˜ ๋ถ„๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ..

    ์ง๊ด€์  ์ž„์‹œ๋ณ€์ˆ˜ ์‚ฌ์šฉ (Introduce Explaining Variable)

    ์ง๊ด€์  ์ž„์‹œ๋ณ€์ˆ˜ ์‚ฌ์šฉ (Introduce Explaining Variable)์€ ์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์‹์ด๋‚˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ๋ช…๋ช…ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. func calculateTotalPrice(price: Double, count: Int) -> Double { var totalPrice = price * Double(count) if count > 10 { totalPrice *= 0.9 } return totalPrice } ์œ„ ์ฝ”๋“œ์—์„œ totalPrice๋Š” price์™€ count๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ, ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง๊ด€์ ์ธ ์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„..