Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

iOSInterviewquestions - Swift ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/๐Ÿง‘๐Ÿป‍๐Ÿ’ป iOSInterviewquestions

iOSInterviewquestions - Swift

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 4. 2. 03:02

iOSInterviewquestions - Swift

 

๋ชฉ์  : ๋ฐฐ์šธ๋•Œ๋Š” ์ž˜ํ–ˆ๋Š”๋ฐ, ๋‚˜์ด๊ฐ€ ๋จน์œผ๋‹ˆ๊นŒ ์ž๊พธ ๊นŒ๋จน์–ด์„œ ์•„๋ž˜ ๊นƒํ—ˆ๋ธŒ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๊พธ์ค€ํžˆ ์ด๋ก  ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ ์ž ํ•จ. ๋ฌผ๋ก  ์„ค๋ช…์€ ๋‚ด๊ฐ€ ์ž˜ ์•„๋Š”๊ฒŒ ๋ชฉ์ ์ด๋ผ ์ฒ ์ €ํžˆ ๋‚˜๋ฅผ ์ดํ•ด์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋‚˜์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ.

 

์ž‘์„ฑ์ผ : 2022๋…„ 4์›” 2์ผ 

 - README: ์ถ”ํ›„์— ์ˆ˜์ •์ด ์žˆ์„ ๊ฒฝ์šฐ ์•„๋ž˜์— ๋‚ ์งœ์™€ ์‹œ๊ฐ์„ ์ž‘์„ฑํ•˜๊ณ , ์ˆ˜์ • ๋‚ด์šฉ์„ ๊ฐ„๋žตํžˆ ์ •๋ฆฌํ•ด์ฃผ์„ธ์š”.

 

์˜ˆ์‹œ)

(์ˆ˜์ •) oooo๋…„ oo์›” oo์ผ oo์‹œ oo๋ถ„ 

 - ๋ณ€๊ฒฝ๋‚ด์šฉ : xxx์— ๋Œ€ํ•œ ์ž๋ฃŒ๋ฅผ ๋ณด๊ฐ•

 

โœ… ๊ณต๋ถ€์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ๊นƒํ—ˆ๋ธŒ ๊ธ€

https://github.com/JeaSungLEE/iOSInterviewquestions

 

GitHub - JeaSungLEE/iOSInterviewquestions: ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปiOS ๋ฉด์ ‘์— ๋‚˜์˜ฌ ์งˆ๋ฌธ๋“ค ์ด ์ •๋ฆฌ

๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปiOS ๋ฉด์ ‘์— ๋‚˜์˜ฌ ์งˆ๋ฌธ๋“ค ์ด ์ •๋ฆฌ . Contribute to JeaSungLEE/iOSInterviewquestions development by creating an account on GitHub.

github.com

 

 

