Skip to content

Latest commit

ย 

History

History
495 lines (387 loc) ยท 47.7 KB

Swift.md

File metadata and controls

495 lines (387 loc) ยท 47.7 KB

Swift, OS ๋ฉด์ ‘์งˆ๋ฌธ ์ •๋ฆฌ




  • ํ”„๋กœํผํ‹ฐ์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋จผ์ € ์ €์žฅํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ๋˜๋Š” ์ƒ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜์ด๋ฉฐ ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ฐ€, ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„์— ์ดˆ๊ธฐํ™”๋˜๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ์ฒ˜์Œ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์—๋Š” ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์ด๊ธฐ๋•Œ๋ฌธ์— var๋กœ ์„ ์–ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ €์žฅํ”„๋กœํผํ‹ฐ์™€ ๋‹ฌ๋ฆฌ ์ €์žฅ ๊ณต๊ฐ„์„ ๊ฐ–์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์–ด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ํ”„๋กœํผํ‹ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ var๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ get-only๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ set-only๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ, ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ํƒ€์ž… ์ž์ฒด์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊นƒ๊ฐ’์ด ์žˆ์–ด์•ผํ•˜๋ฉฐ, ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜ ๋ชจ๋‘ ์„ ์–ธ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ ํƒ€์ž… var๋กœ๋งŒ ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , class๋กœ ์„ ์–ธ์‹œ์—๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, static์œผ๋กœ ์„ ์–ธํ•  ์‹œ์—๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • hugging, resistance์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋‘ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐฐ์น˜ํ•  ๋•Œ ๊ณต๊ฐ„์ด ๋‚จ์„ ๊ฒฝ์šฐ ๋ฌด์—‡์ด ์ปค์งˆ ์ง€ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด hugging priority ์ž…๋‹ˆ๋‹ค. A์˜ค๋ธŒ์ ํŠธ๋ฅผ 250์œผ๋กœ ์„ค์ •ํ•˜๊ณ  B์˜ค๋ธŒ์ ํŠธ๋ฅผ 251๋กœ ์„ค์ •ํ• ์‹œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋‚ฎ์€ A์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‚จ์€ ๊ณต๊ฐ„์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๊ทธ๋งŒํผ ์ปค์ง‘๋‹ˆ๋‹ค. resistance๋Š” ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๋•Œ ๋ฌด์—‡์ด ์ค„์–ด๋“ค์ง€ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด compression resistance priority์ž…๋‹ˆ๋‹ค. A์˜ค๋ธŒ์ ํŠธ๋ฅผ 750์œผ๋กœ ์„ค์ •ํ•˜๊ณ  B์˜ค๋ธŒ์ ํŠธ๋ฅผ 749๋กœ ์„ค์ •ํ•˜๋ฉด B์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


  • Intrinsic Size์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Intrinsic Size๋Š” ์ปจํ…์ธ ์˜ ๋ณธ์งˆ์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค. UILabel, UIButton, UISwitch, UITextField๋“ฑ์ด Intrinsic Size๋ฅผ ๊ฐ€์ง€๋ฉฐ UIView๋Š” Intrinsic Content Size๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • Left Constraint ์™€ Leading Constraint ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

leading์€ ํ…์ŠคํŠธ์˜ ์‹œ์ž‘์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. trailing์€ ํ…์ŠคํŠธ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ left๋Š” ๋‹จ์ˆœํžˆ ์™ผ์ชฝ, right๋Š” ์˜ค๋ฅธ์ชฝ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. RTL๊ณผ LTR ๋ชจ๋‘ ์›ํ™œํžˆ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„  leading, tailing์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


  • Safearea์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

iOS 11์—์„œ UIViewController์˜ topLayoutGuide์™€ bottomLayoutGuide๋Š” UIView์˜ safe area ์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ดํฐ X๋ถ€ํ„ฐ ์ƒ๋‹จ์˜ ๋…ธ์น˜์™€ ํ•˜๋‹จ์˜ ํ™ˆ๋ฐ”์—๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ถ€๋ถ„์„ ์ œ์™ธํ•œ ์ฝ˜ํ…์ธ ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


  • ํ”„๋กœ์„ธ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด, ์‹คํ–‰์„ ์œ„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๊ณ , ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์ˆœ๊ฐ„๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค๋ผ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ๊ฐ์˜ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค.


  • ์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์Šค๋ ˆ๋“œ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋™์ž‘๋˜๋Š” ์—ฌ๋Ÿฌ ์‹คํ–‰ ํ๋ฆ„์˜ ๋‹จ์œ„์œผ๋กœ ๊ฐ ์Šค๋ ˆ๋“œ๋“ค์€ ๋ณ„๋„์˜ Stack์„ ๊ฐ€์ง€๊ณ ์žˆ์œผ๋ฉฐ Code, Data, Heap์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.


  • ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‘๊ฐœ ์ด์ƒ ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์„œ(CPU)๊ฐ€ ํ˜‘๋ ฅ์ ์œผ๋กœ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ๋ถ„์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋…๋ฆฝ๋œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ ธ์•ผ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ๋œ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Context Switching ์‹œ CPU์˜ ๋ถ€๋‹ด๋„ ์ปค์ง€๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋‹จ์ ์ž…๋‹ˆ๋‹ค. ๋˜ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์  ๊ตฌ์กฐ๋กœ ์„œ๋กœ ์ž์› ๊ณต์œ ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.


  • Context Switching์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

