donggyushin / iOSInterviewquestions

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปiOS ๋ฉด์ ‘์— ๋‚˜์˜ฌ ์งˆ๋ฌธ๋“ค ์ด ์ •๋ฆฌ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iOSInterviewquestions

iOS๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ์ž๋ฃŒ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

๋ฉด์ ‘๋•Œ ๋ฐ›์€ ์งˆ๋ฌธ์ด๋‚˜ ๊ณต๋ถ€ํ•œ๋‚ด์šฉ๋“ค

์ˆ˜์ •ํ•ด์•ผํ•  ๋‚ด์šฉ์ด๋‚˜ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๋‚ด์šฉ์€ ์–ธ์ œ๋“ ์ง€ PR๋‚ ๋ ค์ฃผ์„ธ์š”!

๋‹ต์ด ์ ํ˜€์žˆ์ง€ ์•Š์€ ์ด์œ ๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ์•”๊ธฐ์‹์œผ๋กœ ์™ธ์šฐ๊ธฐ ๋ณด๋‹ค ์ฐพ์•„๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์Šต๋“ ํ•˜์‹œ๋Š”๊ฒŒ ์ข‹๊ธฐ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ•ด๋‹น๋‚ด์šฉ์„ ์ฐพ์•„๋ณด๋ฉด์„œ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋“ค ๊นŒ์ง€ ๊ฐ™์ด ๊ณต๋ถ€ํ•˜์‹œ๋ฉด์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ณธ์ธ์˜ ๊ฒƒ์œผ๋กœ ์–ป์œผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋‘์˜ ํž˜์„ ๋ชจ์•„๋ด…์‹œ๋‹ค ๐Ÿ‘ฏโ€โ™€๏ธ๐Ÿ‘ฏโ€โ™‚๏ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค:)

Required

์•„๋ž˜ ๋‚ด์šฉ๋“ค์€ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๊ณต๋ถ€ํ•ด๋†“๋Š”๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ๐Ÿ“

  • ๋ฉด์ ‘์‹œ๊ธฐ๊ฐ€ wwdc์ดํ›„ (7์›”~11์›”)์ด๋ผ๋ฉด ํ•ด๋‹น๋…„๋„ wwdc์„ธ์…˜๋“ค์„ ๋ด ๋‘์‹œ๋ฉด ๋งค์šฐ๋งค์šฐ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

Apple All Videos

iOS

  • Bounds ์™€ Frame ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
   - Frame: SuperView(์ƒ์œ„๋ทฐ)์˜ ์ขŒํ‘œ์‹œ์Šคํ…œ์•ˆ์—์„œ View์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
   - Bounds: View์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ž์‹ ๋งŒ์˜ ์ขŒํ‘œ์‹œ์Šคํ…œ์•ˆ์—์„œ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
   - ๋ทฐ์˜ Frame ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด, ํ•ด๋‹น ๋ทฐ์˜ ์œ„์น˜๊ฐ€ ๋ณ€ํ•˜์ง€๋งŒ,
   - ๋ทฐ์˜ Bounds ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ํ•ด๋‹น ๋ทฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ณด์ด๋Š” ์‹œ๊ฐ์ด ๋ฐ”๋€๋‹ค. (scrollView)
  • ์‹ค์ œ ๋””๋ฐ”์ด์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์—†๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • ์•ฑ์˜ ์ฝ˜ํ…์ธ ๋‚˜ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ €์žฅ/๋ณด๊ด€ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฌด์—‡์ด๋ผ๊ณ  ํ•˜๋Š”๊ฐ€?

    • Core Data
    ๋””๋ฐ”์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ or ์บ์‹œํ•˜๊ณ  ์‹คํ–‰ ์ทจ์†Œ๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    ์˜๊ตฌ ๋ฐ์ดํ„ฐ ์ €์žฅ ์ฆ‰ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์€ Core Data ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์„ ํฌ๊ด„ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค
    
  • ์•ฑ ํ™”๋ฉด์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋กœ์ง๊ณผ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฌด์—‡์ด๋ผ๊ณ  ํ•˜๋Š”๊ฐ€?

    • ViewController
    ์•ฑ ๊ตฌ์กฐ์˜ ๋ผˆ๋Œ€, ๋ชจ๋“  ์•ฑ์— ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์ด์ƒ์˜ view controller๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ,
    ๋ชจ๋“  view controller ๋“ค์˜ ์ƒ์œ„ ํด๋ž˜์Šค
    
  • App thinning์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋””๋ฐ”์ด์Šค์— ์„ค์น˜๋  ๋•Œ, ์•ฑ ์Šคํ† ์–ด์™€ ์šด์˜์ฒด์ œ๊ฐ€ ๋””๋ฐ”์ด์Šค์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์„ค์น˜๋˜๋„๋ก ํ•˜๋Š” ์„ค์น˜ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    

  • ์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ main.c ์— ์žˆ๋Š” UIApplicationMain ํ•จ์ˆ˜์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    • UIApplication ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด
    ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด ๋ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฒคํŠธ ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    
  • @Main์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    UIKit ๊ธฐ๋ฐ˜ ์•ฑ์˜ main entry point
    
  • ์•ฑ์ด foreground์— ์žˆ์„ ๋•Œ์™€ background์— ์žˆ์„ ๋•Œ ์–ด๋–ค ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๋‚˜์š”?

    Foreground mode๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”์— ๋”ฐ๋ผ background ์•ฑ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    
    Background mode๋Š” ๊ฐ€๋Šฅํ•œ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผํ•จ(์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ํ•ด์ œ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ž‘์„ฑ)
    
  • ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ฉ”์„œ๋“œ๋“ค์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋œ ์งํ›„ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ธฐ ์ง์ „์— ํ˜ธ์ถœ
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ตœ์ดˆ ์‹คํ–‰๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด InActive ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ  task ์ผ์‹œ์ •์ง€, ํƒ€์ด๋จธ ๋น„ํ™œ์„ฑํ™”, ์ผ์‹œ์ •์ง€(๊ฒŒ์ž„)
func applicationWillResignActive(_ application: UIApplication)

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ๋กœ ์ „ํ™˜๋œ ์งํ›„ ํ˜ธ์ถœ

func applicationDidEnterBackground(_ application: UIApplication)

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Active ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ์ง์ „, ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ธฐ ์ง์ „์— ํ˜ธ์ถœ
func applicationWillEnterForeground(_ application: UIApplication)

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Active ์ƒํƒœ๋กœ ์ „ํ™˜๋œ ์งํ›„ ํ˜ธ์ถœ
func applicationDidBecomeActive(_ application: UIApplication)

//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ
func applicationWillTerminate(_ application: UIApplication)
  • ์•ฑ์ด In-Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
App switcher ๋กœ ์ „ํ™˜๋ ๋•Œ
๋‹ค๋ฅธ ์•ฑ์˜ ์•Œ๋ฆผ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ• ๋–„
  • scene delegate์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
iOS 13๋ถ€ํ„ฐ AppDelegate์˜ ์ฑ…์ž„์ด AppDelegate์™€ SceneDelegate๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.
App Delegate โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ์„ค์ • ๋‹ด๋‹น
   App Life Cycle
   Session Life Cycle
