λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/Swift

[Swift] μŠ€ν„°λ”” 2μ£Όμ°¨ - μŠ€μœ„ν”„νŠΈ 데이터 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜

by Danna 2021. 5. 28.
728x90
728x90

4/27 μ§„ν–‰ν–ˆλ˜ μŠ€μœ„ν”„νŠΈ 데이터 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜ μ±…μ˜ 2μž₯ 'μŠ€μœ„ν”„νŠΈ κΈ°λ³Έ 데이터 ꡬ쑰의 ν™œμš©' μŠ€ν„°λ”” μ •λ¦¬μž…λ‹ˆλ‹€! 맀주 μŠ€ν„°λ””λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ‚΄μš© κ³΅μœ μ™€ μ˜ˆμ œλŠ” ν•™μŠ΅ν–ˆμ§€λ§Œ ν¬μŠ€νŒ…μ΄ λ°€λ¦¬κ²Œ λ˜μ—ˆλ„€μš” .. πŸ˜…

 

πŸ‘€ 2μž₯ μš”μ•½

2μž₯μ—μ„œλŠ” Swift 의 ν‘œμ€€ 라이브러리λ₯Ό 기반으둜 데이터 ꡬ쑰λ₯Ό μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

ν¬κ²ŒλŠ” λ‹€μŒ 주제둜 λ‚˜λ‰©λ‹ˆλ‹€! 각각 μ •λ¦¬ν•œ ν¬μŠ€νŒ… 링크λ₯Ό λ‚¨κ²¨λ‘˜κ²Œμš”~ 

 

 

πŸ‘‰ μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type)

μ»¬λ ‰μ…˜ νƒ€μž…μ€ μ—¬λŸ¬ 값을 μ €μž₯ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ, Swift 에 κ΅¬ν˜„λœ μ»¬λ ‰μ…˜ νƒ€μž…μ€ Array, Dictionary, Set κ°€ μžˆμŠ΅λ‹ˆλ‹€. Tuple 은 μ»¬λ ‰μ…˜ νƒ€μž…μ€ μ•„λ‹ˆμ§€λ§Œ, μœ μ‚¬ν•œ λ°©μ‹μœΌλ‘œ ν™œμš©λ©λ‹ˆλ‹€!

 

  • λ°°μ—΄(Array) : μˆœμ„œλ₯Ό 가지며, 동일 νƒ€μž…μ˜ 값을 λͺ©λ‘μœΌλ‘œ μ €μž₯ν•˜λŠ” μ»¬λ ‰μ…˜
  • λ”•μ…”λ„ˆλ¦¬(Dictionary; μ‚¬μ „ν˜•) : λ™μΌν•œ 데이터 νƒ€μž…μ΄ Key: Value 쌍으둜 묢인 μˆœμ„œκ°€ μ—†λŠ” μ»¬λ ‰μ…˜, 사전과 λΉ„μŠ·ν•œ ꡬ쑰
  • 집합(Set) : nil 이 ν¬ν•¨λ˜μ§€ μ•Šκ³  μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” κ°’μœΌλ‘œ κ΅¬μ„±λœ μˆœμ„œκ°€ μ—†λŠ” μ»¬λ ‰μ…˜, μˆ˜ν•™μ—μ„œμ˜ 집합 κ°œλ…μ„ 기반으둜 λ§Œλ“  νƒ€μž…
  • νŠœν”Œ(Tuple) : λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ˜ 값을 담을 수 μžˆλŠ” νƒ€μž…(λ‚΄λΆ€ μš”μ†Œκ°€ λͺ¨λ“  같은 νƒ€μž…μ΄ μ•„λ‹ˆμ–΄λ„ 됨), μ—°κ΄€ κ°’μ˜ μž„μ‹œ 그룹을 λ§Œλ“œλŠ”λ° μ‚¬μš© (ν•¨μˆ˜μΈμž, λ°˜ν™˜κ°’ λ“±)

 

 

πŸ€” μ–΄λ €μ› λ˜ λΆ€λΆ„

1. ν•΄λ‹Ή 책이 λ°œν–‰λ λ•Œ μ―€ Objective-C μ—μ„œ Swift 둜 λ„˜μ–΄κ°€λŠ” μ‹œμ μ΄λΌ κ·ΈλŸ°μ§€, Objective-C μ™€μ˜ λΈŒλ¦Ώμ§•μ— λŒ€ν•œ λ‚΄μš©κ³Ό 문법에 λŒ€ν•œ λ‚΄μš©μ΄ λ§Žμ•„μ„œ 이해가 μ–΄λ €μ› λ‹€.

 