์‹คํ–‰ํ•  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.


  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‘๊ฐœ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ž‘์—…์”ฉ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์€ ์“ฐ๋ ˆ๋“œ ๊ฐ„ Code, Data, Heap ์˜์—ญ์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Context Switching์ด ๋น ๋ฅด๋ฉฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์„ฑ ์ข…๋ฃŒ ์‹œ๊ฐ„๋„ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์ด ๊นŒ๋‹ค๋กœ์šด ๋ฐ˜๋ฉด์—, ์“ฐ๋ ˆ๋“œ๋“ค์€ stack์˜์—ญ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์˜์—ญ์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์‹  ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ๋•Œ๋ฌธ์— A์“ฐ๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๋ ค๋Š” ํž™ ์˜์—ญ์˜ ์ž์›์„ B๊ฐ€ ์ ‘๊ทผํ•ด์„œ ๋ฐ”๊พธ๋Š” ๋“ฑ ์ž์› ๊ณต์œ ์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋…๋ฆฝ์ ์ด์ง€ ์•Š์•„ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ์‹œ ์ „์ฒด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.


  • ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๋ฐ˜๋ฉด ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” Code, Data, Heap๋งŒ ๊ณต์œ ํ•˜๊ณ  Stack๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ํŠน์ง•์— ๋”ฐ๋ผ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ContextSwitching์‹œ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋ฉฐ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” Context Switching์ด ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— IPC๋ฅผ ํ†ตํ•ด ์ž์›์— ์ ‘๊ทผํ•ด์•ผํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” Code, Data, Heap์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ž์› ๊ณต์œ ๊ฐ€ ๋น„๊ต์  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ๋œ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „์„ฑ์ด ๋†’์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ „์ฒด ์“ฐ๋ ˆ๋“œ์— ์˜ํ–ฅ์ด ๊ฐ‘๋‹ˆ๋‹ค.


  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๋“ค์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์• ํ”Œ์ด ์ œ๊ณตํ•˜๊ณ ์žˆ๋Š” GCD์™€ NSOperation ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋จผ์ € GCD๋Š” ๋ฉ€ํ‹ฐ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ๋™์‹œ์„ฑ ์‹คํ–‰์„ ์ œ๊ณตํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค. ํ์˜ ์ข…๋ฅ˜, qos ์šฐ์„ ์ˆœ์œ„, sync, async๋ฅผ ์„ค์ •ํ•ด์„œ ์ง€์ •ํ•œ ์ž‘์—…์„ Dispatch Queue๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NSOperation์€ ํ•ด๋‹น ์ž‘์—…์˜ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด Operation๋“ค์„ ์ทจ์†Œ ํ˜น์€ ์ˆœ์„œ ์ง€์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • Mutable, Immutable์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Mutable์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ๋œปํ•˜๋ฉฐ, Immutable ๊ฐ์ฒด๋Š” ๋‚ด์šฉ์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.


  • struct์™€ class์™€ enum์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

struct๋Š” ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ stack์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. class๋Š” ๋‹จ์ผ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” Heap์— ์ €์žฅ๋˜๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ Stack์— ์ €์žฅ๋˜๋ฉฐ ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์ฐธ์กฐํƒ€์ž…์ด๋ฉฐ, ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. enum์€ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.


  • struct์™€ class์˜ ๊ณตํ†ต์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”์†Œ๋“œ ๋˜ํ•œ ์ •์˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , Extensionํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Protocol์„ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • let ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

let์œผ๋กœ ์„ ์–ธ๋œ ์ธ์Šคํ„ด์Šค๋Š”, ์ธ์Šคํ„ด์Šค์—์„œ ํ• ๋‹น๋œ stack ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Stack ์˜์—ญ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฐ’ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋“ค์˜ ์†์„ฑ์„ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Stack์˜์—ญ์— Heap์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋“ค์€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ๋งŒ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•  ๋ฟ ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๊ฐ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™, ์Šคํƒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜์—ญ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ binary ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋ฉฐ, Read-Only๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์˜์—ญ์—๋Š” ์ „์—ญ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘๊ณผ ๋™์‹œ์— ํ• ๋‹น๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ๋„์ค‘ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Read-Write๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํž™ ์˜์—ญ์—๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ’์ด ์ €์žฅ๋˜๋ฉฐ Swift๋Š” ARC๋ฅผ ํ†ตํ•ด ํž™์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค๋‹ˆ๋‹ค. ์Šคํƒ์—๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ๊ด€๊ณ„๋˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ ํ• ๋‹น๋˜๋ฉฐ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค.


  • Copy On Write๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ณต์‚ฌ ๋™์ž‘์„ ํ•  ๋•Œ, ์‹ค์ œ ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์ด ์ˆ˜์ •๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋‹ค๊ฐ€ ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ, ๊ทธ๋•Œ ๋ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


  • Convinience init์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Designated init์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์„œ, ์ด convenience init์•ˆ์—์„œ Designated init์„ ํ˜ธ์ถœํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. convenience init์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” designated init์ด ๋ฐ˜๋“œ์‹œ ๋จผ์ € ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


  • Any์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Any๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. value ํƒ€์ž…, Referenceํƒ€์ž…์ด๊ฑด ์ƒ๊ด€์—†์ด ์ €์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • AnyObject์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

AnyObject๋Š” ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ํƒ€์ž…์ด ์•„๋‹Œ ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, ํด๋กœ์ €๋Š” AnyObject์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • Optional ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„์žˆ๊ณ  nil์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. Optional ๋ณ€์ˆ˜์˜ ์„ ์–ธ์€ ?ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋””ํดํŠธ ๊ฐ’์€ nil์ž…๋‹ˆ๋‹ค.


  • ์˜ต์…”๋„ ์ฒด์ด๋‹์ด๋ž€?