โœ… Swift

 

  • struct์™€ class์™€ enum์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • class : ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, call by ref ๋ฐ์ดํ„ฐ ์ „๋‹ฌ, ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ์œ„์น˜๋ฅผ stack ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ฐธ์กฐ๋˜๋Š” ๊ฐ’์€ heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅ.
    • struct : ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, call by value๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ, ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด ์ธ์Šคํ„ด์Šค๊ฐ€ stack ์˜์—ญ์— ์ €์žฅ
    • enum : ๋‹ค๋ฅธ ์–ธ์–ด์˜ enum๊ณผ๋Š” ์กฐ๊ธˆ์€ ๋‹ค๋ฅด๋ฉฐ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์šฐ์ˆ˜ํ•จ. enum์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉฐ, ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋‚˜, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ํŠน์ •ํ•œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์คŒ
  • class์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋‚˜์—ดํ•ด๋ณด์‹œ์˜ค.
    • ์Šค์œ„ํ”„ํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋Š” Stack ๋˜๋Š” Heap์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 
      • Stack์€ LIFO์˜ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)๋กœ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋ฉฐ Stack Pointer๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • Heap์€ Stack๋ณด๋‹ค ์ข€ ๋” ๋ณต์žกํ•˜๋‹ค. ๋‹ค์ด๋‚˜๋ฏนํ•œ ํ• ๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Heap์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ธ”๋ก์„ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ• ๋‹น์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜๋กœ ๋‹ค์‹œ ์‚ฝ์ž…ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— Heap์— ์ ‘๊ทผํ•œ ์ˆ˜ ์žˆ๊ธฐ์— Locking ๋˜๋Š” ๋‹ค๋ฅธ ๋™๊ธฐํ™” ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์ธ๋ฐ Struct์—์„œ๋„ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์ด ์ผ์–ด๋‚œ๋‹ค. Stringํƒ€์ž…์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ์ด๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ, UIFont๋„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 
      • ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Stringํƒ€์ž…์ด ์•„๋‹Œ structํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค๋˜๊ฐ€, enum์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • Method Dispatch๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜์—ฌ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์„ ๋œปํ•จ. ์–ด๋–ค ๋ฉ”์†Œ๋“œ์ธ์ง€ ๊ฒฐ์ •๋˜๋Š” ์‹œ์ ์— ๋”ฐ๋ผ static๊ณผ dynamic์œผ๋กœ ๋‚˜๋‰จ.
      • static method dispatch๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”์†Œ๋“œ์˜ ์‹ค์ œ ์ฝ”๋“œ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด ๋Ÿฐํƒ€์ž„์— ์ฐพ๋Š” ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋“ค์ด ์–ด๋””์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ์— ๋ฉ”์†Œ๋“œ ์ธ๋ผ์ด๋‹๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ ์ธ๋ผ์ด๋‹์ด๋ž€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ , ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
      • dynamic method dispatch๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด์„œ, ๋Ÿฐํƒ€์ž„์— table์„ ์ฐธ์กฐํ•˜์—ฌ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. static ๋ฐฉ์‹๋ณด๋‹ค ๋งŽ์€ ๋น„์šฉ์„ ํ•„์š”๋กœ ํ•˜์ง€ ใ…‡๋‚ณ๊ณ , ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…, ํž™ํ• ๋‹น๊ณผ ๊ฐ™์€ ์“ฐ๋ ˆ๋“œ ๋™๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” static์€ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ dynamic์€ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ๋‹คํ˜•์„ฑ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹คํ˜•์„ฑ์ด๋ž€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
      • class Drawable { func draw() {} } 
        
        class Point: Drawable { 
           var x, y: Double
           override func draw() { ... }
        }
        
        class Line: Drawable { 
           var x1, y1, x2, y2: Double
           override func draw() { ... }
        }
        
        var drawables: [Drawable] 
        
        for d in drawables { 
           d.draw()
        }
      • ์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด Point์™€ Line ํด๋ž˜์Šค๊ฐ€ Drawable๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ d.draw์˜ d๊ฐ€ Point์ธ์ง€ Line์ธ์ง€ ์•Œ๊ธฐ ํž˜๋“ค๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํด๋ž˜์Šค์— ํƒ€์ž… ์ •๋ณด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” virtual method table์„ ์ถ”๊ฐ€ํ•œ๋‹ค. static memory์— ์ €์žฅํ•˜๋ฉฐ, ์ด ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • final class : ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด final์„ ์„ ์–ธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ staticํ•˜๊ฒŒ dispatchํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋„๋„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
    • ํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•ด๋„ ๋  ๊ฒฝ์šฐ private์„ ์–ธ
      • private๋กœ ์„ ์–ธํ•  ๊ฒฝ์šฐ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๊ฐ€ ํ˜„์žฌ ํŒŒ์ผ๋กœ ์ œํ•œ๋˜๋ฉฐ ์ด์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์—ญ ๋‚ด์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ ์ง€, ์•ˆ๋ ์ง€๋ฅผ ์•Œ์•„์„œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜๋Š” ๊ณณ์ด ์—†๋‹ค๋Š”๊ฒŒ ํŒ๋‹จ๋  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šค์Šค๋กœ final๋กœ ์ถ”๋ก ํ•ด์„œ static dispatch๋กœ ๋™์ž‘์‹œํ‚จ๋‹ค.
    • WMO(whole module optimization) ์‚ฌ์šฉํ•˜๊ธฐ.
      • ๋ชจ๋“ˆ ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— internal level์— ๋Œ€ํ•ด์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜๋Š”์ง€, ์•„๋‹Œ์ง€๋ฅผ ์ถ”๋ก  ๊ฐ€๋Šฅํ•˜๊ณ , ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์—†์„ ๊ฒฝ์šฐ final์„ ์„ ์–ธํ•ด์ฃผ๋Š” ๊ฒƒ์ด whole module์ด๋ฉฐ Xcode์˜ compilation Mode์˜ release์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.(์ž๋™์œผ๋กœ whole module์ด ์ผœ์ ธ ์žˆ๋‹ค.)
      • ์ปดํŒŒ์ผ์„ ํŒŒ์ผ ๋‹จ์œ„๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ํŒŒ์ผ์˜ class๊ฐ€ ์ƒ์†์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋  ์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์ž๋™์œผ๋กœ final์œผ๋กœ ๋™์ž‘์‹œ์ผœ์ค„ ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๊ทน๋ณตํ•œ ๊ฒƒ์ด WMO๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ internal๋ณด๋‹ค ์ƒ์œ„ ์ ‘๊ทผ ์ œ์–ด์ž(public, open)์ด ์„ ์–ธ๋œ ๊ฒฝ์šฐ์—๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ WMO๋ฅผ ์‚ฌ์šฉํ•ด๋„ Dynamic Dispatch๋กœ ์ž‘๋™ํ•œ๋‹ค.
    • (์ฐธ๊ณ ) https://velog.io/@wnsxor1993/Class%EC%9D%98-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-%EB%B0%A9%EB%B2%95
    •  (์ฐธ๊ณ ) https://velog.io/@leeesangheee/iOS.-class%EC%9D%98-%EC%84%B1%EB%8A%A5%EC%9D%84-%ED%96%A5%EC%83%81-%EC%8B%9C%ED%82%AC%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95%EB%93%A4%EC%9D%84-%EB%82%98%EC%97%B4%ED%95%B4%EB%B3%B4%EC%8B%9C%EC%98%A4
  • Copy On Write๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ์‹ค์ œ ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์ด ์ˆ˜์ •๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ , ์›๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•จ. ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ ๊ทธ ๋•Œ, ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ํ•จ. ์ด ์ž‘์—…์ด swift์—์„œ๋Š” Collection Type์„ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ผ์–ด๋‚จ.
    • (์ฐธ๊ณ ) https://babbab2.tistory.com/18
    • int array1 = [1,2,3] // array1์˜ ์ฃผ์†Œ: AA
      int array2 = array1 // array2์˜ ์ฃผ์†Œ: AA
      
      array1[0] = 1 // COW !! array2์˜ ์ฃผ์†Œ: BB
      
      // COW๋Š” ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์˜ ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•จ

method dispatch

static method dispatch

