λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • Dev Blog
CS/λ””μžμΈ νŒ¨ν„΄

[GoF λ””μžμΈ νŒ¨ν„΄] - ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄

by μœ μ§„μ˜ 2024. 11. 29.
λͺ¨λ“  μ½”λ“œλŠ” Swift둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

문제 상황

λ„€νŠΈμ›Œν¬ μž‘μ—… 같이 λΉ„μš©μ΄ 많이 λ“œλŠ” μž‘μ—…μ„ 톡해 μƒμ„±λ˜λŠ” 객체λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€κ³  싢을 λ•Œκ°€ μžˆλ‹€. 객체λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€κ² λ‹€κ³  λ™μΌν•œ λ„€νŠΈμ›Œν¬ μž‘μ—…μ„ λ°˜λ³΅ν•΄μ„œ ν•˜λŠ” 것은 λ‹Ήμ—°νžˆ λΉ„νš¨μœ¨μ μ΄λ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ λ‹Ήμ—°νžˆ μš°λ¦¬λŠ” μ•„λž˜ μ½”λ“œμ™€ 같이 처음 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό 볡사 ν•  것이닀.

 

class Response {
	// JSON 데이터와 κ΄€λ ¨λœ 멀버 λ³€μˆ˜λ“€...
}

let data = Network().requestAPI("https://127.0.0.1:8080/map/search")
let response = Response(data)

let copy1 = response
let copy2 = response
let copy3 = response

 

 

클래슀의 μΈμŠ€ν„΄μŠ€λŠ” 볡사할 경우 얕은 볡사가 λ˜λ―€λ‘œ copy1의 λ³€κ²½ 사항이 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” λͺ¨λ“  곳에 μ μš©λœλ‹€. λ§Œμ•½, copy1의 변경이 copy1μ—μ„œλ§Œ 적용되게 ν•˜κ³  μ‹ΆμœΌλ©΄, 즉 κΉŠμ€ 볡사λ₯Ό ν•˜κ³  μ‹ΆμœΌλ©΄ μ–΄λ–»κ²Œ ν• κΉŒ?

 

ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄

ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄μ€ 자기 μžμ‹ μ„ κΉŠμ€ 볡사 ν•  수 있게 ν•΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.

 

UML 클래슀 λ‹€μ΄μ–΄κ·Έλž¨

 

https://yagom.net/courses/design-pattern-in-swift/lessons/생성-νŒ¨ν„΄/topic/prototype

 

μ½”λ“œ μ˜ˆμ‹œ

protocol Prototype: AnyObject { // ꡳ이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ λœλ‹€..!
  func clone() -> Self
}

class Response: Prototype {
  var data: [Int]

  init(data: [Int]) {
      self.data = data
  }

  func clone() -> Self {
      return Response(data: self.data) as! Self
  }
}

let original = Response(data: [1, 2, 3, 4, 5])

let copy1 = original.clone()
let copy2 = original.clone()
let copy3 = original.clone()

 

 

πŸ“Œ Swiftμ—μ„œμ˜ ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄

 

Swiftμ—μ„œλŠ” κΉŠμ€ 볡사가 κ°€λŠ₯ν•œ κ°’ νƒ€μž… μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” Struct κ°œλ…μ΄ μ‘΄μž¬ν•˜λ―€λ‘œ Swiftμ—μ„œλŠ” ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄μ˜ ν•„μš”μ„±μ΄ 크게 떨어진닀. μΈμŠ€ν„΄μŠ€μ˜ κΉŠμ€ 볡사λ₯Ό μœ„ν•΄μ„œ ν•˜λ‚˜μ˜ νŒ¨ν„΄κΉŒμ§€ λ§Œλ“€μ–΄μ‘Œλ‹€λŠ” 점을 미루어 보아 μ–΄μ©Œλ©΄ Swift에 StructλΌλŠ” κ°œλ…μ„ λ„μž…ν•œ 이유 쀑 ν•˜λ‚˜κ°€ λ˜μ§€ μ•Šμ•˜μ„κΉŒλΌλŠ” 사견을 μ‘°μ‹¬μŠ€λŸ½κ²Œ λΆ™ν˜€λ³Έλ‹€ πŸ‘€

λŒ“κΈ€