์˜ต์…”๋„ ์ฒด์ด๋‹์ด๋ž€, ์˜ต์…”๋„์˜ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ, ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ต์…”๋„์ด ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ์˜ต์…”๋„ ์ฒด์ด๋‹์— ์„ฑ๊ณตํ•ด ๊ฐ’์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ต์…”๋„์ด nil์ด๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ณ ์‹ถ์€ ์˜ต์…”๋„๊ฐ’ ๋’ค์— ๋ฌผ์Œํ‘œ(?)๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘์˜ ๊ฒฝ์šฐ ์˜ต์…”๋„์ด nil์ผ ๋•Œ ๋ฒ—๊ธฐ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ—๊ธฐ๋ฉด nil์„ ๋ฆฌํ„ดํ•˜๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Struct ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๊ตฌ์กฐ์ฒด๋ž€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฅผ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…(named type)์ž…๋‹ˆ๋‹ค. structํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•˜๋ฉฐ ๋Œ€๋ฌธ์ž ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ์ •์˜ ํ›„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋งˆ์นจํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


  • Subscripts์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ฝœ๋ ‰์…˜, ๋ฆฌ์ŠคํŠธ, ์‹œํ€€์Šค ๋“ฑ ์ง‘ํ•ฉ์˜ ํŠน์ • member elements์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋Š” subscriptํ‚ค์›Œ๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. getter์™€ setter ๋ชจ๋‘ ๊ตฌํ˜„๊ฐ€๋Šฅํ•˜๋ฉฐ, get-only๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, set-only๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • String์€ ์™œ subscript๋กœ ์ ‘๊ทผ์ด ์•ˆ๋˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

String์€ Character์˜ Collection์ž…๋‹ˆ๋‹ค. Character๋Š” 1๊ฐœ ์ด์ƒ์˜ Unicode Scalar๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ String์€ ํ•˜๋‚˜์˜ ๊ฐ’์— ๋‹ค์–‘ํ•œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ Intํƒ€์ž…์œผ๋กœ ๊ธ€์ž๋“ค์„ ์ฐธ์กฐํ•˜๊ธฐ์—๋Š” ์–ด๋– ํ•œ ๋ทฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์• ๋งคํ•œ ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— String์€ ๋ณ„๋„๋กœ ์„ค๊ณ„๋œ String.index๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜์—ฌ ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


  • ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

func ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜๋ฉฐ func์œผ๋กœ ์„ ์–ธํ•œ ํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ์†์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.


  • instance ๋ฉ”์„œ๋“œ์™€ class ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋จผ์ € intstance ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ด€๋œ ๋ฉ”์„œ๋“œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ class ๋ฉ”์„œ๋“œ๋Š” ํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํƒ€์ž…์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • class ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

class ๋ฉ”์„œ๋“œ์™€ static ๋ชจ๋‘ Type ๋ฉ”์„œ๋“œ์ด์ง€๋งŒ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ์žˆ์–ด์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. static ๋ฉ”์„œ๋“œ๋Š” Subclass์—์„œ ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. class๋Š” static๊ณผ ๋ฐ˜๋Œ€๋กœ Subclass์—์„œ ํ•ด๋‹น ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.


  • Delegate ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

ViewController๋ฅผ ๋ณด๋ฉด, TableView์˜ ํŠน์ • ์…€์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฒ„ํŠผ ์ค‘ ํŠน์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ์— ํ•ด์•ผํ•  ์ผ์„ ViewController๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TableViewCell์ด ์„ ํƒ๋˜์—ˆ์„ ๊ฒฝ์šฐ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์€ TableView Delegate์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ ์žˆ์ง€๋งŒ, ์…€ ๋‚ด๋ถ€์˜ ํŠน์ • ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—” Custom Delegate๋ฅผ ๋งŒ๋“ค์–ด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • Singleton ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

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


  • KVO ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

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


  • Delegates์™€ Notification ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋จผ์ € ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๊ฐ์ฒด๊ฐ„์˜ ์†Œํ†ต์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ธ๋ฐ, ๋จผ์ € delegate๋Š” protocol์„ ์ •์˜ํ•˜๊ณ  ์ด ์ด๋ฒคํŠธ๋ฅผ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด๊ฐ€ ์ฑ„ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ธฐ๋•Œ๋ฌธ์— ์ฃผ๋กœ 1:1๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. notification ๋ฐฉ์‹์€ ์ด๋ฒคํŠธ๋ฅผ 1:N์œผ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. NotificationCenter๋ผ๋Š” ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์—ฌ๋ถ€๋ฅผ ์˜ต์ €๋ฒ„๋ฅผ ๋“ฑ๋กํ•œ ๊ฐ์ฒด์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด์—๊ฒŒ ์†์‰ฝ๊ฒŒ ์ด๋ฒคํŠธ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