static method dispatchstatic method dispatch

  • Convinience init์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ์ดˆ๊ธฐํ™”์˜ ์ข…๋ฅ˜์—ใ…๋Š” ํฌ๊ฒŒ Designated, convenience๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ธฐ ์œ„ํ•จ.
    • swift์˜ ์ดˆ๊ธฐํ™” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ ๋ณธ Designated init(์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €)๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ง€ํ‚ค์ง€ ์•Š์„๊ฒฝ์šฐ error๋ฐœ์ƒ
    • convenience init์€ ๋ณด์กฐ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ ํด๋ž˜์Šค์˜ ์›๋ž˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ init์„ ๋„์™€์ฃผ๋Š” ์—ญํ• . convenience 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: "zedd", age: age, gender: gender)
          }
      }
  • AnyObject์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • Swift๋Š” Type์— ๋ฏผ๊ฐํ•˜์—ฌ ํŠน์ •ํ•˜์ง€ ์•Š์€ ํƒ€์ž…์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋„๋ก ํŠน๋ณ„ํ•œ ํƒ€์ž… 2๊ฐ€์ง€ ์ œ๊ณตํ•œ๋‹ค. ์›๋ž˜๋Š” ํƒ€์ž… ์บ์ŠคํŒ…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฆฌ๋งŒ ์บ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Any, AnyObject ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ƒ์† ๊ด€๊ณ„์— ์žˆ์ง€ ์•Š์•„๋„ ํƒ€์ž… ์บ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Any : ํ•จ์ˆ˜ ํƒ€์ž…์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Valueํƒ€์ž… (struct, class), referenceํƒ€์ž…(class, closure) ๋‘˜ ๋‹ค ์ €์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ๋ชจ๋“  ํƒ€์ž…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • AnyObject๋Š” ๋ชจ๋“  ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. AnyObject๋กœ ์„ ์–ธ ์‹œ, ํด๋ž˜์Šค ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ํƒ€์ž…์ด ์•„๋‹Œ ๊ตฌ์กฐ์ฒด ์—ด๊ฑฐํ˜• ref ํƒ€์ž…์ธ ํด๋กœ์ €๋Š” AnyObject์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • (Any, AnyObject์˜ ๋‹จ์ ) ๋งค๋ฒˆ ํƒ€์ž… ์ฒดํฌ ๋ฐ ํ˜•๋ณ€ํ™˜์„ ํ•ด์•ผํ•œ๋‹ค. as๋‚˜ as? ๋“ฑ์œผ๋กœ ๋‹ค์šด ์บ์ŠคํŒ…ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
    • var name: Any = "lgvv" // error
      // String ํƒ€์ž…์„ Any๋กœ ์„ ์–ธํ•ด์ฃผ์–ด๋„ name์— String ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
      // ์ด์œ ๋Š” Any, AnyObject๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ์ ์—๋Š” ํ•ด๋‹น ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†์–ด์„œ
      // ๋”ฐ๋ผ์„œ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์—†๋‹ค.
      
      // ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•
      if var name = name as? String { 
          name.append("๋‹ค์šด์บ์ŠคํŒ…")
      }

 

  • Optional ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ์žฅ์  : ๊ฐœ๋ฐœ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„์— nil๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ˆ๋ฐฉ ๊ฐ€๋Šฅ
    • ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ : ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ์ฒดํฌ
    • ์˜ต์…”๋„ ์ฒด์ด๋‹: ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉ ์‹œ ์˜ต์…”๋„๋ผ๋ฆฌ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ if๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ?ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•จ. ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ต์…”๋„์„ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.
    • obj-c์—์„œ ์•„์ง nilํƒ€์ž…์ด ์กด์žฌํ•˜๋ฉฐ obj-c์™€ swift์˜ ์ƒํ˜ธ ์šด์˜์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ
  • Struct ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ๊ตฌ์กฐ์ฒด์ด๊ณ  ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ์„ ํƒ์˜ ๊ด€์ ์—์„œ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‚˜ ์ฐธ์กฐ๋˜๊ธฐ๋ณด๋‹ค ๋ณต์‚ฌ๋˜๊ธธ ์›ํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
    • (์ฐธ๊ณ ) https://jusung.gitbook.io/the-swift-language-guide/language-guide/09-classes-and-structures
  • Subscripts์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด ๊ทธ๋ฆฌ๊ณ  ์—ด๊ฑฐํ˜•์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ž€ ์ฝœ๋ ‰์…˜, ๋ฆฌ์ŠคํŠธ, ์‹œํ€€์Šค ๋“ฑ ์ง‘ํ•ฉ์˜ ํŠน์ • ๋ฉค๋ฒ„ ์—˜๋ฆฌ๋จผํŠธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค
    • struct TimesTable {
          let multiplier: Int
          subscript(index: Int) -> Int {
              return multiplier * index
          }
      }
      let threeTimesTable = TimesTable(multiplier: 3)
      print("six times three is \(threeTimesTable[6])")
      // "six times three is 18" ์ถœ๋ ฅ
    • (์ฐธ๊ณ ) https://jusung.gitbook.io/the-swift-language-guide/language-guide/12-subscripts
  • String์€ ์™œ subscript๋กœ ์ ‘๊ทผ์ด ์•ˆ๋˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • Swift์˜ String์€ Struct ํƒ€์ž…์ด๊ณ , characters์˜ collection ํƒ€์ž…์ด๋‹ค. ์ฆ‰ Array<Element>์˜ element๊ฐ€ Character์ธ ๋ฐฐ์—ด์ด๋‹ค.
    • ํ•˜์ง€๋งŒ Swift์—์„œ String์€ subscript, ์ฆ‰ str[0]๊ฐ™์ด Int๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ณ , String.index๋กœ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” Swift์—์„œ Character๋Š” 1๊ฐœ ์ด์ƒ์˜ Unicode Scalar๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฆ‰ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋‹ค.
    • let test = "๐Ÿคก๐Ÿค–123"
      
      let index = test.index(text.startIndex, offsetBy: 1)
      
      print(index) // Index(_rawBits: 1180673)
      print(test[index]) // ๐Ÿค–
    • (์ฐธ๊ณ ) https://velog.io/@hansangjin96/Swift-String%EC%9D%80-%EC%99%9C-subscriptInt%EB%A1%9C-%EC%A0%91%EA%B7%BC%EC%9D%B4-%EC%95%88%EB%90%A0%EA%B9%8C
  • instance ๋ฉ”์„œ๋“œ์™€ class ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • instance ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ํ˜•ํƒœ์˜ ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•จ. ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๊ณ  ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‹ค์ฒดํ™”(์ธ์Šคํ„ด์Šค)ํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœ
    • class ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‹ค์ฒดํ™” ํ•˜์ง€ ์•Š์•„๋„ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. 
    • class func methodName() { }
    • ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ์™€ ๋‹ฌ๋ฆฌ struct์™€ enum์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ์™œ๋ƒํ•˜๋ฉด ์ด ๋‘˜์€ ์ƒ์†ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. class ๋ฉ”์†Œ๋“œ๋Š” static๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. swift์—์„œ๋Š” static ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์ฆ‰, ํด๋ž˜์Šค์—์„œ ํ•œํ•ด์„œ ์Šคํƒœํ‹ฑ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • (instance ๋ฉ”์„œ๋“œ์™€ class ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด ์ •๋ฆฌ) 
      • ์ •์˜๋œ Class, struct, enum ์„ ์‹ค์ฒดํ™”(์ธ์Šคํ„ด์Šค) ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š๋ƒ
      • ์‹ค์ฒดํ™”(์ธ์Šคํ„ด์Šค) ํ•˜์ง€์•Š๊ณ  ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœ ํ•˜๋Š๋ƒ
      • Class ๊ฐ€ ์•„๋‹Œ struct, enum ์—์„œ ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋Š๋ƒ ์—†๋Š๋ƒ

 

  • class ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • class SwiftClass() { 
          static func staticMethod() { }
          class func classMethod() { }
      }
      
      class DerivedSwiftClass: SwiftClass { 
          override static func staticMethod() { } // ๋ถˆ๊ฐ€๋Šฅ Cannot override static method  
          override class func staticMethod() { } // ๊ฐ€๋Šฅ 
      }
    • class๋ฉ”์†Œ๋“œ์™€ static ๋ฉ”์†Œ๋“œ๋Š” ํƒ€์ž… ๋ฉ”์†Œ๋“œ์— ์†ํ•˜๋ฉฐ, static ๋ฉ”์†Œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • (์ฐธ๊ณ ) https://babbab2.tistory.com/122

 

 

 

  • Delegate ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
  • Singleton ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํŠน์ • ์šฉ๋„๋กœ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์ฆ‰, ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ™˜๊ฒฝ์„ค์ •, ๋„คํŠธ์›Œํฌ, ๋กœ๊ทธ์ธ ์ •๋ณด ๋“ฑ์„ ํŠน์ • ์šฉ๋„๋กœ ์ƒ์„ฑํ•ด๋‘” ๊ฐ์ฒด์— ๋„ฃ์–ด๋‘๊ณ  ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ.
    • (์žฅ์ ) ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋งž๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์ž‡๋Š” ์žฅ์ ์ด ์žˆ์Œ
    • (์ฃผ์˜) ํ•œ๋ฒˆ ํ• ๋‹น ๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋๋‚  ๋•Œ๊นŒ์ง€ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.(ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‚จ์•„ ์žˆ์Œ -> ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ์กด์žฌ) ์ตœ์ดˆ ํ• ๋‹น ์‹œ์ ์€ ์ ‘๊ทผํ•˜๊ธฐ ์‹œ์ ์— ์ดˆ๊ธฐํ™” ๋˜๋ฉฐ, ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ๋ฆด๋ฆฌ์ฆˆํ•œ๋‹ค. ex) ํ–…ํ‹ฑ๋งค๋‹ˆ์ € ๊ตฌํ˜„ ์ƒ๊ฐํ•˜๊ธฐ
  • KVO ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.โ€‹
    • KVO๋Š” A๊ฐ์ฒด์—์„œ B๊ฐ์ฒด์˜ ํ‚ค์˜ ๊ฐ’์ด ๋ณ€ํ™”๋จ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. KVO ํŒจํ„ด์€ ๊ฐ์ฒด์™€ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋‚˜ ๋‹ค๋ฅธ ์•ก์…˜์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ์—์„œ ๋ฐ˜์‘ํ•˜๋Š” ํ˜•ํƒœ
    • ๋™์ž‘๋ฐฉ์‹ : ๋ชจ๋ธ ๊ฐ์ฒด์˜ ์–ด๋–ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ UI์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ ๊ฐ์ฒด์— Observing์„ ๋„์ž…ํ•˜์—ฌ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์— ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ
    • ์ฆ‰, ๋ณ€์ˆ˜์— ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. property observers(willset , didSet)๊ณผ ์•„์ฃผ ์œ ์‚ฌํ•œ๋ฐ KVO๋Š” ํƒ€์ž… ์ •์˜ ๋ฐ–์—์„œ observe๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค. KVO๋Š” ์ˆœ์ˆ˜ ์Šค์œ„ํ”„ํŠธ ์ฝ”๋“œ๋กœ๋Š” ๊ทธ๋ฆฌ ์ข‹์ง€ ์•Š์€๋ฐ, ๊ทธ ์ด์œ ๋Š” Objective-c ๋Ÿฐํƒ€์ž„์— ์˜์กด ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ NSObject๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•ด @objc ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค. ํŠนํžˆ KVO๋Š” ์†์„ฑ ๊ฐ๊ฐ์— @objc dynamic ์„ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.
  • Delegates์™€ Notification ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ๋‘ ๊ฐ์ฒด ๋ชจ๋‘ ๊ฐ์ฒด๊ฐ„์˜ ์†Œํ†ต์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง. ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฐ์ฒด์— ํ•ด๋‹น ์‚ฌํ•ญ์„ ์ „๋‹ฌํ•ด์„œ ํŠน์ •์ฒ˜๋ฆฌ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ๋‹ค.
    • delegate ๋ฐฉ์‹์€ ์ฃผ๋กœ ์ด๋ฒคํŠธ๋ฅผ 1:1๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ protocol์„ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ์ด๋ฒคํŠธ๋ฅผ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด๊ฐ€ ์ฑ„ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์ œ 3 ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ™•์‹คํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋งŽ์€ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ ๋งŽ์€ ๊ฐ์ฒด์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • notification ๋ฐฉ์‹์€ ์ด๋ฒคํŠธ๋ฅผ 1:N์œผ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. NotificationCenter๋ผ๋Š” ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์—ฌ๋ถ€๋ฅผ ์˜ต์ €๋ฒ„๋ฅผ ๋“ฑ๋กํ•œ ๊ฐ์ฒด์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด์—๊ฒŒ ์†์‰ฝ๊ฒŒ ์ด๋ฒคํŠธ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ 3 ๊ฐ์ฒด๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”๋กœ ํ•˜๋ฉฐ, key๊ฐ’์œผ๋กœ Notification์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์ค‘ ๊ตฌ๋…์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    • (์ฐธ๊ณ ) https://github.com/lunchScreen/Interview_Questions/issues/59
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๋“ค์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  : ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ์ง„ํ–‰ ์‹œ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ํฐ ์ž‘์—…์„ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ์—, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ์‹œ์Šคํ…œ ์ž์› ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ.
    • ์–ด๋–ค ์ž‘์—…์„ ๊ธ€๋กœ๋ฒŒ ํ์— ๋„ฃ์–ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„๋‘ฌ์•ผ ํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ํ์— ๋ฐฐ์น˜ํ•  ๋•Œ์—๋Š” QoS๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™๊ธฐ ๋ฐ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์ƒํ™ฉ์— ์ธ๊ณผ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์‹œ๊ฐ„ ์ดํ›„์— ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ง์ ‘์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„์‚ฐ์ฒ˜๋ฆฌํ•˜๊ณ  GCD, Operation์„ ์ด์šฉํ•˜์—ฌ iOS์—์„œ ์•Œ์•„์„œ ์Šค๋ ˆ๋“œ ์ˆซ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • (์ฐธ๊ณ ) https://velog.io/@hayeon/Delegate-%ED%8C%A8%ED%84%B4%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0%EB%A5%BC-%EC%98%88%EB%A5%BC-%EB%93%A4%EC%96%B4-%EC%84%A4%EB%AA%85%ED%95%98%EC%8B%9C%EC%98%A4

 

 

    • MVC ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ธ”๋ก ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ณ , ๊ฐ ์—ญํ• ๊ณผ ํ๋ฆ„์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
      • MVC ํŒจํ„ด  Model - Controller - View ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. 
      • Model : ์•ฑ์˜ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ(DB, ๋ณ€์ˆ˜, ์ดˆ๊ธฐํ™” ๊ฐ’ ๋“ฑ) ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๊ณ ์žํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ view๋‚˜ controller์—์„œ๋Š” ์–ด๋–คํ•œ ์ •๋ณด๋„ ์•Œ๋ฉด ์•ˆ๋œ๋‹ค. ๋˜ํ•œ, ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ๋ณ€๊ฒฝ ํ†ต์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
      • Controller : ๋ชจ๋ธ์ด๋‚˜ ๋ทฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ชจ๋ธ์ด๋‚˜ ๋ทฐ์˜ ๋ณ€๊ฒฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด์•ผํ•œ๋‹ค. (Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• )
      • View : ๋ชจ๋ธ์ด ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ๋ชจ๋ธ์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค. ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ๋ณ€๊ฒฝ ํ†ต์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ( UI๋‹ด๋‹น ) 
      • [Controller - Model]
        • Controller๋Š” Model์—๊ฒŒ ์–ธ์ œ๋“ ์ง€ ์ด์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ๋ชจ๋ธ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๊ณ , ๋ณด๋‚ด๊ณ  ์‹ถ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        • Model์€ Controller์—๊ฒŒ ์ด์•ผ๊ธฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
          • ์ด์œ ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋Š” UI๋กœ์ง์„ ๋‹ค๋ฃจ๋Š”๋ฐ ๋ชจ๋ธ๊ณผ UI๋Š” ๋ณ„๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
          • ํ•˜์ง€๋งŒ UI์™€ ์ƒ๊ด€์—†๋Š” ๋ชจ๋ธ์ด ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด Notification ๊ณผ KVO ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ์ฆ‰ ์ด ๋˜ํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ง์ ‘ ๋งํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๋ฐฉ์†ก์ฒ˜๋Ÿผ ๊ทธ๋“ค์—๊ฒŒ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.
      • [Controller - View]
        • Controller์™€ View ์—ฐ๊ฒฐ์€ ๋Œ€๋ถ€๋ถ„ Outlet์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
        • View์™€ Controller ์—ญ์‹œ ์ด์•ผ๊ธฐํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ์ด์œ ๋Š” ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•˜์œ„์ข…์†์ž์ด๊ณ , UI์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ๋“ค์„ Controller์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
          • ๋”ฐ๋ผ์„œ ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ด์•ผ๊ธฐํ• ๋•Œ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๊ณ  ๊ตฌ์กฐํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
          • ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑด ๋ทฐ์— ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์ž์‹ ์ด ์–ด๋–ค ํด๋ž˜์Šค์—๊ฒŒ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ๋œป
          • ๊ตฌ์กฐํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑด ๊ฐ์ฒด์— ๋Œ€ํ•ด ์•„๋Š” ๋ฐ”๊ฐ€ ์—†๊ธฐ์— ์ œ๋Œ€๋กœ ๋ฏธ๋ฆฌ ์„œ์ˆ ๋˜์–ด ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜์‚ฌ์†Œํ†ต ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป
        • target-action
          • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ @IBAction ์ฝ”๋“œ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(ํƒ€๊ฒŸ).
          • ๋ทฐ์˜ ํ•˜์œ„์ข…์†์ž ๊ฐ์ฒด๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ทฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
          • ๋ทฐ๋กœ๋ถ€ํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ณด๋‚ด์ง€๊ณ  ์žˆ๋Š” ์•ก์…˜์€ ๋ณดํ†ต ์ปจํŠธ๋กค + ๋“œ๋ž˜๊ทธ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค
        • delegate
          • ๊ฐ€๋” ๋ทฐ๋Š” ๋‹จ์ˆœํžˆ ํ„ฐ์น˜๋˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ๋” ๋ณต์žกํ•œ ์˜์‚ฌ์†Œํ†ต์„ ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
          • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ทฐ์˜ ํ•˜์œ„์ข…์†์ž์ธ ์Šคํฌ๋กค ๋ทฐ๋Š” ๋‹ค์–‘ํ•œ ์ •๋ณด๋“ค์„ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ณ  ๋ฐ˜์‘ํ•ด์•ผ ํ•˜๊ณ , ์ •๋ณด๊ฐ€ ๋ชจ๋ธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
          • ๋”ฐ๋ผ์„œ ์ฃผ๊ณ ๋ฐ›๋Š” ์ •๋ณด๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๊ณ , should, will, did ๊ฐ™์€ ๋ง์ด ํฌํ•จ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
          • ๋ทฐ์˜ ํ•˜์œ„์ข…์†์ž๋“ค์€ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋‹ค์–‘ํ•œ ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š”๋ฐ should, will, did ๊ฐ™์€ ๋ง์ด ํฌํ•จ๋œ ์งˆ๋ฌธ๋“ค์€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์ด๋ค„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
            • delegate๋Š” ์œ„์ž„์ด๋ผ๋Š” ๋œป์ธ๋ฐ, ๋ทฐ์˜ ํ•˜์œ„์ข…์†์ž๋“ค์ด ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์–ด๋–ค ์ฑ…์ž„์„ ์œ„์ž„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
            • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ๋ทฐ ์•ˆ์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค.
        • datasource
          • ๋ทฐ๋Š” ์ž์‹ ์ด ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
          • ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋งค๋ฒˆ ๋ฌผ์–ด๋ณด๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
          • ์ด๊ฒƒ์€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์™€ ๋‹ค๋ฅธ์ข…๋ฅ˜์˜ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
          • should, will, did ๋Œ€์‹  ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
          • ๋ทฐ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ด๊ณณ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ฌ๋ผ๊ณ ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€ ๋ฌผ์–ด๋ด์„œ ๋ฌด์Šจ ์ผ์ด ์ƒ๊ธฐ๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ๋˜๊ณ , ๊ทธ๊ฑธ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
          • ์ด๊ฒƒ ๋˜ํ•œ ๋ธ๋ฆฌ๊ฒŒ์ด์…˜ ๊ณผ์ •์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์“ฐ์ด๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๊ฐ€ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

 

  • ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํŠน์ • ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ, ํ”„๋กœํผํ‹ฐ, ๊ธฐํƒ€ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์œผ๋กœ ์กฐ๊ฑด์„ ์ •์˜๋ฅผ ํ•  ๋ฟ ์Šค์Šค๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง„ ์•Š๋Š”๋‹ค.
    • ํ•˜์ง€๋งŒ ํ”„๋กœํ† ์ฝœ์— ์ •์˜ํ•œ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ๋Š” ํ•„์ˆ˜๋กœ ์ •์˜ํ•ด์•ผํ•˜๋Š” ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.
    • ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” get / set ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•˜๊ณ , ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ๋• ๊ตฌํ˜„์ด ์—†๊ฒŒ๋” ์ž‘์„ฑํ•˜๊ณ , staticํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋‚˜ ํƒ€์ž… ๋ฉ”์†Œ๋“œ๊ฐ€ ๋˜๋„๋ก ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Œ.
    • ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค ,์—ด๊ฑฐํ˜•์€ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์„œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.
      • valueํƒ€์ž…์ธ ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์ผ ๊ฒฝ์šฐ, ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฉ”์†Œ๋“œ ์ž์‹ ์ด ์†ํ•ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ์˜๋„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉ”์†Œ๋“œ ์ •์˜๋ถ€ ์•ž ๋ถ€๋ถ„์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
      • class๋งŒ @objc ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
        protocol testDelegate { 
           var test: Int { get } 
           var test2: Int? { get } 
           func textFunction(hello: String) -> String
        }
        
        extension testDelegate { 
           var text: Int { 
              return 3
           }
           func textFunction(hello: String) -> String { 
              return "test \(hello)"
           }
        }
        
        class testClass: testDelegate { 
           var text2: Int?
        }
        let example: testClass = testClass()
        
        print(example.test) // 3
        print(example.test2) // nil
        print(example.textFunction(hello: "hi")) // test hi
      • ํ”„๋กœํ† ์ฝœ์—๋„ extension์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. extension์—์„œ ์˜ต์…”๋„ ๋ถ€๋ถ„์„ ์ •์˜ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

 

  • Protocol Oriented Programming๊ณผ Object Oriented Programming์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • Protocol Oriented Programming์€ ํ”„๋กœํ† ์ฝœ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, Object Oriented Programming์€ ๊ฐ์ฒด ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ž…๋‹ˆ๋‹ค. POP๋Š” ํ”„๋กœํ† ์ฝœ ํ™•์žฅ์„ ํ†ตํ•˜์—ฌ ์ˆ˜ํ‰ ๊ตฌ์กฐ๋กœ ํƒ€์ž…์„ ํ™•์žฅํ•˜๊ณ , OOP๋Š” ์Šˆํผํด๋ž˜์Šค์˜ ์ƒ์†์„ ํ†ตํ•˜์—ฌ ์ˆ˜์ง ๊ตฌ์กฐ๋กœ ํƒ€์ž…์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ ํ•ฉ๋‹ˆ๋‹ค.
    • OOP๋Š” ์ƒ์†์„ ๊ธฐ๋ณธ ์ „์ œ๋กœ ๊ฐ€์ ธ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— Super Class์™€ Sub Class๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ Sub Class๋Š” Super Class๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์—๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š์€ property๋‚˜ method๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ POP๋Š” protocol์— ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ „์ œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ property๋‚˜ method๋ฅผ ๊ฐ–์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒ์†์—์„œ๋Š” ํ•˜๋‚˜์˜ Sub Class๋Š” ํ•˜๋‚˜์˜ Super Class๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ Protocl์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • (์ฐธ๊ณ ) https://github.com/lunchScreen/Interview_Questions/issues/28

 

  • Hashable์ด ๋ฌด์—‡์ด๊ณ , Equatable์„ ์™œ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • Hashable์ด๋ž€ Set, Dictionary ๋“ฑ Collection ๊ตฌ์กฐ์—์„œ ์ž„์˜์˜ ์ž๋ฃŒํ˜•์„ ์ •์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Key๊ฐ’์„ ํ†ตํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๋˜ํ•œ Hashable์€ Equatable์˜ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” Hashable์„ ํ†ตํ•ด์„œ ๋ณ€ํ™˜๋œ ์ •์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • Hashable์˜ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ Key๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ ์ž์ฃผ ์–ธ๊ธ‰๋œ๋‹ค.
    • (์ฐธ๊ณ ) https://dev-dream-world.tistory.com/68

 

  • mutating ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํด๋ž˜์Šค๋Š” ref ํƒ€์ž…์ด๊ณ  struct์™€ enum์€ value type์ด๋‹ค. value ํƒ€์ž…์˜ ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ mutating์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. mutating์„ ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. mutating์„ ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋ณ€๊ฒฝํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์›๋ž˜ struct์— ๋‹ค์‹œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”์„œ๋“œ๋Š” self property์— ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 
    • mutating ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด ์‹ค์ œ ๋ณต์‚ฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• 
  • ํƒˆ์ถœ ํด๋กœ์ €์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ํด๋กœ์ €, ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›์€ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜ ์ข…๋ฃŒ ํ›„์— ํ˜ธ์ถœ๋  ๊ฒฝ์šฐ "ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํƒˆ์ถœํ•œ๋‹ค"๋กœ ํ‘œํ˜„
    • (์‚ฌ์šฉ๋ฒ•) @escaping ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ
    • (์–ธ์ œ ํƒˆ์ถœํ• ๊นŒ?) ์ „๋‹ฌ ๋ฐ›์€ ํด๋กœ์ €๊ฐ€ ํด๋กœ์ € ํ•จ์ˆ˜ ์™ธ๋ถ€๋กœ ๋‹ค์‹œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ, ์™ธ๋ถ€ ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๊ฒฝ์šฐ
    • // @escaping ์„ ์–ธ์ด ์—†๋‹ค๋ฉด ๊ตฌ๋ฌธ ๋ฐ–์—์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์— ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
      var completionHandlers: [() -> Void] = []
      
      func withEscaping(completion: @escaping () -> Void) {
          completionHandlers.append(completion)
      }
    • (์™œ ํƒˆ์ถœ ์‹œํ‚ฌ๊นŒ?) ๋ณดํ†ต์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
    • private func requestSignup(_ url: String, _ headers: HTTPHeaders?, _ parameters: Parameters?, _ completion: @escaping (NetworkResult<Codable>) -> Void) {
          guard let url = try? url.asURL() else { return }
      
          AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
              .validate(statusCode: 200...500)
              .responseDecodable(of: APIResponseData<APICantSortableDataResult<SignupResponse>, APIError>.self) { response in
                  switch response.result {
                      case .success(let signupResponse):
                          guard let statusCode = response.response?.statusCode else { return }
                          if statusCode == 200 {
                              completion(.success(signupResponse.data?.result)) }
                          else { completion(.requestErr(signupResponse.error?.errorMessage)) }
                      case .failure:
                          completion(.networkFail)
                  }
          } 
      }
    • ์ด๋ ‡๊ฒŒ ํƒˆ์ถœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ๊ฒฐ๊ณผ์— ๋งž๋Š” ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜ ๊ตฌ๋ฌธ ๋ฐ–์—์„œ๋„ ์ ์ ˆํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Extension์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์— ์ƒˆ๋กญ๊ฒŒ ๊ธฐ๋Šฅ ๋“ฑ์„ ์ •์˜, ํŠน์ • ํƒ€์ž…์˜ ๊ธฐ๋Šฅ ๋ฐ ์ค€์ˆ˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋ณ„ ๊ตฌํ˜„๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๋‹ค ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ.
    • ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์Œ.
  • Extension ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ overrideํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” "extension์€ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ Overrideํ•  ์ˆ˜ ์—†๋‹ค"๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋‚˜, ๊ฐœ๋ฐœ์—์„œ๋Š” extension์„ ํ†ตํ•ด override๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” obj-c์™€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ ๊ทธ๋Ÿฌ๋‚˜, ์• ํ”Œ์—์„œ๋Š” ์ต์Šคํ…์…˜์€ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ํ•˜๋‹ˆ ์ต์Šคํ…์…˜์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋Š” ์ง€์–‘ํ•˜์ž.
    • (์ฐธ๊ณ ) https://feather.tistory.com/2
  • ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—” ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • 1. private : ๊ตฌํ˜„ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • 2. fileprivate : ๊ตฌํ˜„๋œ ์†Œ์ŠคํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • 3. internal(default) : ์†Œ์ŠคํŒŒ์ผ์ด ์†ํ•ด ์žˆ๋Š” ๋ชจ๋“ˆ ์–ด๋””์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ, ์™ธ๋ถ€ ๋ชจ๋“ˆ์—์„œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€
    • 4. public : ์–ด๋””์„œ๋“  ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ์ฃผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์™ธ๋ถ€์™€ ์—ฐ๊ฒฐ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋งŽ์ด ์“ฐ์ž„
    • 5. open : ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค ๋ฉค๋ฒ„์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ๋ชจ๋“ˆ ๋ฐ–์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ์žฌ์ •์˜ ๊ฐ€๋Šฅ, open์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • (1,2,3)์€ Application development (4,5) Framework develpment์—์„œ ์‚ฌ์šฉ

 

  • defer๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • defer๋ž€ ํ˜„์žฌ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋‚˜๊ฐ€๊ธฐ ์ „์— ๊ผญ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ

 

  • defer๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๊ณ , defer๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • defer๋Š” ์„ ์–ธ๋œ ์—ญ์ˆœ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ฆ‰ ์•„๋ž˜ -> ์œ„, ์ค‘์ฒฉ์˜ ๊ฒฝ์šฐ๋Š” defer์—์„œ ๋‚ด๋ถ€ -> ์™ธ๋ถ€ ์ˆœ์„œ์ด๋‹ค.
    • ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š”
      • 1. throw๋ฅผ ์ด์šฉํ•ด์„œ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ๊ฒฝ์šฐ
      • 2. guard๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ์ค‘๋‹จํ•˜๋Š” ๊ฒฝ์šฐ 
      • 3. ๋ฆฌํ„ด๊ฐ’์ด never(๋น„๋ฐ˜ํ™˜ํ•จ์ˆ˜)์˜ ๊ฒฝ์šฐ
  • property wrapper์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” property ๊ตฌํ˜„ ํŒจํ„ด์— ๋Œ€ํ•œ ์ง‘ํ•ฉ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ํ•˜๋“œ์ฝ”๋”ฉ ํ•˜๋Š” ๋Œ€์‹ , ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š”๊ฒƒ.
    • @ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SwiftUI์—์„œ @State @Binding @EnvironmentObject ๋“ฑ์˜ ๋งŽ์€ Property wrapper๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

  • Generic์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • ํฌ๊ด„์ ์ธ์ด๋ž€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋œป์œผ๋กœ Swift์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜.
    • ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•œ๋‹ค๋ฉด ํƒ€์ž…์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ œ๋„ค๋ฆญ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๊ณผ ํƒ€์ž…์€ ์žฌ์‚ฌ์šฉ์— ์šฉ์ดํ•˜๋ฉฐ, ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ๊น”๋”ํ•œ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์ œ๋„ค๋ฆญ์€ ํƒ€์ž… ์ œ์•ฝ์„ ๊ฑธ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ํƒ€์ž… ์ œ์•ฝ์€ ํด๋ž˜์Šค ํƒ€์ž… ๋˜๋Š” ํ”„๋กœํ† ์ฝœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. (๊ตฌ์กฐ์ฒด ํ˜น์€ ์—ด๊ฑฐํ˜• ๋“ฑ์˜ ํƒ€์ž…์€ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ) 
    • func swap<T>(_ a: inout T, _ b: inout T) { 
          let temp: T = a
          a = b
          b = temp
      }
      
      var first = 1
      var second = 2
      swap(1,2) 
      
      print("\(first) \(second)") // 2 1
      
      var str1 = "str1"
      var str2 = "str2"
      swap(str1, str2)
      
      print("\(str1) \(str2)") // str2 str1
      
      // ํƒ€์ž…์„ ์ œ์•ฝํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ
      func substract<T: BinaryInteger>(_ a: inout T, _ b: inout T) -> T { 
          return a - b
      }

 

  • some ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • swiftUI์—์„œ body์— ์œ„์น˜ํ•œ someํ‚ค์›Œ๋“œ๋ฅผ ์ž์ฃผ ๋ณด์•˜๋Š”๋ฐ ์šฐ์„  body ํ”„๋กœํผํ‹ฐ๋Š” computed property๋กœ์จ view์˜ contents๋ฅผ returnํ•œ๋‹ค. some ํ‚ค์›Œ๋“œ๋Š” ๋ฆฌํ„ด ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ๋น ๋ฅด๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์œ„์น˜ ๊ธฐ๋Šฅ
    • some์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ํƒ€์ž…์œผ๋กœ ํ”„๋กœํ† ์ฝœ์— ์ •์˜๋˜์–ด ์žˆ๊ณ , ํ•จ์ˆ˜๋‚˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ด ํ”„๋กœํ† ์ฝœ์„ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๊ฐ–๊ณ  ์‹ถ์„ ๋•Œ ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ํƒ€์ž…์ด๋ผ์„œ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ทธ ์˜ค๋ฅ˜๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ๊ทธ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ ์ž ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด someํ‚ค์›Œ๋“œ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ•จ์ˆ˜ ํ˜น์€ ํ”„๋กœํผํ‹ฐ๋Š” ๋™์ผํ•œ ๋ช…ํ™•ํ•œ ํƒ€์ž…์„ ๊ฐ€์ง„ ๊ฐ’๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.
    • (์ •๋ฆฌ) ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ concrete type์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ™•์‹ ์„ ์ฃผ๋Š” ํ‚ค์›Œ๋“œ
    • (์ฐธ๊ณ ) https://peachberry0318.tistory.com/18

 

  • Resultํƒ€์ž…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • Swift์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํƒ€์ž…์œผ๋กœ success์™€ failure๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , ์ด ๋‘๊ฐ€์ง€ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ด€๋œ ๊ฐ’์„ ํ‘œํ˜„ํ•œ๋‹ค. enum์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค.

 

  • Codable์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์‹œ์˜ค.
    • swift4์—์„œ ๋‚˜์™€์„œ Encodable๊ณผ Decodable์ด ํ•ฉ์ณ์ง„ ๊ฒƒ.
    • Encodable : data๋ฅผ Encoder๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ํ•ด์ฃผ๋ ค๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ
    • Decodable : data๋ฅผ ์›ํ•˜๋Š” ๋ชจ๋ธ๋กœ Decodeํ•ด์ฃผ๋Š” ๊ฒƒ

 

 

 

 