2. Dictionary 의 Key 와 Set 의 값은 Hashable ν”„λ‘œν† μ½œμ„ λ§Œμ‘±ν•΄μ•Όν•œλ‹€. λΌλŠ” μ •μ˜μ—μ„œ Hashable κ°œλ…μ΄ ν—·κ°ˆλ Έλ‹€.

 

3. 배열을 λ³΅μ‚¬ν•˜λŠ” 경우 Copy-on-Write κΈ°λŠ₯이 ν™œμš©λœλ‹€. μ—μ„œ Copy-on-Write (CoW) κ°œλ…μ„ 처음 듀어봐 μ–΄λ €μ› λ‹€. 

 

4. 데이터 κ΅¬μ‘°μ—μ„œ κ°’μ˜ μ‚½μž…, μ‚­μ œμ‹œ λΉ…μ˜€ ν‘œν˜„λ²•μ„ μ‚¬μš©ν•˜λŠ”λ°, 이에 λŒ€ν•œ μ •μ˜κ°€ ν—·κ°ˆλ Έλ‹€. 

 

πŸ’‘ ν•΄κ²°ν•œ λ°©λ²• / μΆ”κ°€ ν•™μŠ΅

1. Objective-C 와 Swift 데이터 νƒ€μž…κ°„ λΈŒλ¦Ώμ§•

Objective-C μ—μ„œμ˜ λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬, μ„ΈνŠΈλŠ” NSArray, NSDictionary, NSSet νƒ€μž…μ΄κ³ , Swift μ—μ„œλŠ” Arary, Dictionary, Set νƒ€μž…μ΄λ‹€. Swift μ—μ„œλŠ” NS[Type] <-> [Type] κ°„ λΈŒλ¦Ώμ§•μ„ μ§€μ›ν•œλ‹€. ContiguousArray 의 경우 Objective-C μ™€μ˜ λΈŒλ¦Ώμ§•μ΄ μ•ˆλœλ‹€.

 

2. Hashable ν”„λ‘œν† μ½œ

Hashable 에 λŒ€ν•œ κ°„λ‹¨ν•œ λœ»μ€ "μœ μΌν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯ν•œ 값을 μ œκ³΅ν•œλ‹€(값이 μœ λ‹ˆν¬ν•˜λ‹€), 검색이 μš©μ΄ν•˜λ‹€" 둜 μ΄ν•΄ν–ˆλ‹€.

Hashable ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€λŠ” λœ»μ€ hash 될 수 μžˆλŠ” νƒ€μž…μΈ 것이닀. hash 될 수 μžˆλ‹€λŠ” λœ»μ€ hash ν•¨μˆ˜μ— μ μš©ν•  수 μžˆλ‹€λŠ” 뜻이며, μž„μ˜μ˜ 길이의 데이터λ₯Ό μœ μΌν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯ν•œ κ³ μ •λœ 길이의 λ°μ΄ν„°λ‘œ λ°”κΏ€ 수 μžˆλ‹€λŠ” λœ»μ΄λ‹€.

Hashable ν”„λ‘œν† μ½œμ€ Equatable 을 μƒμ†ν•œ ν”„λ‘œν† μ½œμ΄κ³ , μŠ€μœ„ν”„νŠΈμ˜ λͺ¨λ“  κΈ°λ³Έ νƒ€μž…(Int, Double ..) 은 Hashable ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λ„둝 섀계됐닀.

 

πŸ‘€ Dictionary 의 Key 와 Set 의 값은 μ™œ Hashable ν•΄μ•Όν• κΉŒ?

ν•΄μ‹œν•¨μˆ˜λŠ” μž„μ˜μ˜ 길이의 데이터λ₯Ό κ³ μ •λœ 길이의 λ°μ΄ν„°λ‘œ λ§€ν•‘ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. ν•΄μ‹œν•¨μˆ˜λŠ” ν•΄μ‹œν…Œμ΄λΈ”μ΄λΌλŠ” μžλ£Œκ΅¬μ‘°μ— 이용되며, ν•΄μ‹œν•¨μˆ˜λ₯Ό 톡해 데이터λ₯Ό μ €μž₯/μ‚­μ œ/μ‘°νšŒμ‹œ 평균 μ‹œκ°„λ³΅μž‘λ„λŠ” O(1) 둜 맀우 λΉ λ₯΄κ²Œ μž‘λ™λœλ‹€. 