protocol์€ ํŠน์ • ์ž‘์—…๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ, ํ”„๋กœํผํ‹ฐ ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ๋‹ค๋ฅธ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์˜ ์ฒญ์‚ฌ์ง„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, ํ”„๋กœํ† ์ฝœ์„ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์—์„œ ์ฑ„ํƒํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์ธ์ง€, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์ธ์ง€ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ์ง€, ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ์ง€ ๋ช…์‹œํ•ด์•ผํ•˜๊ณ  ๋ชจ๋‘ var๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


  • Hashable์ด ๋ฌด์—‡์ด๊ณ , Equatable์„ ์™œ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Hashable์€ ์ •์ˆ˜ hash๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ํ•ด์‹œ๊ฐ’์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์œ ์ผ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ๊ฐ’์ด ์œ ์ผํ•œ ๊ฐ’์ธ์ง€๋ฅผ ๋น„๊ตํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Equatable ํ”„๋กœํ† ์ฝœ์„ ์ƒ์† ๋ฐ›์•„ ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.


  • mutating ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Swift์—์„œ ๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๊ฐ’ ํƒ€์ž…์˜ ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’ ํƒ€์ž…์˜ ์†์„ฑ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ mutatingํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. func ํ‚ค์›Œ๋“œ ์•ž์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ’ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • ํƒˆ์ถœ ํด๋กœ์ €์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Swift์—์„œ๋Š” ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ํด๋กœ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ํด๋กœ์ €๋Š” ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ํ˜ธ์ถœ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , ์™ธ๋ถ€ ๋ณ€์ˆ˜/์ƒ์ˆ˜์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ํด๋กœ์ € ์•ž์— @escaping ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํด๋กœ์ €๋ฅผ ์™ธ๋ถ€ ๋ณ€์ˆ˜/์ƒ์ˆ˜์— ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์„œ ๋ฆฌํ„ด๋œ ์ดํ›„์—๋„ ํด๋กœ์ € ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • Extension์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Extension์ด๋ž€ ๊ธฐ์กด ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ํƒ€์ž…์— ์ƒˆ๋กœ์šด Property, Method, Initializer ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋งŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ, ํƒ€์ž… ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Class์—์„œ๋Š” Designated Initializer์™€ deinitializer๋Š” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, Convenience initializer๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Struct์—์„œ extension์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์‹œ์—๋Š” Memberwise Initializer๋ฅผ ๋ณด์กดํ•˜๋ฉฐ ์ƒˆ๋กœ์šด Initializer๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Where์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ฌ ๋•Œ๋งŒ ๊ธฐ๋Šฅ์„ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Extension ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ overrideํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฉ”์†Œ๋“œ๊ฐ€ Objective-C์™€ ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฉ”์†Œ๋“œ๋ฅผ Overrideํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, @objc ํ‚ค์›Œ๋“œ๋ฅผ func ์•ž์— ์ž‘์„ฑํ•ด์ฃผ๋ฉด Extension์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ overrideํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Objective-C์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Extension์—์„œ Override๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


  • ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—” ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ ‘๊ทผ์ œ์–ด์ž๋กœ๋Š” open, public, internal, fileprivate, private์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € private์€ ๊ฐ€์žฅ ํ•œ์ •์ ์ธ ๋ฒ”์œ„๋กœ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Fileprivate๋Š” Fileprivate์œผ๋กœ ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ๊ตฌํ˜„๋œ ์†Œ์ŠคํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Internal์€ ์ง์ ‘ ํ‘œ๊ธฐํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ์ ‘๊ทผ ์ˆ˜์ค€์œผ๋กœ ํ•ด๋‹น ๋ชจ๋“ˆ ์ „์ฒด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. public๊ณผ Open ๋ชจ๋‘ ์„ ์–ธํ•œ ๋ชจ๋“ˆ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • open๊ณผ public ํ‚ค์›Œ๋“œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

Open์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ์™€ ์„œ๋ธŒํด๋ž˜์‹ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Public ์ ‘๊ทผ์ž๋กœ ์„ ์–ธ๋œ ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ์™€ ์„œ๋ธŒํด๋ž˜์‹ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • fileprivate์„ ์„ค๋ช…ํ•˜๊ณ  ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€ ์ด์•ผ๊ธฐํ•ด๋ณด์„ธ์š”.

fileprivate์€ ๊ฐ™์€ ์†Œ์ŠคํŒŒ์ผ ๋‚ด์—์„œ์˜ ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋  ๋•Œ filprivate์œผ๋กœ ์ œํ•œํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.


  • fileprivate๊ณผ private์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

fileprivate์€ ๊ฐ™์€ ํŒŒ์ผ ๋‚ด๋ถ€์— ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ–ˆ์ง€๋งŒ, private์€ ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ์–ด๋„ private์œผ๋กœ ์„ ์–ธํ•œ ๋Œ€์ƒ์˜ ๊ตฌํ˜„๋ถ€ ๋‚ด๋ถ€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ๋Š” ๋™์ผํ•œ ์„ ์–ธ์˜ Extension์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • defer๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

defer๋ฌธ์ด ์†ํ•œ ํ•จ์ˆ˜ ์ข…๋ฃŒ ์ง์ „์— ์‹คํ–‰๋˜๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ defer๋ฌธ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์—ญ์ˆœ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ defer๋ฌธ์„ ๋งŒ๋‚˜๊ธฐ ์ „์— ์ข…๋ฃŒ๋œ๋‹ค๋ฉด ์Šคํƒ์— ์ €์žฅ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์Šค์ฝ”ํ”„ ์ข…๋ฃŒ ํ›„์—๋„ defer ๋ฌธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • defer๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๊ณ , defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

defer๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์Šคํƒ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— LIFO๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์„ ์–ธ๋œ ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋˜๋ฉฐ ์„ ์–ธ๋œ ์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. defer๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ defer๊ฐ€ ๋ถˆ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” throw๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. defer ๊ตฌ๋ฌธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ๋ฒ„๋ฆฌ๋ฉด ์Šคํƒ์— ์ €์žฅ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. guard๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ์ด์œ ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌํ„ด๊ฐ’์ด Never์ธ ๊ฒฝ์šฐ์—๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • Generic์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ œ๋„ค๋ฆญ์ด๋ž€ ํƒ€์ž…์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ฒ”์šฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ Type Parameter์˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜์—ฌ ํƒ€์ž…์— ์ƒ๊ด€์—†์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜•์—๋„ ์ œ๋„ค๋ฆญ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


  • Resultํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Resultํƒ€์ž…์€ success์™€ failure ๋‘ ๊ฐ€์ง€ case๊ฐ€ ์žˆ๋Š” enum์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ Failure์€ Error Protocol์„ ์ค€์ˆ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ throwing function์€ ์ •ํ™•ํžˆ ์–ด๋–ค ์—๋Ÿฌ ํ˜•์‹์„ ๋˜์ง€๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฐ˜๋ฉด Result Type์„ ํ™œ์šฉํ•˜๋ฉด ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์ด ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ž‘์—…์˜ ์„ฑ๊ณต์—ฌ๋ถ€์™€ ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Typealias์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