(์ฐธ๊ณ )

https://velog.io/@hayeon

 

hayeon (์ดํ•˜์—ฐ) - velog

Swift ๋„ค์ด๋ฐ ๋ฐ ๊ฐœ๋ฐœ ๊ทœ์น™ Swift ๋„ค์ด๋ฐ ๊ทœ์น™ ์Šค์œ„ํ”„ํŠธ ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •์‹œ ๊ทœ์น™ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ ์–ด๋–ค ๋ฌธ์ž๋“ ์ง€ ์‚ฌ์šฉ๊ฐ€๋Šฅ ( ๋‹จ, ํŠน์ˆ˜๋ฌธ์ž, ์ˆ˜ํ•™ ๊ธฐํ˜ธ, ํ™”์‚ดํ‘œ, ๊ฐœ์ธ์šฉ ์œ ๋‹ˆ

velog.io

https://jusung.gitbook.io/the-swift-language-guide/

 

The Swift Language Guide (ํ•œ๊ตญ์–ด) - The Swift Language Guide (ํ•œ๊ตญ์–ด)

์—ฐ๋ฝ์ฒ˜ ๋ฐ ๋„์›€์„ ์ฃผ์‹  ๋ถ„๋“ค

jusung.gitbook.io

 

'โš ๏ธ deprecated โš ๏ธ > ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป iOSInterviewquestions' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

iOSInterviewquestions - iOS  (0) 2022.04.06
iOSInterviewquestions - ARC  (0) 2022.04.02
iOSInterviewquestions - Rx  (0) 2022.04.02
iOSInterviewquestions - Autolayout  (0) 2022.04.02
Comments