Scene Delegate โ†’ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ(Windows ๋˜๋Š” Scenes)์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•ฑ์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ๊ด€๋ฆฌ
   window โ†’ scene
  • UIApplication ๊ฐ์ฒด์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์€ ์–ด๋””์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
UIApplication ๊ฐ์ฒด๋Š” UIApplicationMain(_:_:_:_:) ํ•จ์ˆ˜์—์„œ Singleton ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋Š” @main์ด ์„ ์–ธ๋˜์–ด ์žˆ๋Š” App Delegate ์—์„œ ์‹คํ–‰๋œ๋‹ค.
  • App์˜ Not running, Inactive, Active, Background, Suspended์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
Not Running์€ ์•ฑ์ด ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์–ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ.

Inactive๋Š” app์ด ์‹คํ–‰์ค‘์ด์ง€๋งŒ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ event๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์ƒํƒœ. multitasking window๋กœ ์ง„์ž…ํ•˜๊ฑฐ๋‚˜ app ์‹คํ–‰์ค‘ ์ „ํ™”, ์•Œ๋ฆผ ๋“ฑ์— ์˜ํ•ด app์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์ƒํƒœ๋กœ ์ง„์ž….

Active๋Š” app์ด ์‹ค์ œ ์‹คํ–‰์ค‘์ด๊ณ  ์‚ฌ์šฉ์ž event๋ฅผ ๋ฐ›์•„์„œ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ.
(๋ฐ”๋กœ Active๊ฐ€ ๋˜์ง€ ์•Š๊ณ  Inactive ์ƒํƒœ๋ฅผ ๊ฑฐ์ณ Active์ƒํƒœ๊ฐ€ ๋œ๋‹ค.)

Background๋Š” ํ™ˆํ™”๋ฉด์œผ๋กœ ๋‚˜๊ฐ€๊ฑฐ๋‚˜ ๋‹ค๋ฅธ app์œผ๋กœ ์ „ํ™˜๋˜์–ด ํ˜„์žฌ app์ด ์‹ค์งˆ์ ์ธ ๋™์ž‘์„ ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ.

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

  • NSOperationQueue ์™€ GCD Queue ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์œ„ํ•œ API
์‰ฝ๊ณ  ํŽธํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์• ํ”Œ์€ ๋‘๊ฐ€์ง€์˜ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

GCD(Grand Central Dispatch)๋ผ๋Š” C๊ธฐ๋ฐ˜์˜ ์ €์ˆ˜์ค€ API์™€ NSOperation์ด๋ผ๋Š” Obj-C ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ณ ์ˆ˜์ค€ API๊ฐ€ ์žˆ๋‹ค. NSOperation์€ GCD๋ณด๋‹ค ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ๋ฐœ์ƒ๋˜๊ณ  ๋Š๋ฆฌ์ง€๋งŒ GCD์—์„œ๋Š” ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์„ ์ง€์› ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (KVO๊ด€์ฐฐ, ์ž‘์—…์ทจ์†Œ ๋“ฑ๋“ฑ) ๊ทธ์ •๋„๋Š” ๊ฐ์ˆ˜ํ•˜๊ณ  ์‚ฌ์šฉํ• ๋งŒํ•˜๋‹ค.

GCD๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋™์‹œ์ ์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ €์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

- Dispatch Queues: ๋””์ŠคํŒจ์น˜ ํ๋Š” FIFO ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹น
- Serial Dispatch Queue: ์‹œ๋ฆฌ์–ผ ๋””์ŠคํŒจ์น˜ ํ๋Š” ํ•œ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์‹คํ–‰
- Concurrent Dispatch Queue: ์ปจ์ปค๋ŸฐํŠธ ๋””์ŠคํŒจ์น˜ ํ๋Š” ์‹œ์ž‘ํ•œ ์ž‘์—…์ด ๋๋‚˜๋Š”๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์ž‘์—…์„ ์‹คํ–‰
- Main Dispatch Queue: ์•ฑ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ์ „์—ญ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์‹œ๋ฆฌ์–ผ ํ


  • GCD API ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
GCD๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋™์‹œ์ ์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ €์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์šฉ์–ด์—๋Š” ๋‹ค์Œ์ด ์žˆ๋‹ค.
- Dispatch Queues, ๋””์ŠคํŒจ์น˜ ํ๋Š” FIFO ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
- Serial Dispatch Queue, ์‹œ๋ฆฌ์–ผ ๋””์ŠคํŒจ์น˜ ํ๋Š” ํ•œ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์‹คํ–‰์‹œํ‚จ๋‹ค.
- Concurrent Dispatch Queue, ์ปจ์ปค๋ŸฐํŠธ ๋””์ŠคํŒจ์น˜ ํ๋Š” ์‹œ์ž‘ํ•œ ์ž‘์—…์ด ๋๋‚˜๋Š”๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚จ๋‹ค.
- Main Dispatch Queue, ์•ฑ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ์ „์—ญ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์‹œ๋ฆฌ์–ผ ํ
- ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ๋ฉ”์ธ์Šค๋ ˆ๋“œ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” Main ํ(Serial Queue)๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Global ํ(Cuncurrent Queue)๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ๋ฅผ ๊ด€๋ฆฌ

ํ•„์š”์„ฑ
- Thread ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๊ด€๋ฆฌ ์šฉ์ด
- ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ์™€ ๊ฐ™์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฒŒ ๋จ. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์‹œ์— ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•จ
  • Global DispatchQueue ์˜ Qos ์—๋Š” ์–ด๋–ค ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€, ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
## GCD

ํ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์›ํ•˜๋Š” ํŠน์ง•์— ๋งž๊ฒŒ ํ์— ๋ณด๋‚ด๋ฉด ๋œ๋‹ค

1) Main ํ - ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ Serial

2) Global ํ - Defalut Concurrent(์—ฌ๋Ÿฌ๊ฐœ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ)

concurrent queue

3) Private ํ - ์ปค์Šคํ…€ ํ

Global ํ Qos

DispatchQueue.global(qos: .userInteractive) - ์ฆ‰์‹œ
์—๋‹ˆ๋ฉ”์ด์…˜, UI ์—…๋ฐ์ดํŠธ
๋ฉ”์ธํ๋„ userInteractive ์ด์ง€๋งŒ, userInteractive ํ๋ผ๊ณ  ํ•ด์„œ ํ•ญ์ƒ ๋ฉ”์ธํ์ธ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

DispatchQueue.global(qos: .userinitiated) - ๋ช‡์ดˆ
์œ ์ €๊ฐ€ ์ฆ‰์‹œ ํ•„์š”ํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ž‘์—… (ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, ์—ด๊ธฐ)

DispatchQueue.global() - Default

DispatchQueue.global(qos: .utility) - ๋ช‡์ดˆ ~ ๋ช‡๋ถ„
Progress indicator์™€ ํ•จ๊ป˜ ๊ธธ๊ฒŒ ์‹คํ–‰๋˜๋Š” ์ž‘์—… ex Networking , IO, ๊ณ„์‚ฐ