Typealias๋Š” ๊ธฐ์กด์— ์„ ์–ธ๋˜์–ด์žˆ๋Š” ์œ ํ˜•์— ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. Swift์—์„œ๋Š” typealias๋ฅผ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํฌ๊ฒŒ ๋‚ด์žฅ ์œ ํ˜•, ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•, ๋ณตํ•ฉ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.


  • Codable์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Codable์ด๋ผ๋Š” Typealias๋Š” Decodable๊ณผ Encodable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.


  • enum / function / closure ๊ฐ๊ฐ value type ์ธ๊ฐ€ reference type ์ธ๊ฐ€?

enum์€ ๊ฐ’ ํƒ€์ž…์ด๋ฉฐ function๊ณผ closure๋Š” ์ฐธ์กฐํƒ€์ž…์ž…๋‹ˆ๋‹ค.


  • Array, Dictionary, Set ๋“ฑ์˜ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์€ value type ์ธ๊ฐ€ reference type ์ธ๊ฐ€?

Struct๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.


  • Set์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

set์€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์ค‘๋ณต ์š”์†Œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ด์‹œ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์— ๋น„ํ•ด ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์ €์žฅ๋˜๋Š” ์ž๋ฃŒํ˜•์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Set๋„ ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ์™€ ๊ฐ™์€ Collection Type์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ตฌ์กฐ์ฒด๋กœ Stack์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


  • Swift์˜ upcasting๊ณผ downcasting์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

upcasting์€ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. as๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—… ์บ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ์บ์ŠคํŒ…ํ•˜์—ฌ ํ•ญ์ƒ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. downcasting์€ ์Šˆํผ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด ์บ์ŠคํŒ…์€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— as?, as! ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


  • as? ์™€ as! ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

as?๋Š” ์‹คํŒจํ•  ๊ฒฝ์šฐ nil์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. as!๋Š” ์‹คํŒจํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


  • == ์—ฐ์‚ฐ์ž์™€ === ์—ฐ์‚ฐ์ž๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

== ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ณ , === ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


  • Enum์—์„œ raw value์™€ associated value์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

raw value ์›์‹œ๊ฐ’์€ ๋ชจ๋“  ์ผ€์ด์Šค๊ฐ€ ๋™์ผํ•œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ , ์ผ€์ด์Šค๋‹น ๊ฐ’์„ ํ•˜๋‚˜๋ฐ–์— ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ ์ด ์žˆ๋Š”๋ฐ, ์—ฐ๊ด€ ๊ฐ’์€ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ผ€์ด์Šค์— ์„œ๋กœ ๋‹ค๋ฅธ ์—ฐ๊ด€๊ฐ’๋“ค์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. named tuple์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ํƒ€์ž…์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • inout์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

swift์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ˜•์‹ ์•ž์— inoutํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๊ฐ’์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ณ€์ˆ˜๋ช… ์™ผ์ชฝ์— & ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” inout ํ‚ค์›Œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ง„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„์—๋„ ์ด ๋ณ€ํ™˜๋œ ๊ฐ’์„ ์›๋ณธ ๋ณ€์ˆ˜์— ์ ์šฉ์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


  • ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์–ธ์ œ self๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ์š”?

ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์ด ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ๊ฒน์น  ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ์ž„์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ self๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Class์™€ Struct์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

Class์™€ Struct ๋ชจ๋‘ ๊ฐ’์„ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ฐ’์— .์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Extension์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, protocol์„ ์ฑ„ํƒํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Class๋Š” ์ฐธ์กฐํƒ€์ž…์ด๋ฉฐ, ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์—์„œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Struct๋Š” ๊ฐ’ ํƒ€์ž…์ด๋ฉฐ, ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • ๊ฐ•ํ•œ ์ฐธ์กฐ๋Š” ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

๊ฐ•ํ•œ ์ฐธ์กฐ๋Š” ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ์˜ ARC๋Š” ๊ฐ•ํ•œ ์ฐธ์กฐ์— ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ์Šค์œ„ํ”„ํŠธ์—์„œ ์ฐธ์กฐ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • strong, weak, unowned reference๋Š” ๊ฐ๊ฐ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด Strong reference๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. strong reference๋Š” ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. weak reference๋Š” ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. weak reference๋Š” ํ•ญ์ƒ var๋กœ ์„ ์–ธ๋˜๋Š” ์˜ต์…”๋„ ํƒ€์ž…์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. weak์œผ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ weak์„ ํ†ตํ•ด ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. unowned reference๋Š” weak๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  unowned๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” nil์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. unowned๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜๋ฉด unowned๋Š” nil์ด ์•„๋‹ˆ๋ผ ๋” ์ด์ƒ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ์ฃผ์†Œ๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๊ณ  unowned ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ unowned๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ณด๋‹ค ๋จผ์ € ํ•ด์ œ๋˜๋Š” ๊ฒƒ์ด ํ™•์‹คํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


  • Array, Set, Dictionary์˜ ์ฐจ์ด์ ์ด ๋ญ˜๊นŒ์š”?

Array๋Š” ๋ฆฌ์ŠคํŠธ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Set์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•ด ์ค‘๋ณต๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ต์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ ๋“ฑ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Dictionary๋Š” Key-Value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฝœ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์˜ Key๋กœ ์‚ฌ์šฉ๋  ํƒ€์ž…์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • required ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

required ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•„์ˆ˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๋ชจ๋“  ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ, required ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•  ๋•Œ์—๋„ required ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. required๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


  • Self์™€ self์˜ ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ์š”?

self๋Š” ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. Self๋Š” ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉ๋˜๋ฉด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•˜๊ณ , ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์—์„œ ์‚ฌ์šฉ๋˜๋ฉด ์‹ค์ œ ์„ ์–ธ์— ์‚ฌ์šฉ๋œ ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


  • Array๋ณด๋‹ค Set์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹์„ ๋•Œ๋Š” ์–ธ์ œ์ผ๊นŒ์š”?

์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต์—†์ด ๊ณ ์œ ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ๋•Œ Set์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Set์€ ์‚ญ์ œ, ์‚ฝ์ž…, ์กฐํšŒ๋ฅผ ๋ชจ๋‘ O(1)์— ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์‚ญ์ œ์™€ ์‚ฝ์ž…์ด ๋นˆ๋ฒˆํ•  ๋•Œ๋„ Set์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Trailing Closure์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๊ฐ€ ํด๋กœ์ € ํ‘œํ˜„์‹์„ ๋„˜๊ธฐ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์ด๋ฅผ ์ธ์ž๊ฐ’ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ํ•จ์ˆ˜์˜ ๋’ค์— ๊ผฌ๋ฆฌ์ฒ˜๋Ÿผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ธ์ž ๋ ˆ์ด๋ธ”์€ ์ƒ๋žต๋˜๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ด„ํ˜ธ () ๋’ค์— ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋กœ์ ธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


  • deinit์€ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

deinit์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์ „์— ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด deinit์— ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • DispatchQueue.main.async ์™€ DispatchQueue.main.sync ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

DispatchQueue.main.async๋Š” ๋“ฑ๋กํ•œ ์ž‘์—…์ด ๋๋‚˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋“ฑ๋ก ํ›„ ๊ณง๋ฐ”๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. DispatchQueue.main.sync๋Š” ๋“ฑ๋กํ•œ ์ž‘์—…์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ž‘์—…์„ ๋“ฑ๋กํ•œ ์Šค๋ ˆ๋“œ ์—ญ์‹œ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋ผ๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ sync์— ์˜ํ•ด ๋™์ž‘์„ ๋ฉˆ์ถ˜ ์ƒํƒœ์—์„œ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์— ํ์— ๋“ฑ๋ก๋œ ์ž‘์—…์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ํ์— ๋“ฑ๋กํ–ˆ๋˜ ์ž‘์—…์ด ๋๋‚˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๋™์‹œ์— ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ ์ž‘์—…์€ ์‹คํ–‰๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ๋“œ๋ฝ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


  • ์–ธ์ œ ํด๋ž˜์Šค ๋Œ€์‹  ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

ํด๋ž˜์Šค๋Š” ๊ตฌ์กฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ๊ฐ’ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š๊ณ  ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ๋  ํ•„์š”๊ฐ€ ์—†๊ณ  ๋ณ„๋„๋กœ ๋™์ž‘ํ•˜๊ธธ ์›ํ•  ๋•Œ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ์กฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— Thread-Safe ํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.


  • ์–ธ์ œ ๊ตฌ์กฐ์ฒด ๋Œ€์‹  ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•ด์•ผํ• ๊นŒ์š”?

๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งค๋ฒˆ ๋ณต์‚ฌ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งŒ์•ฝ ์–ด๋–ค ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๊ฐ’์˜ ๊ณ ์œ ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • weak๊ณผ unowned ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์„ธ์š”.

weak์€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜๋Š” ๊ฒƒ์„ ์—ผ๋‘ํ•˜์—ฌ ํ•ญ์ƒ Optionalํ•œ ํƒ€์ž…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด weak์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๊ฐ’์€ nil๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. unowned๋Š” ์ฐธ์กฐํ•˜๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ์•ฝ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ ๊ฒฝ์šฐ, nil์„ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๊ณ„์† ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ unowned๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋จผ์ € ํ•ด์ œ๋œ ๊ฒฝ์šฐ, ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.


  • weak๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  unowned๋„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์„๊นŒ์š”?

unowned๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Optional Binding์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


  • static ๋ณ€์ˆ˜์™€ class ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

static ๋ณ€์ˆ˜์™€ class ๋ณ€์ˆ˜ ๋ชจ๋‘ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์— ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” lazyํ•˜๊ฒŒ ๋™์ž‘ํ•ด์„œ ์‹ค์ œ๋กœ ๋ถˆ๋ฆฌ๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ํƒ€์ž… ์ด๋ฆ„์„ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์„ ํ•ญ์ƒ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. class๋กœ ์„ ์–ธ๋œ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ static์œผ๋กœ ์„ ์–ธ๋œ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • ARC๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฐธ์กฐ ํƒ€์ž…์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‹œ์ ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ํ•œ์ •์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ์„ฑ๋Šฅ์ €ํ•˜๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Swift๋Š” ์ด๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ์—…์ธ ARC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ARC๋Š” ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค. ARC๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.


  • ARC์™€ GC๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋‚˜์š”?

ARC์™€ GC์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์ฒ˜๋ฆฌ ์‹œ์ ์— ์žˆ์Šต๋‹ˆ๋‹ค. ARC๋Š” Retain๊ณผ Release๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ด Reference Count๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— GC๋Š” ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋ฅผ ๋Ÿฐํƒ€์ž…์— ๋ณ„๋„๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. ARC๋Š” ๋‹จ์ˆœํžˆ ์นด์šดํŒ…์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœํ™˜์ฐธ์กฐ์˜ ์œ„ํ—™์ด ์žˆ์Šต๋‹ˆ๋‹ค. GC๋Š” Mark-and-Sweep ๋ฐฉ์‹์œผ๋กœ ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๊ณ  ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜๋ฉด ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•œ ์ธ์Šคํ„ด์Šค๋“ค์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • autoclosure attribute์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