Dictionary 의 Key 와 Set μ—λŠ” μˆœμ„œκ°€ μ—†κΈ° λ•Œλ¬Έμ—, hashable ν•œ νƒ€μž…μ΄μ–΄μ•Ό μ›μ†Œλ₯Ό λΉ λ₯΄κ²Œ 찾을 수 있기 λ•Œλ¬Έμ΄λ‹€. hashable ν”„λ‘œν† μ½œμ˜ μ •μ˜λŠ” "μ •μˆ˜ hash 값을 μ œκ³΅ν•˜λŠ” νƒ€μž…" μ΄λ―€λ‘œ, μ •μˆ˜ hash κ°€ μžˆμ–΄ μ›μ†Œλ₯Ό λΉ λ₯΄κ²Œ 찾을 수 있게 λ˜λŠ” 것이닀.

 

 

3. Copy-on-Write (CoW)

νŠΉμ • μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ‚¬ν•œ 경우, μˆ˜μ •(Write)이 일어날 λ•Œ 볡사(Copy)ν•œλ‹€λŠ” λœ»μ΄λ‹€. 

μŠ€μœ„ν”„νŠΈμ˜ Collection Type 인 Array, Dictionary, Set μ—μ„œ 원본 λ¦¬μ†ŒμŠ€λ₯Ό 볡사할 λ•Œ μ μš©λœλ‹€.

* μ‚¬μš©μž μ •μ˜ κ΅¬μ‘°μ²΄μ—μ„œλ„ CoW κ°œλ…μ„ μ μš©ν•  수 μžˆλ‹€.

 

μ›λ³Έμ΄λ‚˜ 볡사본이 μˆ˜μ •λ˜κΈ° μ „κΉŒμ§€λŠ” 볡사λ₯Ό ν•˜μ§€ μ•Šκ³ , 원본 λ¦¬μ†ŒμŠ€λ₯Ό κ³΅μœ ν•œλ‹€.

μ›λ³Έμ΄λ‚˜ λ³΅μ‚¬λ³Έμ—μ„œ μˆ˜μ •μ΄ 일어날 경우, κ·Έ λ•Œ λ³΅μ‚¬ν•˜λŠ” μž‘μ—…μ„ ν•œλ‹€.

=> μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” 원본 λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ—¬ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©κ³Ό μ‹œκ°„μ„ 쀄이기 μœ„ν•¨μ΄λ‹€.

 

 

4. λΉ…μ˜€ ν‘œν˜„λ²• Big-O

Big-O λŠ” ν•¨μˆ˜μ˜ 점근적 뢄석을 ν‘œν˜„ν•˜λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ 방법 쀑 ν•˜λ‚˜μ΄λ‹€. 

* 점근적 뢄석 (asymptotic analysis) λŠ” λ¬΄ν•œλŒ€μ— κ°€κΉŒμš΄ μž…λ ₯값을 λΆ„μ„ν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 방법이닀.

=> Big-O λŠ” λ¬΄ν•œλŒ€μ— κ°€κΉŒμš΄ μž…λ ₯값을 λΆ„μ„ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μΈ‘μ •ν•˜κ³  ν‘œν˜„ν•˜λŠ” λŒ€ν‘œμ μΈ 방법 쀑 ν•˜λ‚˜μ΄λ‹€.

 

Big-O λŠ” μ•Œκ³ λ¦¬μ¦˜ ν‘œν˜„μ—μ„œ μƒμˆ˜λ₯Ό 감좀으둜써 μ’€ 더 κ°„νŽΈν•˜κ²Œ μ‹€ν–‰ 속도λ₯Ό μΈ‘μ •ν•  수 μžˆλ‹€.

  • μ‹€ν–‰ μ‹œκ°„μ΄ 3n + 5 ⇒ λΉ…μ˜€ O(n)
  • μ‹€ν–‰ μ‹œκ°„μ΄ n^2 + 10n + 33 ⇒ O(n^2)
  • μ‹€ν–‰ μ‹œκ°„μ΄ 100n^5 + n^3 + 2 ⇒ O(n^5)

Hashable 참고 링크

 

Copy-on-Write 참고 링크

 

 

 

 

728x90
728x90