DispatchQueue.global(qos: .background)
DB ๊ฐ€์ ธ์˜ค๊ธฐ / ์œ ์ง€

DispatchQueue.global(qos: .unspecifed)

  • iOS ์•ฑ์„ ๋งŒ๋“ค๊ณ , User Interface๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ์ด๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€?
UIKit
  • Foundation Kit์€ ๋ฌด์—‡์ด๊ณ  ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
Foundation Kit์€ Cocoa Touch framework์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
String, Int ๋“ฑ์˜ ์›์‹œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์ปฌ๋ ‰์…˜ ํƒ€์ž… ๋ฐ ์šด์˜์ฒด์ œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์•ฑ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
  • Delegate๋ž€ ๋ฌด์–ธ์ธ๊ฐ€ ์„ค๋ช…ํ•˜๊ณ , retain ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ ๊ทธ ์ด์œ ๋ฅผ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜์‹œ์˜ค.
๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋„˜๊ธฐ๋Š” ๊ฒƒ
ํšจ์œจ์„ฑ ๊ด€์ ์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•จ, ๊ธฐ๋Šฅ์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„๊ฐ€๋Šฅ
Retain Cycle: ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋˜์–ด ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธฐ๋Š” ํ˜„์ƒ

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

๋™์ž‘ ๋ฐฉ์‹
๊ฐ์ฒด A : listener
๊ฐ์ฒด B : sender
NotificationCenter
๊ฐ์ฒด A๋Š” ๊ฐ์ฒด B์˜ ์–ด๋– ํ•œ ํ–‰์œ„๋ฅผ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•ด NotificationCenter์— ์˜ต์ €๋ฒ„๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
์˜ต์ €๋ฒ„์—๋Š” ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๊ด€์ฐฐํ•  ๊ฒƒ์ธ์ง€, ์–ด๋–ค ํ–‰์œ„๋ฅผ ๊ด€์ฐฐํ•  ๊ฒƒ์ธ์ง€ ๋“ฑ์ด ๋“ค์–ด๊ฐ
   AViewController.swift
   NotificationCenter.default.addObserver(self, selector: #selector(handleNoti(_:)), name: "myNoti", object: nil)

๊ฐ์ฒด B๊ฐ€ ์–ด๋– ํ•œ ํ–‰์œ„๋ฅผ ํ•œ๋‹ค.
๊ฐ์ฒด B๋Š” ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ  NotificationCenter์— postํ•จ
   BViewController.swift
   NotificationCenter.default.post(name:"myNoti", object:" ์ „๋‹ฌํ•  ๊ฐ’")

NotificationCenter๋Š” ๊ฐ์ฒด A์—๊ฒŒ ๋“ฑ๋กํ•œ ์˜ต์ €๋ฒ„์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์•Œ๋ ค์คŒ

ํ™œ์šฉ ๋ฐฉ์•ˆ
์•„์ง๊นŒ์ง€ ์ปค์Šคํ…€ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์„ ํ™œ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์€ ์—†๋‹ค. UIApplication.willEnterForegroundNotification ์„ ํ™œ์šฉํ•˜์—ฌ
์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์ง„์ž… ํ–ˆ์„ ๋‹น์‹œ๋ฅผ ์ฒดํฌํ•ด์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•ด์ค€ ๊ฒฝํ—˜์€ ์žˆ์Œ.
  • UIKit ํด๋ž˜์Šค๋“ค์„ ๋‹ค๋ฃฐ ๋•Œ ๊ผญ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์“ฐ๋ ˆ๋“œ ์ด๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€?
๋ฉ”์ธ ์Šค๋ ˆ๋“œ
  • App Bundle์˜ ๊ตฌ์กฐ์™€ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒˆ๋“ค์€ ์„ฑ๊ณต์ ์ธ ์ž‘๋™์„ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ
MyApp: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‹คํ–‰ํŒŒ์ผ
app Icon: ์•„์ด์ฝ˜
Info.plist: ๋ฒˆ๋“ค ID, ๋ฒ„์ „ ๋ฒˆํ˜ธ ๋ฐ ์•ฑ ํ‘œ์‹œ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ์ •๋ณด ํฌํ•จ
Launch images: ์‹œ์ž‘ ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ ์ด๋ฏธ์ง€
MainWindow.nib: ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ๋กœ๋“œ ํ•  ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ํฌํ•จ
Settings.bundle: ์„ค์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณ„ ํ™˜๊ฒฝ ์„ค์ •์„ ํฌํ•จํ•˜๋Š” ํŠน์ˆ˜ ์œ ํ˜• ํ”Œ๋Ÿฌ๊ทธ์ธ
์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ํŒŒ์ผ: ์ง€์—ญํ™”๋œ ๋ฆฌ์†Œ์Šค or ์ง€์—ญํ™”๋˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ๋“ฑ๋“ฑ..
  • ๋ชจ๋“  View Controller ๊ฐ์ฒด์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋Š” ๋ฌด์—‡์ด๊ณ  ๊ทธ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€?
UIViewController: UIResponder

์—ญํ• 
๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ทฐ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์—…๋ฐ์ดํŠธ
๋ทฐ์™€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์— ์‘๋‹ต
๋ทฐ ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์ „์ฒด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ
์•ฑ์—์„œ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์กฐ์ •
  • ์ž์‹ ๋งŒ์˜ Custom View๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
UIView๋ฅผ ์ƒ์†ํ•˜๋Š” custom class ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ค€๋‹ค.
UIView๋Š” ๋‘๊ฐœ์˜ ํ•„์ˆ˜ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค

override init - ์ฝ”๋“œ๋กœ ๋ทฐ๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์„ฑ์ž
required init - ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ํ†ตํ•ด์„œ View๋ฅผ ์—ฐ๊ฒฐ ํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์„ฑ์ž
  • View ๊ฐ์ฒด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
ํ™”๋ฉด์˜ ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ์— ๋Œ€ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด. ๋ชจ๋“  ๋ทฐ์— ๊ณตํ†ต์ ์ธ ๋™์ž‘์„ ์ •์˜ํ•˜๋ฉฐ UIButton, UIImageView, UILabel ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๋ทฐ ํด๋ž˜์Šค์˜ ์ƒ์œ„ ํด๋ž˜์Šค

๊ทธ๋ฆฌ๊ธฐ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜
Core Graphics, UIViewAnimations, CoreAnimation

๋ ˆ์ด์•„์›ƒ ๋ฐ ํ•˜์œ„๋ณด๊ธฐ ๊ด€๋ฆฌ
์˜คํ† ๋ ˆ์ด์•„์›ƒ

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
UIResponder โ†’ ํ„ฐ์น˜ ๋ฐ ๊ธฐํƒ€ ์œ ํ˜•์˜ ์ด๋ฒคํŠธ ์‘๋‹ต
์ œ์Šค์ฒ˜ ์ธ์‹

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด์•ผ ํ•จ. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฟ์ด๊ณ , ๊ทธ ์™ธ์— ๋ชจ๋“  ์กฐ์ž‘์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•จ.
  • UIView ์—์„œ Layer ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
Core Animation API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์š”์†Œ์ค‘ ํ•˜๋‚˜๋กœ ๋ทฐ ์œ„์— ์ปจํ…์ธ ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทธ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
UIView์˜ ์—ญํ• ์€ ํฌ๊ฒŒ 1. ํ™”๋ฉด ํ‘œ์‹œ 2. ํ„ฐ์น˜ ์ด๋ฒคํŠธ 3. subview๊ด€๋ฆฌ ์ธ๋ฐ, ์ด์ค‘ ํ™”๋ฉดํ‘œ์‹œ(๋ทฐ ์œ„์— ์ปจํ…์ธ ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทธ๋ฆฌ๋Š” ํ–‰์œ„)๋ฅผ ์ง์ ‘ํ•˜์ง€์•Š๊ณ , Core Animation์— ์œ„์ž„ํ•œ๋‹ค.

UIView๋Š” ํ•˜๋‚˜์˜ CALayer๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
CALayer๋Š” SubLayer๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
UIView์˜ SubView๋Š” UIView์˜ CALayer ์œ„์— ์–นํ˜€์ง€๋Š” ๊ฒƒ์ž„
  • UIWindow ๊ฐ์ฒด์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€?
์•ฑ์˜ ์‹œ๊ฐ์  ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ด๋Š”๋‹ค.
๋ทฐ๋“ค๊ณผ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋“ค์—๊ฒŒ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
์˜ค๋ฆฌ์—”ํ…Œ์ด์…˜ ๋ณ€ํ™”๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋“ค๊ณผ ํ˜‘๋ ฅํ•œ๋‹ค.
  • UINavigationController ์˜ ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ์จ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
    
  • TableView๋ฅผ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ™”๋ฉด์— Cell์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” DataSource ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ๋™์ž‘ ๋ฐฉ์‹
      ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ…Œ์ด๋ธ” ๋ทฐ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  reloadData ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    
      ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” UITableView ๊ฐœ์ฒด๋กœ๋ถ€ํ„ฐ numberOfRowsInSection: ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํ…Œ์ด๋ธ”๋ณด๊ธฐ์˜ ์„น์…˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
    
      ๊ฐ ์„น์…˜์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” tableView : numberOfRowsInSection : ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์„น์…˜์˜ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
    
      ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ํ…Œ์ด๋ธ” ๋ทฐ์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ ํ–‰์— ๋Œ€ํ•ด tableView : cellForRowAt : ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
      ๊ฐ ํ–‰์— ๋Œ€ํ•ด UITableViewCell ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. UITableView ๊ฐœ์ฒด๋Š”์ด ์…€์„ ์‚ฌ์šฉํ•˜์—ฌ ํ–‰์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
    
    
    DataSource Method
      tableView(_:numberOfRowsInSection) -> Int : ์„น์…˜๋ณ„ cell ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
      tableView(_:cellForRowAt:) -> UITableViewCell : ๋ฐ˜ํ™˜ํ•  TableViewCell์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    
  • ํ•˜๋‚˜์˜ View Controller ์ฝ”๋“œ์—์„œ ์—ฌ๋Ÿฌ TableView Controller ์—ญํ• ์„ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    1. viewDidLoad() ์—์„œ register ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์…€์„ ๋“ฑ๋กํ•œ๋‹ค.
    2. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” tableView๋ฅผ ๊ฐ์ฒด ๋น„๊ต๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„ํ•œ๋‹ค.
    3. ํ•„์š”์‹œ ๊ฐ๊ฐ์˜ tableView์˜ content size๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด์„œ ํ…Œ์ด๋ธ”๋ทฐ์˜ height๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.
    
  • setNeedsLayout์™€ setNeedsDisplay์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

    setNeedsLayout๋ฉ”์†Œ๋“œ๋Š” layoutSubview๋ฉ”์†Œ๋“œ๋ฅผ, setNeedsDisplay๋Š” draw๋ฉ”์†Œ๋“œ๋ฅผ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•˜๊ฒŒ๋” ์œ ๋„ํ•œ๋‹ค.
    layoutSubview๋ฉ”์†Œ๋“œ๋Š” view์˜ position์ด๋‚˜ layout์— ๊ด€ํ•œ ๋ณ€ํ™”๋ฅผ ์ ์šฉ์‹œํ‚ค๊ณ ,
    draw๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ ๋“œ๋กœ์ž‰ ์‚ฌ์ดํด์ด ์˜ค๋ฉด ๊ทธ ๋•Œ ์Œ“์—ฌ์žˆ๋Š” ๊ทธ๋ ค์•ผ ํ•  ์ปจํ…์ธ ๋“ค์„ ๋™์‹œ์— ์ ์šฉ์‹œํ‚จ๋‹ค.
    

  • NSCache์™€ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์บ์‹œ๋ฅผ ๊ตฌ์„ฑํ–ˆ์„๋•Œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

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

    URLSession์€ iOS์—์„œ ์ œ๊ณตํ•˜๋Š” HTTP๋ฅผ ์ด์šฉํ•œ ๋„คํŠธ์›Œํ‚น์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” API๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค
    
    URLSession์€ URLSessionConfiguration์„ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
    URLSessionConfiguration์€ ์•„๋ž˜์˜ ์„ธ๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      Default : ๊ธฐ๋ณธ์ ์ธ ๋„คํŠธ์›Œํ‚น ์ •์ฑ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      Ephemeral : ์ฟ ํ‚ค์™€ ์บ์‹œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      Background : ์•ฑ์ด background์— ์žˆ์„ ๋•Œ ์ปจํ…์ธ ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ˜น์€ ์—…๋กœ๋“œ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    
    URLSessionTask ๋˜ํ•œ ์ž‘์—…์— ๋”ฐ๋ผ ์„ธ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      URLSessionDataTask : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ž‘์—… ์ˆ˜ํ–‰ ์‹œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. background ์„ธ์…˜์— ๋Œ€ํ•œ ์ง€์›์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      URLSessionUploadTask : ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ ์‹œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      URLSessionDownloadTask : ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ์‹œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    
  • prepareForReuse์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

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

  • ViewController์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • TableView์™€ CollectionView์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    UIScrollView์˜ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๋ฌดํ•œํ•œ ์–‘์˜(unbounded) ์ •๋ณด์— ๋ฌดํ•œํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฃŒ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    
    Table View: ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ๊ธด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(์„น์…˜ ๋ถ„๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).
    Collection View: ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ text flow ํ˜•์‹์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
                     ์—ฌ๊ธฐ์„œ text flow๋ž€ ๊ธ€์„ ์ฝ๋“ฏ์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ค„๋กœ ์ด์–ด์„œ ๊ณ„์† ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
                     ์ปฌ๋ ‰์…˜ ๋ทฐ๋Š” ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    

Autolayout

  • ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? (3๊ฐ€์ง€)

    1. Layout Anchors
    // Get the superview's layout
    let margins = view.layoutMarginsGuide
    
    // Pin the leading edge of myView to the margin's leading edge
    myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor).isActive = true
    
    // Pin the trailing edge of myView to the margin's trailing edge
    myView.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
    
    // Give myView a 1:2 aspect ratio
    myView.heightAnchor.constraint(equalTo: myView.widthAnchor, multiplier: 2.0).isActive = true
    
    1. NSLayoutConstraint Class 1 ์˜ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋”๋ผ๋„ ๊ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    NSLayoutConstraint(item: myView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = true
    
    NSLayoutConstraint(item: myView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true
    
    NSLayoutConstraint(item: myView, attribute: .height, relatedBy: .equal, toItem: myView, attribute:.width, multiplier: 2.0, constant:0.0).isActive = true
    
    1. Visual Format Language ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ASCII๋ฅผ ์ด์šฉํ•ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
    let views = ["myView" : myView]
    let formatString = "|-[myView]-|"
    
    let constraints = NSLayoutConstraint.constraints(withVisualFormat: formatString, options: .alignAllTop, metrics: nil, views: views)
    
    NSLayoutConstraint.activate(constraints)
    
  • hugging, resistance์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    1. Content hugging

      • ๋Š˜์–ด๋‚˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•˜๋Š” ํž˜, ์ตœ๋Œ€ ํฌ๊ธฐ์— ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ. ๋ทฐ๋ฅผ ์•ˆ์ชฝ์œผ๋กœ ๋‹น๊ฒจ ์ฝ˜ํ…์ธ  ์ฃผ๋ณ€์— ๊ผญ ๋งž๋„๋ก ํ•œ๋‹ค.
    2. Compression resistance

      • ์™ธ๋ถ€์—์„œ ์••๋ ฅ์„ ์ค„ ๋•Œ ๋ฒ„ํ‹ฐ๋Š” ํž˜, ์ตœ์†Œ ํฌ๊ธฐ์— ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ. ์ฝ˜ํ…์ธ ๋ฅผ ์ž๋ฅด์ง€ ์•Š๋„๋ก ๋ทฐ๋ฅผ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ๋ฐ€์–ด๋‚ธ๋‹ค.
      Right Label Content Hugging Priority = 750 Left Label Content Hugging Priority = 750
      Right Label Content Hugging Priority = 750 Left Label Content Hugging Priority = 750
  • Intrinsic Size์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์ด์šฉํ–ˆ์„๋•Œ์˜ ์žฅ๋‹จ์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

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

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

Swift

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

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

  class Person {
  var name: String
  init(name: String) {
  self.name = name
  }
  }

  var p1 = Person(name: "Jason")
  var p2 = p1

  p1.name = "Daniel" // p2.name ๋˜ํ•œ Daniel์ผ ๊ฒƒ

  struct Person {
  var name: String
  init(name: String) {
  self.name = name
  }
  }

  var p1 = Person(name: "Jason")
  var p2 = p1

  p1.name = "Daniel" // p2.name์€ ์—ฌ์ „ํžˆ Jason!

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ฐธ์กฐํƒ€์ž…๊ณผ ๊ฐ’ํƒ€์ž…์˜ ์ฐจ์ด์ ์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ํ•ญ์ƒ ๊ฐ’ํƒ€์ž…์ธ๊ฐ€? ๋ผ๋Š” ์งˆ๋ฌธ์—๋Š” โ€œ์•„๋‹ˆ๋‹คโ€๊ฐ€ ๋‹ต์ด๋‹ค. ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์— ์ฐธ์กฐํƒ€์ž… ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , 16 byte ์ด์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉด ๊ตฌ์กฐ์ฒด๋„ ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋จ์œผ๋กœ์จ ์ฐธ์กฐํƒ€์ž…์ด๋‹ค.

Mixed Types ๋จผ์ € ํด๋ž˜์Šค ๋‚ด์— ๊ตฌ์กฐ์ฒด๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์ž.

struct Manufacturer {
    var name: String
}

class Device {
    var name: String
    var manufacturer: Manufacturer

    init(name: String, manufacturer: Manufacturer) {
        self.name = name
        self.manufacturer = manufacturer
    }
}

let apple = Manufacturer(name: "Apple")
// ์—ฌ๊ธฐ์„œ iPhone, iPad ๋‘ "ํด๋ž˜์Šค"๋Š” ๋™์ผํ•˜๊ฒŒ apple์ด๋ผ๋Š” "๊ตฌ์กฐ์ฒด"๋ฅผ ์†์„ฑ์œผ๋กœ ๊ฐ–๊ฒŒ๋œ๋‹ค
let iPhone = Device(name: "iPhone", manufacturer: apple)
let iPad = Device(name: "iPad", manufacturer: apple)

iPad.manufacturer.name = "Google"

print(iPhone.manufacturer.name) -> Apple
print(iPad.manufacturer.name) -> Google

์ด๋Š” ๊ฝค ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋œ๋‹ค. ์• ์ดˆ์— ๊ตฌ์กฐ์ฒด๊ฐ€ ๊ฐ’ ํƒ€์ž…์ด๋‹ˆ iPhone, iPad๋ผ๋Š” ๋‘ ํด๋ž˜์Šค๊ฐ€ init ๋  ๋•Œ ๊ฐ’์˜ ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ์†์„ฑ์„ ์ €์žฅํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์กฐ์ฒด ๋‚ด์— ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜๋Š” ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ?

class Engine: CustomStringConvertible {
    var description: String {
        return "\(type) Engine"
    }

    var type: String

    init(type: String) {
        self.type = type
    }
}

struct Airplane {
    var engine: Engine
}

let jetEngine = Engine(type: "Jet")
// ์—ฌ๊ธฐ์„œ jetEngine์ด๋ผ๋Š” "์ฐธ์กฐํƒ€์ž…๋ณ€์ˆ˜"๋ฅผ ๋‘ airplane ๊ตฌ์กฐ์ฒด๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์‚ฌํ•ด๊ฐ€๋Š๋ƒ๊ฐ€ ๊ด€๊ฑด์ด๋‹ค
let bigAirplane = Airplane(engine: jetEngine)
let littleAirplane = Airplane(engine: jetEngine)

littleAirplane.engine.type = "Rocket"

print(bigAirplane) -> Rocket Engine
print(littleAirplane) -> Rocket Engine

์ฐธ์กฐํƒ€์ž…์„ ๋”ฐ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‘ ๊ตฌ์กฐ์ฒด๊ฐ€ ํ•˜๋‚˜์˜ Engine ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์ด๋‹ค.

์—ด๊ฑฐํ˜•

- ๋จผ์ € ์—ด๊ฑฐํ˜•์€ switch statement์™€ ๋งŒ๋‚  ๋•Œ ๋งค์šฐ ๊ฐ•๋ ฅํ•ด์ง„๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ , ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
- ๋ฌด์—‡๋ณด๋‹ค enum case์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์žฅ์ ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ ๋“ฑ์€ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ nil๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋“ฑ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์—ด๊ฑฐํ˜•์˜ ๊ฒฝ์šฐ ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์•„์ค€๋‹ค.
- ๊ตฌ์กฐ์ฒด๋กœ ์—ด๊ฑฐํ˜•์˜ ๊ธฐ๋Šฅ์ ์ธ ์š”์†Œ๋Š” ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ตฌ์กฐ์ฒด ๋‚ด์— ๋˜ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋Š” initํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋ฐ˜๋ฉด ์—ด๊ฑฐํ˜•์€ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ƒ์ˆ˜๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜์˜ ์—ฌ์ง€๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
- ์—ด๊ฑฐํ˜•์˜ ๊ฐ case๊ฐ€ ๋น„ํŠธ๋‹จ์œ„์˜ ๊ณ ์œ ๊ฐ’์„ ๊ฐ–๊ธฐ์— ๋น„๊ต๊ฐ€ ๋น ๋ฅด๋‹ค. ๋น„๊ต๋ฌธ์—์„œ์˜ ์žฅ์ ๋„ ๊ฐ–๋Š” ๊ฒƒ์ด๋‹ค.
- ์—ด๊ฑฐํ˜• ํƒ€์ž…์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๋ถˆ๋ฆฌํ•˜๋‹ค. ์—ด๊ฑฐํ˜•์ด ์ˆ˜์ •๋˜๋ฉด ๋ชจ๋“  ์†Œ์Šค๋“ค์„ ๋งค๋ฒˆ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • class์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋‚˜์—ดํ•ด๋ณด์‹œ์˜ค.

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

    Designated init์€ Swift์˜ ์ดˆ๊ธฐํ™” ์ด๋‹ˆ์…œ๋ผ์ด์ €์ž…๋‹ˆ๋‹ค.
    init์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ํด๋ž˜์Šค ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๊ฒŒ๋˜๋ฉด,
    
    ์ด๋ ‡๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    
    convenience init์€ "๋ณด์กฐ ์ด๋‹ˆ์…œ๋ผ์ด์ €" ์ž…๋‹ˆ๋‹ค.
    Designated init์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์„œ, ์ด convenience init์•ˆ์—์„œ Designated init์„ ํ˜ธ์ถœ ํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”
    convenience init์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Designated init์ด ๊ผญ ๋จผ์ € ์„ ์–ธ ๋˜์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    
    class Person {
    
      var name: String
      var age: Int
      var gender: String
    
      init(name: String, age: Int, gender: String) {
          self.name = name
          self.age = age
          self.gender = gender
      }
    
      convenience init(age: Int, gender: String) {
          self.init(name: "name", age: age, gender: gender)
      }
    }
    
  • Anyobject์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ๋ชจ๋“  ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ.
    delegate ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋•Œ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด weak ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

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

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

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

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

    Class, Struct, Enum์—์„œ collection, ์ˆœ์—ด, list, sequence ๋“ฑ ์ง‘ํ•ฉ์˜ ํŠน์ • ๋ฉค๋ฒ„ ์š”์†Œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค
    ์ธ์Šคํ„ด์Šค ์ด๋ฆ„ ๋’ค์— ๋Œ€๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ ๊ฐ’์„ ์จ์คŒ์œผ๋กœ์จ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ํŠน์ • ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

    • ์ฝ๊ณ  ์“ฐ๊ธฐ ๊ฐ€๋Šฅ
    subscript(index: Int) -> Int {
     get {
         // ์ ์ ˆํ•œ ๋ฐ˜ํ™˜ ๊ฐ’
     }
     set(newValue) {
         // ์ ์ ˆํ•œ set ์•ก์…˜
     }
    }
    
    • ์ฝ๊ธฐ ์ „์šฉ
    subscript(index: Int) -> Int {
     // ์ ์ ˆํ•œ ๋ฐ˜ํ™˜ ๊ฐ’
    }
    
    • ์‚ฌ์šฉ ์˜ˆ์‹œ
    struct TimesTable {
     let multiplier: Int
     subscript(index: Int) -> Int {
         return multiplier * index
     }
    }
    // TimesTable๊ตฌ์กฐ์ฒด์˜ multiplier๋ฅผ 3์œผ๋กœ ์„ค์ • 
    let threeTimesTable = TimesTable(multiplier: 3)
    print("six times three is \(threeTimesTable[6])")
    // "six times three is 18" ์ถœ๋ ฅ
    
    var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
    numberOfLegs["bird"] = 2
    

    numberOfLegs๊ฐ’์€ ํƒ€์ž… ์ถ”๋ก ์— ์˜ํ•ด [String: Int]ํ˜•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. numberOfLegs["bird"] = 2๋Š” ์‚ฌ์ „ํ˜• ๋ณ€์ˆ˜ numberOfLegs์— key๋กœ bird๋ฅผ ๊ทธ ๊ฐ’์€ 2๋ฅผ ๋„ฃ์œผ๋ผ๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

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

    instance ๋ฉ”์†Œ๋“œ.

    ํŠน์ • ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์˜ ์ธ์Šคํ„ด์Šค์— ์†ํ•˜๋Š” ํ•จ์ˆ˜
    ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ๋ฐ ์ˆ˜์ •์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ๋ชฉ์ ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

    class Person {
       var name: String?
       func changeName(name: String) {
          self.name = name 
       }
    }
    
    var personA = Person()
    personA.changeName(name: "jeff")
    

    class ๋ฉ”์†Œ๋“œ
    ํƒ€์ž… ๋ฉ”์†Œ๋“œ๋Š” ํŠน์ • ํƒ€์ž… ์ž์ฒด์— ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  static, class ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.
    class ๋ฉ”์†Œ๋“œ๋Š” ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  struct, enum ์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    static ํ‚ค์›Œ๋“œ๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ override ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , class ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

    struct Method {
       static func staticMethod() {
          print("static method") 
       }
       class func classMethod() {
          print("class method") 
       }
    }
    
    Method.staticMethod()
    
  • Delegate ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

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

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

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

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

    Delegate๋Š” ํ•œ ํ™”๋ฉด์—์„œ ๋งŽ์€ ์ด๋ฒคํŠธ์™€, ํ•ด๋‹น๋˜๋Š” ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•  ๋•Œ ์“ฐ๋ฉด ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

    Notification์€ ํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ ์ˆ˜์‹ ์ž๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์— ์“ฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.
    depth๊ฐ€ ๊นŠ์€ ํ™”๋ฉด์— ์ด๋ฒคํŠธ๋ฅผ ์ค„ ๋•Œ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.depth๊ฐ€ ๊นŠ๋‹ค๋ฉด Delegate๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด ๋ณต์žกํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

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

    Q. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    A. ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ์ง„ํ–‰ ์‹œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๋ฐฉํ•ดํ•˜๋ฉด ์•ˆ๋˜๊ธฐ์— ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ํฐ ์ž‘์—…์„ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ง„ํ–‰ํ•œ๋‹ค. 
    
    Q. ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๋“ค์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
    A. ์–ด๋–ค ์ž‘์—…์„ ๊ธ€๋กœ๋ฒŒ ํ์— ๋„ฃ์–ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ ,
    ๊ธ€๋กœ๋ฒŒ ํ์— ์ž‘์—…์„ ๋ฐฐ์น˜ํ• ๋•Œ, ์ž‘์—…์— ๋”ฐ๋ผ QoS๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ดํ•œ๋‹ค.
    
    QoS๋ž€?
    global queue๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ž‘์—…๋งˆ๋‹ค ์ค‘์š”๋„๋ฅผ ๋งค๊ฒจ์„œ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ. 
    userInteractive
    ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ, user-interativeํ•œ ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ
    ์˜ˆ : ์• ๋‹ˆ๋ฉ”์ด์…˜, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, UI ์—…๋ฐ์ดํŠธ
    
    userInitiated
    ๋‘๋ฒˆ์งธ ์šฐ์„ ์ˆœ์œ„๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ๋ณด์—ฌ์ค˜์•ผํ•˜๋Š” ์ž‘์—…, ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„์ง€๋„ ๋ชจ๋ฅด๋Š” ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ
    ์˜ˆ : API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ
    
    utility
    ๋„ค๋ฒˆ์งธ ์šฐ์„ ์ˆœ์œ„, ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š๋Š” ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ
    ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•  ๊ฒฝ์šฐ
    
    background
    ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„, ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ
    
    Synchronous VS Asynchronous
    Async ๋น„๋™๊ธฐ
       - ์•ˆ๊ธฐ๋‹ค๋ฆผ
       - ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ return 
       - ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์ผ์„ ๋„˜๊ธฐ๊ณ  ์ž‘์—… ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๋Š”๋‹ค. 
    Sync ๋™๊ธฐ
       - ๊ธฐ๋‹ค๋ฆผ
       - ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ํ•ญ์ƒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. 
    
    Serial VS Concurrent
    Serial (์ง๋ ฌ ํ)
    ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ์‹œํ‚จ ์ž‘์—…์„ ๋‹ค๋ฅธ ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ• ๋•Œ ์‚ฌ์šฉ
    
    Concurrent (๋™์‹œ ํ)
    ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ์‹œํ‚จ ์ž‘์—…์„ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ด์ง€๋งŒ ์œ ์‚ฌํ•œ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
    
  • MVC ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ธ”๋ก ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ณ , ๊ฐ ์—ญํ• ๊ณผ ํ๋ฆ„์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    Model
    - ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
    - ์•ฑ์ด ํฌํ•จํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •์˜
    
    # View
    - ๋ ˆ์ด์•„์›ƒ๊ณผ ํ™”๋ฉด ์ฒ˜๋ฆฌ
    - ์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์„ ์ •์˜
    
    # Controller
    - ๋ช…๋ น์„ ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ€๋ถ„์œผ๋กœ ๋ผ์šฐํŒ…
    - ์•ฑ์˜ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ชจ๋ธ ๋ฐ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จ
    
  • ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ํ”„๋กœํ† ์ฝœ(Protocol) ์€ ํŠน์ • ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, ๊ธฐํƒ€ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์˜ ์ฒญ์‚ฌ์ง„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    
  • Hashable์ด ๋ฌด์—‡์ด๊ณ , Equatable์„ ์™œ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    Hashable์ด๋ž€ Set, Dictionary์˜ Key์™€ ๊ฐ™์ด ์ž„์˜์˜ ์ž๋ฃŒํ˜•์„ ์ •์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์ˆ˜ ๊ฐ’์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. 
    Hashable์ด Equatable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜์—ฌ์•ผ ํ•˜๋Š” ์ด์œ ๋Š” Hashable์„ ํ†ตํ•ด์„œ ๋ณ€ํ™˜๋œ ์ •์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
    

    ์ž˜ ์ •๋ฆฌ๋œ ํฌ์ŠคํŒ…

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

    ํด๋ž˜์Šค๋Š” reference ํƒ€์ž…์ด๊ณ  struct ์™€ enum์€ value ํƒ€์ž…์ž…๋‹ˆ๋‹ค. 
    value ํƒ€์ž…์˜ ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 
    ๋งŒ์•ฝ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ mutating ์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 
    
struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
=> The point is now at 2.0, 3.0
  • ํƒˆ์ถœ ํด๋กœ์ €์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    ํƒˆ์ถœ ํด๋กœ์ €๋ž€?
    ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ํด๋กœ์ €๋ฅผ ์˜๋ฏธ. 
    ์ด ๊ฒฝ์šฐ @escaping ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 
    
    ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    ๋ณดํ†ต์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋กœ์ €๋ฅผ ํƒˆ์ถœ ์‹œํ‚ต๋‹ˆ๋‹ค. 
    
       func getSumOf(array:[Int], handler: @escaping ((Int)->Void)) {
           var sum: Int = 0
           for value in array {
               sum += value
           }
    
           DispatchQueue.global().asyncAfter(deadline: .now() + 1.0){
               handler(sum)
           }
       }   
       
       Alamofire.request(urlRequest).responseJSON { response in
    
       }      
    
  • Extension์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    ์ด์ „์˜ ๋‚ด๋ถ€ ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์›๋ณธ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
    ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜•, ํ”„๋กœํ† ์ฝœ์˜ ์ถ”๊ฐ€ ๊ตฌํ˜„๋ถ€, ์ œ์•ฝ์‚ฌํ•ญ, ๊ธฐ๋Šฅ ๋“ฑ์„ ์ •์˜
    ํŠน์ • ํƒ€์ž…์˜ ๊ธฐ๋Šฅ ๋ฐ ์ค€์ˆ˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋ณ„ ๊ตฌํ˜„๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๋‹ค ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ. 
    
  • ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—” ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค
     - open, public
     ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
     open ์€ ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค ๋ฉค๋ฒ„์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์„œ๋ธŒํด๋ž˜์‹ฑ ๋ฐ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ด ๊ทธ์— ๋”ฐ๋ฅธ ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ
     
     - internal 
     ๋ชจ๋“ˆ ์•ˆ์—์„œ๋Š” ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
     ์•ฑ์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ ์„ค๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ณดํ†ต ์‚ฌ์šฉ
     ๋””ํดํŠธ
     
     - file-private
     ์ •์˜๋œ ํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
     
     - private
     ๊ฐ€์žฅ ๋†’์€ ์ œํ•œ. ์„ ์–ธ๋œ ๊ณณ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. 
    
  • defer๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    ํ˜„์žฌ ์Šค์ฝ”ํ”„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ์— ์‹คํ–‰๋จ. 
    
    defer๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • defer๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๊ณ , defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • property wrapper์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Generic์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Resultํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Codable์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

ARC

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

ARC๋Š” Automatic Referencing Counting์˜ ์ค€๋ง์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ '์ฐธ์กฐ ์นด์šดํŠธ'๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ด๋‹ค.
ARC๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋  ๋•Œ๋งˆ๋‹ค ์ฐธ์กฐ ์นด์šดํŠธ(Reference Count)๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
๊ทธ ๋’ค์—๋Š” 'nil์ด ํ• ๋‹น๋˜๊ฑฐ๋‚˜, ๋ณ€์ˆ˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜๊ฑฐ๋‚˜, ์†ํ•ด ์žˆ๋Š” class๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ๋•Œ' ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ
์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

  • Retain Count ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Strong ๊ณผ Weak ์ฐธ์กฐ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ (Strong Reference Cycle) ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Functional Programming

  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ input์„ ์ „๋‹ฌ ๋ฐ›๊ณ  output์„ ๋‚ด๋Š” ํ•จ์ˆ˜๋“ค์„ ์ด์–ด ๋ถ™์—ฌ์„œ ์›ํ•˜๋Š” ๋ฐฉ์‹๋ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ œํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•

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

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ชฉ์ 
๋ถ€์ˆ˜ํšจ๊ณผ ์—†์ด ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์ทจํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
๋Œ€ํ‘œ์ ์œผ๋กœ map, filter, reduce, compactMap, flatMap ์ด ์žˆ์Œ.

  • Swift Standard Library์˜ map, filter, reduce, compactMap, flatMap์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

map - ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
filter - ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜
reduce - ์ถ•์•ฝ ์‹œํ‚ค๋Š” ํ•จ์ˆ˜. ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ๊ฐ ํ•ญ๋ชฉ๋“ค์„ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง„ ์•„์›ƒํ’‹ ๋ฐ˜ํ™˜
compactMap - 1์ฐจ์› ๋ฐฐ์—ด์—์„œ nil์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๊ณ ์‹ถ์„๋•Œ ์‚ฌ์šฉ
flatMap - 2์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ flatten ํ•˜๊ฒŒ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉ

Architecture

  • MVVM, Ribs, VIP ๋“ฑ ์ž์‹ ์ด ์•Œ๊ณ ์žˆ๋Š” ์•„ํ‚คํ…์ณ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค. MVC MVVM MVP

  • ์˜์กด์„ฑ ์ฃผ์ž…์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    ๊ฐ์ฒด A๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์ธ B๋ฅผ ๋‚ด๋ถ€์— ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด B ๊ฐ์ฒด์˜ ๊ตฌํ˜„๋‚ด์šฉ์— ๋”ฐ๋ผ์„œ A ๊ฐ์ฒด์˜ ๋™์ž‘์€ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ A๊ฐ์ฒด๋Š” B๊ฐ์ฒด์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    B๊ฐ์ฒด๋ฅผ A๊ฐ์ฒด ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ฃผ๋Š”๊ฒƒ์„ '์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค' ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    
    ์žฅ์ ์€ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•˜๊ณ  ์˜์กด์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
    

Optional

์•„๋ž˜๋ถ€ํ„ฐ๋Š” ์ถ”๊ฐ€๋กœ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด ์ข‹์„ ๋‚ด์šฉ๋“ค์ž…๋‹ˆ๋‹ค.

Objective-c๋‚˜ rx๋Š” ํšŒ์‚ฌ, ํŒ€๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š”๊ณณ์ด ์ฐจ์ด๊ฐ€์žˆ๊ณ  ์‹ ์ž…์ด๋‚˜ ์ฃผ๋‹ˆ์–ด๊ธฐ์ค€์œผ๋กœ ํ•„์ˆ˜๋ผ๊ณ  ์—ฌ๊ฒจ์ง€์ง€์•Š๊ธฐ์— ์˜ต์…”๋„์— ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

SwiftUI

Combine

  • PassthroughSubject์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค
  • @Published์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค
  • Anycancleable์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค
  • sink์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

Rx

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

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

  • RxSwift์—์„œ Hot Observable๊ณผ Cold Observable์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Subject์™€ drive์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Observable์ด error ํ˜น์€ complete๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์„๋•Œ Driver๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
MainScheduler์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์ „ํ™˜ํ•ด ์ค„ ํ•„์š” ์—†๋‹ค.
Subject์™€ Observable์„ UI ์ฒ˜๋ฆฌ ๋ชฉ์ ์œผ๋กœ ์ฃฝ์ง€ ์•Š๋Š” ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

MRC

  • ARC ๋Œ€์‹  Manual Reference Count ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์“ฐ๊ณ  ์—ญํ• ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • retain ๊ณผ assign ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • ํŠน์ • ๊ฐ์ฒด๋ฅผ autorelease ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์‚ฌํ•ญ๊ณผ ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Autorelease Pool์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๋‘ ๊ฐ€์ง€ ์ด์ƒ ์˜ˆ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ ์ถ”์ธกํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค. Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

Advanced

  • method swizzling์ด ๋ฌด์—‡์ด๊ณ , ์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • NSCoder ํด๋ž˜์Šค๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์จ์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Responder Chain ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , First Responder ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • NSObject๋ถ€ํ„ฐ UIButton ๊นŒ์ง€ ์ƒ์† ๊ณผ์ •์˜ ๊ณ„์ธต๊ณผ ์—ญํ• ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • shallow copy์™€ deep copy์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Push Notification ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Foundation ๊ณผ Core Foundation ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • NSURLConnection ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Delegate ๋ฉ”์„œ๋“œ๋“ค์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Synchronous ๋ฐฉ์‹๊ณผ Asynchronous ๋ฐฉ์‹์œผ๋กœ URL Connection์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•˜์‹œ์˜ค.
  • Plist ํŒŒ์ผ ๊ตฌ์กฐ์™€ Plist ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Core Data์™€ Sqlite ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํŒŒ์„œ, ๊ฐ์ฒด ๋ณ€ํ™˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • ์›น ์„œ๋ฒ„์™€ HTTP ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ฑฐ๋‚˜ ๋ฐ›์œผ๋ ค๋ฉด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๋™์ž‘์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Protocol์—์„œ๋Š” ์™œ var๋งŒ ๋˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์š”.

Objective-C

  • Swift์˜ ํด๋กœ์ €์™€ Objective-C์˜ ๋ธ”๋ก์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€?
  • Mutable ๊ฐ์ฒด๊ณผ Immutable ๊ฐ์ฒด๋Š” ์–ด๋–ค๊ฒƒ์ด ์žˆ๋Š”์ง€ ์˜ˆ๋ฅผ ๋“ค๊ณ , ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • dynamic๊ณผ property ์˜๋ฏธ์™€ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • @property๋กœ ์„ ์–ธํ•œ NSString* title ์˜ getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์‹œ์˜ค.
  • @property์—์„œ atomic๊ณผ nonatomic ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๊ณ , ์–ด๋–ค๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€, ์–ด๋Š๊ฒƒ์ด ๊ธฐ๋ณธ์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • @property๋กœ ์„ ์–ธํ•œ๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜๊ณ , .h์— ๋„ฃ์„ ๊ฒฝ์šฐ์™€ .m์— ๋„ฃ์„ ๊ฒฝ์šฐ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • -performSelector:withObject:afterDelay: ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ์ธ์ž๊ฐ’์˜ ๊ฐ์ฒด๋Š” retain๋˜๋Š”๊ฐ€? ๊ทธ ์ด์œ ๋ฅผ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Objective-C ์—์„œ ์บก์Šํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Fast Enumeration ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • unnamed category ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Category ํ™•์žฅ๊ณผ Subclass ํ™•์žฅ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Category ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Objective-C ์—์„œ Protocol ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Objective-C++ ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๊ณ , ์–ด๋–ค ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

About

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปiOS ๋ฉด์ ‘์— ๋‚˜์˜ฌ ์งˆ๋ฌธ๋“ค ์ด ์ •๋ฆฌ


Languages

Language:Swift 100.0%