ํด๋กœ์ €๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์„ ๋•Œ ์ด ์ฝ”๋“œ๋ฅผ ํด๋กœ์ €๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. autoclosure๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ  ์‹ถ์œผ๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ @autoclosure attribute๋กœ markingํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. autoclosure๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉฐ ๋ฆฌํ„ด๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. autoclosure๋กœ ๋งˆํ‚นํ•  ์‹œ์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜ parameter์— ์ค‘๊ด„ํ˜ธ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. autoclosure๋Š” evaluation์„ delay ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


  • GCD์˜ QoS์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

Qos๋Š” DispatchQueue์— ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์ž‘์—…๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์ง€๋งŒ ์•ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. qos ์ˆ˜์ค€์€ userInterative, userInitiated, default, utility, background๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. User Interactive๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, UI์—…๋ฐ์ดํŠธ ๋“ฑ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์ž‘์—…๋“ค์„ ์œ„ํ•œ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ด๊ธฐ์œ„ํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. User Initiated๋Š” User Interactive์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ˜์‘์„ฑ๊ณผ ์„ฑ๋Šฅ์— ์ค‘์ ์„ ๋‘์ง€๋งŒ ๋น„๊ต์  ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Default๋Š” Qos์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ํ™œ๋ฐœํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ๋˜๋Š” queue์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. Utility๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ ๊ทน์ ์œผ๋กœ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์„ ์œ„ํ•œ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต progressbar์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๋‹ค์šด๋กœ๋“œ์™€ ๊ฐ™์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค.Background๋Š” ๊ณ„์† ์œ ์ง€ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ •๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์„ ์œ„ํ•œ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋™๊ธฐํ™”, ๋ฐฑ์—… ๋“ฑ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. unspecified๋Š” Qos ์ •๋ณด๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.


  • init?()๊ณผ init()์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?

init?()์€ ์‹คํŒจ๊ฐ€๋Šฅํ•œ ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑ์ž์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ nil์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • @frozen์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

enumํƒ€์ž…์—์„œ case๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ƒ๊ฒจ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ๋ช…์‹œํ•˜๋ฉฐ, ๋ช…์‹œํ•  ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. frozen์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ default ๊ณผ์ •์„ ์—†์•  ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์—†์• ์ฃผ๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.


  • @unknown์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

unknown์€ enumํƒ€์ž…์„ ์ ‘๊ทผํ•˜๋Š” switch-case๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ์ถ”๊ฐ€์ ์ธ case๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, ๊ธฐ์กด์— switch-case๋ฌธ์—์„œ ํ•ด๋‹น case๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  @unknown default๋กœ ์„ ์–ธํ•ด ๋†“์œผ๋ฉด ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ warning ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์–ด ์ถ”๊ฐ€๋œ ์ผ€์ด์Šค์˜ ์กด์žฌ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค. @unknown ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ๋ฃกํ•˜์ง€ ์•Š๊ณ  default๋งŒ ์ž‘์„ฑํ•ด๋†“์„ ๊ฒฝ์šฐ, ๋‚˜์ค‘์— ์ƒˆ๋กœ์šด case๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๊ณ ํ•ด๋„ ์ƒˆ๋กœ์šด case๋Š” default๋กœ ๋น ์ ธ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๊ฐ€๋œ case๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ unknown์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋  case๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


  • Never ๋ฐ˜ํ™˜ ํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

Never ํƒ€์ž…์€ ๋น„๋ฐ˜ํ™˜ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฆฌํ„ด๊ฐ’์ด Never์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋น„๋ฐ˜ํ™˜ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ณ , ๋น„๋ฐ˜ํ™˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ์ค‘๋Œ€ํ•œ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๋“ฑ์˜ ์ผ์„ ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. Never๋Š” ๋นˆ Enumeration์œผ๋กœ ๊ทธ๋ƒฅ ํ•˜๋‚˜์˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋น„๋ฐ˜ํ™˜ ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜์–ด ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด ์ฃผ๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

  • RunLoop์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

RunLoop๋Š” ์Šค๋ ˆ๋“œ ๋‹น ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜์–ด Thread์— ์ž‘์—…์ด ์ƒ๊ธฐ๋ฉด ์ฒ˜๋ฆฌํ•˜๊ณ , ์•„๋‹ ๋•Œ๋Š” ๋Œ€๊ธฐ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. RunLoop๋Š” Thread๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์‹คํ–‰์‹œ์ผœ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. RunLoop๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋„์ฐฉํ•œ EventSource๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. RunLoop๋Š” ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.


  • GCD์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”.

GCD๋Š” ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ๋™์‹œ์„ฑ ์‹คํ–‰์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์š”์†Œ, ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค. DispatchQueue๋Š” main queue, global queue, private queue๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ main queue๋Š” ํ•œ๊ฐœ๋งŒ ์กด์žฌํ•˜๋ฉฐ Main thread์—์„œ Serialํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. global queue๋Š” Qos๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Concurrentํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. private queue๋Š” ๋””ํดํŠธ๋Š” serial๋กœ concurrent๋กœ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Qos ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ global queue์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • OperationQueue์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. DispatchQueue์™€๋Š” ์–ด๋–ค ๊ฒƒ์ด ๋‹ค๋ฅธ๊ฐ€์š”?



  • final ํ‚ค์›Œ๋“œ๋ฅผ ํด๋ž˜์Šค ์•ž์— ๋ถ™์ด๋ฉด ์–ด๋–ค ํšจ๊ณผ๊ฐ€ ์žˆ์„๊นŒ์š”?

