๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ๊ธฐ๋ก/TIL

[TIL] 20231122

Optional

๐Ÿ”ฝ Optional๊ณผ Optional Unwrapping์— ๋Œ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ

 

[Swift] Optional

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค :) TIL์„ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ์˜ต์…”๋„์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”, ๊ทธ๋ƒฅ ์˜ต์…”๋„ ๋ฝ€๊ฐœ๊ธฐ๋กœ ์ œ๋Œ€๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜์ž ์‹ถ์–ด์„œ Optional์— ๋Œ€ํ•œ ๊ณต์‹๋ฌธ์„œ์™€ ๊นƒํ—ˆ๋ธŒ์— ์˜คํ”ˆ๋œ Optional ๋‚ด๋ถ€ ๊ตฌ

janechoi.tistory.com

+ Optional ํƒ€์ž…์˜ ๊ฐ’์„ == ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ?

Optional์˜ ๊ฐ’ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Swift์—์„œ Optional์„ ๊ตฌํ˜„ํ•  ๋•Œ, ===! ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ

Equatable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜์—ฌ == ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

 

extension Optional: Equatable where Wrapped: Equatable {
  
  @_transparent
  public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
    switch (lhs, rhs) {
    case let (l?, r?):
      return l == r
    case (nil, nil):
      return true
    default:
      return false
    }
  }
}

 

์ถœ์ฒ˜: https://github.com/apple/swift/blob/main/stdlib/public/core/Optional.swift

final ํ‚ค์›Œ๋“œ

์ฝ”๋“œ ๋ฆฌ๋ทฐ๋กœ final ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์Œ

๊ฐ„๋‹จํ•˜๊ฒŒ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ์•˜์ง€๋งŒ ์งˆ๋ฌธ์„ ๋ฐ›์€ ๊น€์— ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค!!

 

final ํ‚ค์›Œ๋“œ๋ž€? (๊ณต์‹๋ฌธ์„œ ๋ฒˆ์—ญ)

final ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, ํ˜น์€ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ex) final var, final func, final class

final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ method, property, subscript ๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด, ์ปดํŒŒ์ผ ํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ํด๋ž˜์Šค ์ •์˜ ์‹œ ์•ž์— final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ํด๋ž˜์Šค ์ž์ฒด๋ฅผ final๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๋„๋ฅผ ํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์š”์•ฝ

1. class ์•ž์— final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง

2. ํด๋ž˜์Šค์˜ ์†์„ฑ(๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ ๋“ฑ)์— final์„ ๋ถ™์—ฌ์ฃผ๋ฉด override(์žฌ์ •์˜)๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง

์„ฑ๋Šฅ์  ์ด์ 

์ƒ์†, ์žฌ์ •์˜ ๋ฐฉ์ง€ ์ด์™ธ์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ ์ธ ์ด์ ๋„ ์žˆ์Œ!

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐฉ๋ฒ•: Method Dispatch ๋ผ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ํŒ๋‹จํ•จ

Method Dispatch

์–ด๋–ค ์—ฐ์‚ฐ(operation)์„ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋„๋ก ๋•๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ,

ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŠน์ • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ CPU์— ์•Œ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค

 

์ข…๋ฅ˜

1. Static Dispatch

์ปดํŒŒ์ผ ํƒ€์ž„์— ์‹ค์ œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹

 

์žฅ์ : ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์†๋„๊ฐ€ ๋น ๋ฆ„

๋‹จ์ : ์„œ๋ธŒ ํด๋ž˜์‹ฑ(์ƒ์†)์ด ๋ถˆ๊ฐ€๋Šฅํ•จ

 

์ฐธ๊ณ ) UIKit์€ class๋กœ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ์ง€๋งŒ,  SwiftUI๋Š” struct๋กœ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— Static Dispatch ๋ฐฉ์‹์ธ SwiftUI๊ฐ€ ์†๋„ ์ธก๋ฉด์—์„œ ๋น ๋ฅผ ์ˆ˜ ๋ฐ–์— ์—†์Œ. (struct๋Š” ๊ฐ’ ํƒ€์ž…์ด๋ผ ์• ์ดˆ์— ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

2. Dynamic Dispatch

๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋ ์ง€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ, ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ์ง€ ๋ชจ๋ฆ„

 

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

๋‹จ์ : ํด๋ž˜์Šค์˜ vTable์—์„œ์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ฐพ์•„ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ Static Dispatch์— ๋น„ํ•ด ๋Š๋ฆผ 

 

final์„ ์ด์šฉํ•œ ์•ฑ ์„ฑ๋Šฅ ํ–ฅ์ƒ

final๋ฅผ ๋ถ™์ด๋ฉด ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ์— ๋ถ™์„ ๊ฒฝ์šฐ์—๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Static Dispatch๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ ์ƒ์†์ด๋‚˜ ์žฌ์ •์˜๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ Static Dispatch๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์•ฑ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!


[์ฐธ๊ณ  ์ž๋ฃŒ]

https://jellysong.tistory.com/122

https://velog.io/@stealmh/Swift-Final-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%9D%98-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81

'๐Ÿ“ ๊ธฐ๋ก > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL] 20231129  (1) 2023.11.29
[TIL] 20231128  (3) 2023.11.29
[TIL] 20231124  (1) 2023.11.25
[TIL] 20231123  (1) 2023.11.23
[TIL] 20231121  (0) 2023.11.21