์–ด๋–ค ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค๋ฅธ ์ž์‹ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ override๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฐ override๋œ ๋ฉ”์†Œ๋“œ๋Š” ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ vtable์„ ํ•œ ๋ฒˆ ํƒ์ƒ‰ํ•ด์„œ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ dynamic dispatch๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค, ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ•ด ์ƒ์†๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํƒ€์ž„์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ฐ”๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , vtable์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ๋” ์ข‹์€ ํผํฌ๋จผ์Šค๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๊ฐ’์˜ ์†์„ฑ์ด ํ˜„์žฌ ๊ฐ’๊ณผ ๋™์ผํ•˜๋”๋ผ๋„ ์†์„ฑ ๊ฐ’์ด ์„ค์ •๋˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. willSet์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ์ง์ „์— ์ƒˆ๋กœ ์ €์žฅ๋  ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ newValue๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. didSet ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ฐ’์ด ์ €์žฅ๋œ ์งํ›„์— ์ด์ „ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ oldValue๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์— ํ”„๋กœํ„ฐํ”ผ ์˜ต์ €๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๊ฒฝ์šฐ์—๋งŒ ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Property Wrapper์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

Property Wrapper๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” property ๊ตฌํ˜„ ํŒจํ„ด์— ๋Œ€ํ•œ ์ง‘ํ•ฉ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹ , ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋กœํผํ‹ฐ์— ํ–‰ํ•˜๊ณ ์‹ถ์€ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ํƒ€์ž„ ์•ž์— @propertyWrapper๋ฅผ ๋ถ™์ธ ํ›„, @์™€ ํ–‰๋™์„ ์ •์˜ํ•œ ํƒ€์ž…์˜ ์ด๋ฆ„์„ ํ–‰๋™์„ ํ–‰ํ•  ํ”„๋กœํผํ‹ฐ ์•ž์— ๋ถ™์—ฌ์ฃผ์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Property Wrapper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • ๊ณ ์ฐจํ•จ์ˆ˜ ์ค‘ flatMap๊ณผ compactMap์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

floatMap์€ Map ๊ธฐ๋Šฅ์— ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฐ์—ด์„ flatํ•˜๊ฒŒ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค. compactMap์€ Map ๊ธฐ๋Šฅ์— ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ ์ค‘ nil์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋งŒ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.


  • ๊ณ ์ฐจํ•จ์ˆ˜(High Order Function)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

๊ณ ์ฐจํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Swift์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰๊ฐ์ฒด์ด๊ธฐ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Swift์˜ ๋Œ€ํ‘œ์ ์ธ ๊ณ ์ฐจํ•จ์ˆ˜๋กœ๋Š” Map, filter, reduce, compactMap, FlatMap๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. map, filter, reduceํ•จ์ˆ˜๋Š” Swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์— ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.


  • ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กด์ ์ด์ง€ ์•Š๊ณ , ์–ด๋– ํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ํ•จ์ˆ˜์—์„œ๋Š” ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. input๊ฐ’์— ์˜ํ•ด output์ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์˜ ๊ฐ’๋“ค์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•จ์ˆ˜ ์ž์ฒด์—๋Š” ์™ธ๋ถ€์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์–ธ์ œ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ํ˜ธ์ถœํ•˜๋“  ํ•ญ์ƒ ๊ฐ™์€ input์— ๋Œ€ํ•ด ๊ฐ™์€ Output์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์ด ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์˜ˆ์ธก๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.


  • ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๊ทธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ ์ด์™ธ์— ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


  • ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์™œ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‚˜์š”?

๊ฐ™์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๊ฐ€์ง€๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•จ์ˆ˜๋งŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ๋‚˜ ํ•จ์ˆ˜๋“ค์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์— ์˜์กด์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ๊ณผ ๋ณ€๊ฒฝ์ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


  • 1๊ธ‰ ๊ฐ์ฒด(ํ˜น์€ 1๊ธ‰ ์‹œ๋ฏผ)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. Swift์—๋Š” ์–ด๋–ค 1๊ธ‰ ๊ฐ์ฒด๋“ค์ด ์žˆ๋‚˜์š”?

๊ฐ’ ๋Œ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ, ๋ฐ˜ํ™˜, ๋น„๊ต ์—ฐ์‚ฐ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Swift๋Š” ์ด๋ฅผ ๊ถŒ์žฅํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. 1๊ธ‰ ๊ฐ์ฒด์˜ ์˜ˆ๋กœ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•จ์ˆ˜๋„ ๋ณ€์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • Optional์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‚˜์š”?

Optinal์€ associated value๋ฅผ ๊ฐ€์ง€๋Š” enum์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์ด ์กด์žฌํ•  ๋•Œ๋Š” some์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


  • Swift์—์„œ ์ฐธ์กฐ ํƒ€์ž…์„ ๋งํ•ด๋ณด์„ธ์š”.

ํด๋ž˜์Šค, ํ•จ์ˆ˜, ํด๋กœ์ €๊ฐ€ ๋ชจ๋‘ ์ฐธ์กฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.


  • some ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

some์€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ˜ํ™˜ํƒ€์ž…๋ถ€๋ถ„์— some Collection์œผ๋กœ ๋ช…์‹œํ•˜์—ฌ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ Collection์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…์ด ๋ฐ˜ํ™˜๋  ๊ฒƒ์„ ๋ณด์ฆํ•ฉ๋‹ˆ๋‹ค.


  • KVC์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

KVC๋Š” Key-Value Coding์œผ๋กœ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  KeyPath๋ฅผ ์ด์šฉํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.